我有一個Writer程序,它將一行文本寫入文件,然後等待用戶在寫入另一行之前先返回,然後退出。只有在文件關閉之後。代碼:爲什麼FileInputStream的read()沒有被阻塞?
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
現在我預期的read()讀取第一個 「Hello World」 文本後的阻攔,基於此Javadoc文檔:
中讀取數據的從該輸入流的一個字節。如果沒有輸入可用,此方法會阻止。 途經:http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read()
但ReaderFIS正在讀的 「Hello World」,顯然後立即進行看到一個EOF!所以它不是塊!它轉儲字符值,然後是-1,然後打印「退出」。
輸出: CH = 72 CH = 101 CH = 108 CH = 108 CH = 111 CH = 32 CH = 87 CH = 111 CH = 114 CH = 108 CH = 100 最後CH = -1 離開
我試圖進行其它變化:經由getChannel()讀取,通過getChannel()檢查是否它可以是鎖()的,使用可用的(),試圖使用讀()緩衝區,嘗試readLine(),不斷寫入字符在每次寫入之間暫停500毫秒,不寫任何文件,只是在寫入器中保持文件打開。
這些變化都不會導致ReaderFIS程序阻塞,它總是結束。
爲什麼讀者程序不能阻止?我錯過了非常明顯的東西嗎?看來ReaderFIS程序找到EOF(-1),但爲什麼?該文件尚未被Writer程序關閉。
「有趣」的註釋:System.in.read()被阻止! (並等待用戶按Enter鍵)。 PS:在Windows XP和Suse Linux上試用過。在Windows上,我無法在編寫器運行時刪除文件(這是我的預期)。
問候, 馬爾科
當你寫入磁盤時,你強制使用EOF,不是嗎? EOF僅在追加新信息時纔會移動。但是磁盤上的塊必須有一個EOF ... – jcolebrand 2010-09-09 15:10:46
所以你說EOF總是被寫入,因爲一個文件總是需要一個。但我認爲EOF只是在沖洗和關閉文件後才寫完。但這意味着我的read()在讀取文件時永遠不會阻塞,因爲* always * EOF並且即使文件爲空也總是返回-1。那麼JavaDoc不正確? – QQQuestions 2010-09-09 16:29:07