FileInputStream是如何在Java中使用的

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循环中执行它,连续检查可用性?

Den*_*ret 5

available()javadoc:

返回可以从此输入流中读取(或跳过)的剩余字节数的估计值,而不会被下一次调用此输入流的方法阻塞.下一次调用可能是同一个线程或另一个线程.单个读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节.

流可能会阻塞,直到您阅读其中的一部分.因此,您必须只读取每次可用的内容.拨打电话后read,流将被解锁.

因此,除了到达文件末尾之外,下一次迭代时仍有可用的字节.在这一点result是-1,如read()的javadoc所述:

返回

读入缓冲区的总字节数,如果由于文件末尾已到达而没有其他数据,则返回-1.

请注意,您通常不会阅读所有可用内容,因为您希望使用合理大小的缓冲区(并重复使用它们).在这种情况下nMath.min(BUFFER_SIZE, fix.available()).