Discuss / Java / 疑问:利用缓冲区一次性读取多个字节的代码示例中,为什么不会无限循环?

疑问:利用缓冲区一次性读取多个字节的代码示例中,为什么不会无限循环?

Topic source
public void readFile() throws IOException {
    try (InputStream input = new FileInputStream("src/readme.txt")) {
        // 定义1000个字节大小的缓冲区:
        byte[] buffer = new byte[1000];
        int n;
        while ((n = input.read(buffer)) != -1) { // 读取到缓冲区
            System.out.println("read " + n + " bytes.");
        }
    }
}

在上述示例代码中,变量 n 是一个固定的值,如果读取的文件不为空的话,不会等于-1,如此来说就会造成无限循环,可是示例代码却只是打印了一次,为什么呢?

三问麻雀

#2 Created at ... [Delete] [Delete and Lock User]

因为定义了一个1000字节的缓冲区(byte []  buffer =  new byte[1000];),也就是说

input.rade(buffer) 一次会读取1000个字节,而实例代码只打印了一次,那就说明 src/readme.txt的文件大小 <= 1000个字节

如果这样写,会是死循环:

byte[] buffer = new byte[1000];
int n = input.read(buffer);
while (n != -1) {   
  System.out.println("read " + n + " bytes.");
}

在循环里面赋值不会死循环是因为n的值有更新,当文件读取完成后,buffer的存储数量为0,read()方法返回-1。

每次循环都会读取1000字节,并返回存储数量。read()方法会记录读取到的位置,下次循环接着读取,直到读到文件末尾。

不会无限循环,每调用一次

n = input.read(buffer)

n的值就会更新一次,read 也会在接着上一个节点的位置往后读取 buffer.length 个字节上来。如果到文件的末尾了,没有字节可以读取了就返回 -1.

🌙

#5 Created at ... [Delete] [Delete and Lock User]

如果读取的文件不为空的话,不会等于-1,??

read()方法的返回值不再是字节的int值,而是返回实际读取了多少个字节。如果返回-1,表示没有更多的数据了。

读完了就是-1啊~

我这个才是问题?

try (InputStream input2 = new FileInputStream("src/readme.txt")) {
// 定义1000个字节大小的缓冲区:
byte[] buffer = new byte[5];
int n;
while ((n = input2.read(buffer)) != -1) { // 读取到缓冲区
System.out.println("read " + n + " bytes.");
}
}

控制台打印结果:

read 5 bytes.

read 5 bytes.

read 5 bytes.

read 5 bytes.

read 5 bytes.

read 1 bytes.

悟了,每次读取5个字节,读取完毕,返回-1 循环结束?

不过,我好奇的是为什么会输出这么多行,说明,满了返回的也是-1 

那为什么第一次满了.循环没有结束呢?

🌙

#6 Created at ... [Delete] [Delete and Lock User]

成功被带偏了

应该说  input2.read(buffer)) 就是一种循环

🌙

#7 Created at ... [Delete] [Delete and Lock User]

看起来 是 while 循环 用的太少了  网络 循环条件是什么了

🌙

#8 Created at ... [Delete] [Delete and Lock User]

我去   != 出成  == 了  还搁那自圆其说呢...

那就简单了

每次读 5个字节,然后 打印一次 

最后 读完 返回-1 循环结束


  • 1

Reply