Sex*_*ast 2 java io fileinputstream
我试图理解Oreilly的Java IO中的以下代码.它应该从文件中读取并将其写入控制台:
try {
FileInputStream fis = new FileInputStream("README.TXT");
int n;
while ((n = fis.available()) > 0) {
byte[] b = new byte[n];
int result = fis.read(b);
if (result == -1) break;
String s = new String(b);
System.out.print(s);
} // End while
} // End try
catch (IOException e) {System.err.println(e);}
System.out.println();
Run Code Online (Sandbox Code Playgroud)
我的问题是:
该available方法将立即找到可用的最大长度,然后read可以调用该方法将其打印出来.这应该在一个调用中完成,为什么作者在while循环中执行它,连续检查可用性?
返回可以从此输入流中读取(或跳过)的剩余字节数的估计值,而不会被下一次调用此输入流的方法阻塞.下一次调用可能是同一个线程或另一个线程.单个读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节.
流可能会阻塞,直到您阅读其中的一部分.因此,您必须只读取每次可用的内容.拨打电话后read,流将被解锁.
因此,除了到达文件末尾之外,下一次迭代时仍有可用的字节.在这一点result是-1,如read()的javadoc所述:
返回
读入缓冲区的总字节数,如果由于文件末尾已到达而没有其他数据,则返回-1.
请注意,您通常不会阅读所有可用内容,因为您希望使用合理大小的缓冲区(并重复使用它们).在这种情况下n会Math.min(BUFFER_SIZE, fix.available()).