疑问:利用缓冲区一次性读取多个字节的代码示例中,为什么不会无限循环?
Topic source因为定义了一个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.
如果读取的文件不为空的话,不会等于-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
那为什么第一次满了.循环没有结束呢?
- 1
super阳光的麦穗77
在上述示例代码中,变量 n 是一个固定的值,如果读取的文件不为空的话,不会等于-1,如此来说就会造成无限循环,可是示例代码却只是打印了一次,为什么呢?