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

来源:4-3 字节流之文件输出流FileOutputStream

壮丹田

2017-01-09 16:52

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();//最好加上




写回答 关注

3回答

  • KeT
    2017-01-09 19:50:18
    已采纳

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

    望采纳,谢谢。

    壮丹田

    非常感谢!

    2017-05-21 17:46:56

    共 4 条回复 >

  • KeT
    2017-01-21 10:44:39

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

     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;

        }


  • 壮丹田
    2017-01-09 17:00:54

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

    灬诺诺

    while是为了避免读取文件为空或文件太大一次读取不完

    2017-02-26 12:57:11

    共 2 条回复 >

文件传输基础——Java IO流

为您介绍IO流的使用,以及对象的序列化和反序列化的内容

133755 学习 · 1030 问题

查看课程

相似问题