2011-02-14 56 views
0

當從InputStream中讀取數據時,是否有一種方法可以在讀取達到一定大小時取消讀取,並安全地忽略流的其餘部分以確保資源完全釋放?如何安全取消InputStream讀取?

到目前爲止,我剛剛完成閱讀,但理想情況下,我想停止閱讀並繼續前進。我如何安全地做到這一點?

這是我到目前爲止有:

ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 

int nRead; 
byte[] byteData = new byte[16384]; 

while ((nRead = inputStream.read(byteData, 0, byteData.length)) != -1){ 

    if(buffer.size() <= MAX_FILE_SIZE){ 
     buffer.write(byteData, 0, nRead); 
    } 

} 

if(buffer.size() <= MAX_FILE_SIZE){ 
    buffer.flush(); 
    mData = buffer.toByteArray(); 
} 

inputStream.close(); 

感謝

回答

4

調用close()做你想要的關於JVM及其資源。

但是,在某些情況下,它可能會產生不良影響。例如,如果輸入流(最終)是套接字流,則關閉該流將關閉套接字,並且可能導致正在發送數據的遠程服務器查看網絡錯誤。 (這可能並不重要,但如果沒有處理乾淨,你可能會看到在一個遠程Web服務器的日誌文件例外。)


即使是在被讀取並沒有按中間」完成?

是的。任何「在飛行中」的數據將被丟棄

  • 通過關閉其套接字句柄,該應用程序隱含地說,它不再對數據感興趣。
  • 在正常情況下,,沒有其他東西具有允許它讀取數據的套接字句柄。
  • 無法重新連接到套接字。這在套接字API中不受支持......在操作系統級別。
  • 因此,「保持」數據沒有意義。

(如果我們是在談論一個套接字流,然後在遠程服務器可能會一個異常,如果它試圖關閉傳播後,更多的數據寫入套接字。但即使出現這種情況,遠程服務器沒有辦法知道這個端點在連接上「拔出插頭」之前實際讀取了多少數據。)

另外,緩衝區是否需要以某種方式取消或關閉。

由於它是ByteArrayOutputStream,從/寫入內存緩衝區(字節數組,StringBuffers)的流不需要關閉。 GC可以毫無問題地回收純粹的內存資源。 BufferedInput/OutputStream也不需要關閉如果它包裹的流不需要關閉。


1 - 我認爲這是可能的的Linux/Unix打開一個套接字,並把它傳遞給一個派生的子進程。但是,父進程和子進程都使用套接字是不切實際的,因爲協調它們的使用是非常困難的。而且,你不能在Java進程之間做這種事情,因爲API不允許這樣做。

2 - 唯一假想情況下這是不正確時所述緩衝液是NIO Buffer通過共享存儲器段或存儲器映射文件備份...其中垃圾收集器可能無法回收及時。我說假設是因爲我認爲NIO Buffer對象沒有現成的流封裝。

+0

非常有幫助,謝謝。 – cottonBallPaws 2011-02-14 09:12:41

1

close()是安全的,不會釋放資源:http://download.oracle.com/javase/6/docs/api/java/io/InputStream.html#close%28%29

這是所有你需要在爲此做。它釋放所有的JVM資源。如果它與套接字關聯,則此套接字將被關閉。操作系統(IOW傳輸層)將簡單地丟棄所有緩衝區,即將到來的數據包等。連接的另一端(發送者)可能會看到一個錯誤,但是應該爲它做好準備。

+0

即使它正在閱讀,並沒有完成?這真的是我的問題,是否需要在close關閉之前完成閱讀。此外,緩衝區是否需要以某種方式取消或關閉?謝謝 – cottonBallPaws 2011-02-14 08:37:32