为了账号安全,请及时绑定邮箱和手机立即绑定

4.3中的Copy方法下为什么要有while?

while(((b=in.read(buf,0,buf.length))!=-1))

{

out.write(buf,0,b);

}

++++++++++++++

能不能像下面这样》

b=in.read(buf,0,buf.length);

out.write(buf,0,b);

out.flush();//最好加上




正在回答

4 回答

这个while循环就是为了读取完要读取的东西。同时也像你说的为了防止它为空。而且,按照正常情况,buf是字节数组,应该是1024字节的倍数吧,有时候一次读不完,所以用个while循环来判定。

望采纳,谢谢。

1 回复 有任何疑惑可以回复我~
#1

谜之米

那如果一次文件没读完。第二次不就会读到重复的吗?或者in.read会自动将未读的放入buf?
2017-01-16 回复 有任何疑惑可以回复我~
#2

KeT 回复 谜之米

如你所想,底层确实写好了。你想想如果没写好的话,如果照着你之前的思路,不就是会一直重复读取,死循环了嘛。
2017-01-19 回复 有任何疑惑可以回复我~
#3

谜之米 回复 KeT

对啊。是实现了 但是我不知道为什么啊 第一次循环过后不会覆盖 原理是什么 是read有判断机制还是什么 ?老师也没讲清楚啊,所以我要问啊。。
2017-01-20 回复 有任何疑惑可以回复我~
#4

壮丹田 提问者

非常感谢!
2017-05-21 回复 有任何疑惑可以回复我~
查看1条回复

这是底层实现代码,我把主要的注释写出来了。自己看着来,不清楚就再探究下。

 public synchronized int read(byte b[], int off, int len)

        throws IOException

    {

        getBufIfOpen(); // Check for closed stream

        if ((off | len | (off + len) | (b.length - (off + len))) < 0) {

            throw new IndexOutOfBoundsException();

        } else if (len == 0) {

            return 0;

        }


        int n = 0;

        for (;;) {

            int nread = read1(b, off + n, len - n);    //关键,调用read1,达到不重复读的目的

            if (nread <= 0)

                return (n == 0) ? nread : n;

            n += nread;

            if (n >= len)

                return n;

            // if not closed but no bytes available, return

            InputStream input = in;

            if (input != null && input.available() <= 0)

                return n;

        }

    }

private int read1(byte[] b, int off, int len) throws IOException {

        int avail = count - pos;

        if (avail <= 0) {

            /* If the requested length is at least as large as the buffer, and

               if there is no mark/reset activity, do not bother to copy the

               bytes into the local buffer.  In this way buffered streams will

               cascade harmlessly. */

            if (len >= getBufIfOpen().length && markpos < 0) {

                return getInIfOpen().read(b, off, len);

            }

            fill();

            avail = count - pos;

            if (avail <= 0) return -1;

        }

        int cnt = (avail < len) ? avail : len;

        System.arraycopy(getBufIfOpen(), pos, b, off, cnt);        //读取范围,pos变量是关键

        pos += cnt;                                        //关键所在,pos变量是成员变量,会被记录,这也是为什么不会重复读

        return cnt;

    }


0 回复 有任何疑惑可以回复我~

我的意思是既然out.write(buf,0,b);已经把数据都写进去了,为什么之前还要有while?

0 回复 有任何疑惑可以回复我~
#1

壮丹田 提问者

是为了防止srcFile是空的吗?不是空的,才输入?
2017-01-09 回复 有任何疑惑可以回复我~
#2

灬诺诺

while是为了避免读取文件为空或文件太大一次读取不完
2017-02-26 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

4.3中的Copy方法下为什么要有while?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信