1行のテキストをファイルに書き込み、ユーザーがリターンを押すまで待ってから別の行を書き込んで終了するWriterプログラムがあります。その後、ファイルは閉じられます。コード:
public class Writer {
Writer() {
}
public static String[] strings =
{
"Hello World",
"Goodbye World"
};
public static void main(String[] args)
throws java.io.IOException {
java.io.FileOutputStream pw =
new java.io.FileOutputStream("myfile.txt");
for(String s : strings) {
pw.write(s.getBytes());
System.in.read();
}
pw.close();
}
}
最初に次から始めます。
Javaライター
次に、ファイルの書き込みがまだ完了していない限り (つまり、pw.close() がまだ呼び出されていない場合)、ブロックする必要があるリーダー プログラムもあります。コード:
public class ReaderFIS extends Object {
ReaderFIS() {
}
public static void main(String[] args) throws Exception {
java.io.FileInputStream in = new java.io.FileInputStream("myfile.txt");
int ch = -1;
while((ch = in.read()) >= 0) {
System.out.println("ch = " + ch);
}
System.out.println("Last ch = " + ch);
System.out.println("exiting");
}
}
皮切りに:
Java ReaderFIS
Javadocドキュメントのこれに基づいて、最初の「Hello World」テキストを読み取った後、 read() がブロックされると予想しました。
この入力ストリームから 1 バイトのデータを読み取ります。入力がまだ利用できない場合、このメソッドはブロックします。経由: http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read()
しかし、ReaderFIS は "Hello World" を読み取った直後に実行され、明らかに EOF が表示されます。だからブロックしない!文字値をダンプし、次に -1 をダンプしてから、「exiting」を出力します。
出力: ch = 72 ch = 101 ch = 108 ch = 108 ch = 111 ch = 32 ch = 87 ch = 111 ch = 114 ch = 108 ch = 100 最後の ch = -1 終了
私が試した他のバリエーションは次のとおりです。ライターでファイルを開いたままにしておくだけで、何も書き込まずに、各書き込みの間に 500 ミリ秒の一時停止を伴うファイル。
これらのバリエーションのいずれも、ReaderFIS プログラムをブロックする原因にはならず、常に終了します。
リーダー プログラムがブロックしないのはなぜですか? 非常に明白な何かを見逃しましたか?ReaderFIS プログラムが EOF (-1) を見つけたようですが、なぜですか? ファイルは Writer プログラムによってまだ閉じられていません。
「面白い」追記: System.in.read() がブロックしている! (そして、ユーザーが Enter を押すのを待っています)。
PS: Windows XP と Suse Linux でこれを試しました。Windows では、ライターの実行中にファイルを削除できません (予想どおりです)。
よろしく、マルコ