5

この質問は、次の 2 つの質問に似ています。

しかし、私はまだそれを完全に理解することはできません。

これまでのところ、空のファイル「test.txt」が原因で、次のコードのread()メソッドがブロックされると思います。

FileInputStream fis = new FileInputStream("c:/test.txt");
System.out.println(fis.read());
System.out.println("to the end");

実際には-1が出力されます。理由を知りたいです。

javadoc には、入力がまだ利用できない場合、このメソッドはブロックされます

入力がありません」とはどういう意味ですか?

ありがとう。

4

4 に答える 4

5

あなたの質問に対する答えは、JavaDoc for .read() にあります。

入力がまだ利用できない場合、このメソッドはブロックします。

戻り値: データの次のバイト、またはファイルの終わりに達した場合は -1。

したがって、空のファイルを使用すると、 (ブロック-1するのではなく) すぐに取得できます。read()

  • ファイルが存在するため、利用可能な入力があります
  • ...しかし、それは空なので、すぐに EOF になります。

...入力がまだありません... という状況が発生する可能性があります。プレーンファイルの代わりに名前付きパイプから読み取る必要があり、パイプの反対側にはまだ何も書き込まれていない場合。

乾杯、

于 2013-03-05T08:16:04.027 に答える
3

FileInputStream通常のファイル以外からの読み取りに使用できます。明らかな例の1つは、名前付きパイプです。反対側がパイプに書き込む前にパイプから読み取ろうとすると、読み取り操作がブロックされます。

于 2013-03-05T08:21:28.740 に答える
1

これは次のように解釈される可能性があります:FileInputStream.readネイティブ メソッドを呼び出し、ネイティブ メソッドがread システム コールを実行し、OS がバイトをファイルからバッファに読み込むのを待ってブロックし、準備ができたら戻ります。つまり、FileInputStream.readノンブロッキングの非同期 I/O ではなく、同期 I/O を使用してファイルからデータを読み取ります。

于 2013-03-05T08:37:05.803 に答える
1

「入力が利用できません」を「EOF に位置しており、これ以上入力を利用できない」と解釈することはできません。それらは異なる条件です。後者は -1 を返します。

一般に、ファイルからのすべての読み取りは、データが使用可能になるまでブロックされます。ディスクは正しい位置に来なければならず、ヘッドは正しいトラックにシークしなければなりません。また、共有ドライブ上のファイルや名前付きパイプのファイルも考慮する必要があります。これらはどちらもネットワーク操作を伴い、ブロックされる可能性もあります。

于 2013-03-05T08:50:39.777 に答える