2013-01-09 32 views
2

我在試着從Oreilly的Java IO中瞭解以下代碼片段。它應該從文件中讀取和寫入到控制檯:在Java中如何使用FileInputStream

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方法可以調用打印出來。這應該在一次調用中完成,爲什麼作者在while循環中執行該操作,並持續檢查可用性?

+0

這不是你的問題的答案,但我只是想讓你知道,一般來說,你的文件閱讀代碼不必是這麼低的水平。查看[Apache Commons IOUtils](http://commons.apache.org/io/apidocs/org/apache/commons/io/IOUtils.html)以獲取更高級別的方法,當您準備好使用它們時。 –

+0

好吧,我也會通過他們... – SexyBeast

回答

5

javadoc of available()

返回可以從該輸入流不被下一 調用的方法的此輸入無阻塞讀取 (或跳過)的剩餘字節數的估計值流。下一個調用 可能是同一個線程或另一個線程。單個讀取或跳過 這麼多字節不會被阻塞,但可以讀取或跳過較少的字節。

流可能會阻塞,直到您讀取其中的一部分。所以你必須每次只讀取可用的內容。呼叫read後,該流將被解除封鎖。

所以在下一次迭代中仍然有可用的字節,除非達到文件結尾。在這點result是-1由the javadoc of read()說:

返回

字節讀入緩衝區的總數量,或-1,如果沒有 更多的數據,因爲該文件的末尾有已達到。

請注意,由於要使用合理大小的緩衝區(並重新使用它們),因此通常不會讀取所有可用內容。在這種情況下,n將是Math.min(BUFFER_SIZE, fix.available())

+1

它如何避免加載整個文件?第一次調用'available'應該返回整個文件內容對應的字節數,不是? – SexyBeast

+0

您能否詳細解釋一下這條語句:**流可能會阻塞,直到您閱讀它的一部分。所以你必須每次只讀取可用的內容。在讀取一個呼叫之後,流將被解除阻塞。 所以在下一次迭代中仍然有可用的字節,除非達到文件結尾(此時結果爲-1)。 – SexyBeast

+0

任何將字節複製到字節數組中的讀取操作都必須受到限制。輸入流甚至可以是無限的,而計算機的內存則不是這種情況。 –

相關問題