2

我试图从 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();

我的问题是:

available方法将立即找到可用的最大长度,然后read可以调用该方法将其打印出来。这应该在一次调用中完成,为什么作者要while循环执行它,不断检查可用性?

4

1 回答 1

5

available() 的 javadoc

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

流可能会阻塞,直到您读取其中的一部分。因此,您必须每次只阅读可用的内容。调用 后read,流将被解除阻塞。

因此,在下一次迭代中仍有可用字节,除非到达文件末尾。如read() 的 javadoc所述,此时result为 -1 :

退货

读入缓冲区的总字节数,如果由于已到达文件末尾而没有更多数据,则为 -1。

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

于 2013-01-09T20:13:37.103 回答