2013-03-05 62 views
4

該問題類似於以下兩個問題。什麼時候FileInputStream.read()阻塞?

但我還不能完全理解。

到目前爲止,我認爲在下面的代碼中讀取()方法會因爲空文件'test.txt'而阻塞。

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

其實它會打印-1,我想知道爲什麼。

javadoc說如果還沒有輸入可用,此方法會阻止

'沒有輸入可用'是什麼意思?

謝謝。

回答

4

的回答你的問題可以在JavaDoc for .read()發現:

此方法塊,如果尚無輸入可用。

返回:數據的下一個字節,或-1,如果到達文件的末尾。

所以,一個空文件將讓你(而不是read()攔截)立即-1作爲

  • 輸入可用,因爲該文件存在
  • ...但它是空,所以立即EOF。

...沒有輸入是可用的...情況可能發生,例如,當一個人從一個命名管道而不是一個普通文件讀取時,管道的另一端還沒有寫入任何東西。

乾杯,

+0

'沒有輸入可用'是什麼意思?謝謝。 – 2013-03-05 08:17:52

+0

當從例如一個管道而不是一個文件,直到另一個「邊」寫入管道 - 我們才能使用 - 在這種情況下,.read()會阻塞。 – 2013-03-05 08:23:59

+0

您能否給我一個關於如何從管道讀取的示例?謝謝,因爲我無法在FileInputstream的apis中找到相關函數。 – 2013-03-05 08:41:41

3

FileInputStream可以從使用比普通文件,其他的東西閱讀。一個明顯的例子是named pipe:如果您嘗試在另一方寫入之前從管道中讀取數據,則讀取操作將被阻止。

+0

如何從命名管道讀取?如何編碼?我無法在FileInputStream的源代碼中找到該函數。 – 2013-03-05 08:28:15

+1

@liamxu:你可以像打開其他文件一樣打開它。如果你想了解更多,我建議我已經鏈接到維基百科頁面。 – NPE 2013-03-05 08:29:33

1

這也許interperted如下:FileInputStream.read調用本機方法時,本機方法,使讀系統調用和塊等待OS準備時,從文件中讀取字節到緩衝區並返回。也就是說,FileInputStream.read使用同步I/O從文件讀取數據,而不是非阻塞的異步I/O。

1

您無法解釋'沒有輸入可用',因爲'您位於EOF並且沒有更多輸入可用'。他們是不同的條件。後者返回-1。

一般來說,全部從文件塊讀取,直到數據可用。磁盤必須到達正確的位置,磁頭必須尋求正確的軌道。您還需要考慮共享驅動器上的文件或命名爲管道的文件,這兩個文件都涉及網絡操作,這些操作也可能會阻止。

相關問題