老师这里创建字节数组循环读取大文件是不是有bug呢?

来源:4-2 字节流之文件输入流FileInputStream-2

charsandrew

2016-07-19 09:40

http://img.mukewang.com/578d838c0001c01212800720.jpg


我查了下api中这里read的返回值为:读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。

那么如果我有一个数组一次性读不完的文件,比如需要两次读完,那么第一次读完后bytes返回值为1024,然后再while()循环里面打印输出。第二次读完了,并且返回了-1,此时虽然文件读入了数组,但是bytes=-1,不满足循环条件,循环里面就没执行,就没有打印输出啊!

  是这样的吗?还是我理解错了,希望我有把疑惑说清楚。。。

写回答 关注

4回答

  • 慕粉17865160372
    2016-07-19 11:11:45
    已采纳

    不知道。。。

    charsa...

    我弄明白了,具体看我在楼下的回复。。。

    2016-07-19 11:33:11

    共 1 条回复 >

  • 幂函数
    2016-07-23 15:36:49

    厉害~~~

  • charsandrew
    2016-07-19 11:29:50

    然后我写代码去试验了一下,结果是全部都能输出到控制台。然后我就去看read()的源代码了,发现api中的解释有点误导人。实际情况是,在读第二次的476个字节时,如果读到文件结束,下一个字节为空,会先返回476,然后再次读取,这次直接返回-1。

    看下read()的源代码就很清楚了,源码其实写的很简单。

  • charsandrew
    2016-07-19 11:25:25

    哈哈,这个问题还是我自己来解答吧。

    我之前的疑问是:比如我要读取一个1500字节的文件,并把它输出到控制台,我定义一个1024字节数组来缓存读取,第一次读1024个字节,返回的是1024;然后将1024字节输出到控制台。然后循环读取,再读剩下的476个字节,因为读完了,返回的是-1,虽然将476个字节读进了数组,但不满足while的执行条件,所以剩下的476个字节是不会输出到控制台的。

文件传输基础——Java IO流

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

133754 学习 · 1030 问题

查看课程

相似问题