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印刷するためにメソッドを呼び出すことができます。これは 1 回の呼び出しで実行する必要がありますが、作成者がwhileループで実行し、可用性を継続的にチェックするのはなぜですか?

4

1 に答える 1

5

available()の javadoc から:

この入力ストリームのメソッドの次の呼び出しによってブロックされることなく、この入力ストリームから読み取る (またはスキップする) ことができる残りのバイト数の見積もりを返します。次の呼び出しは、同じスレッドまたは別のスレッドである可能性があります。このバイト数の 1 回の読み取りまたはスキップはブロックされませんが、より少ないバイト数の読み取りまたはスキップが行われる可能性があります。

ストリームの一部を読み取るまで、ストリームがブロックされる場合があります。したがって、毎回利用可能なものだけを読む必要があります。を呼び出した後read、ストリームはブロック解除されます。

そのため、ファイルの終わりに達した場合を除いて、次の反復ではまだ使用可能なバイトがあります。read() の javadoc で述べられているように、この時点resultで -1です。

戻り値

バッファに読み込まれた合計バイト数。ファイルの終わりに達したためにデータがなくなった場合は -1。

適切なサイズのバッファを使用したい (そしてそれらを再利用したい) ため、利用可能なものをすべて読み取らないことが非常に多いことに注意してください。そのような場合nMath.min(BUFFER_SIZE, fix.available()).

于 2013-01-09T20:13:37.103 に答える