2012-06-04 44 views
0

我期待在實施IOUtils.copy()從Apache的百科全書在http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html並且它最終歸結爲:處理IO中斷的優雅方法是什麼?

public static long copyLarge(InputStream input, OutputStream output) 
     throws IOException { 
    // DEFAULT_BUFFER_SIZE is 4096 
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 
    long count = 0; 
    int n = 0; 
    while (-1 != (n = input.read(buffer))) { 
     output.write(buffer, 0, n); 
     count += n; 
    } 
    return count; 
} 

我在Executor運行此,任務有一個超時等,但如果我理解正確的話,即使超時和Future被取消,線程繼續運行,因爲沒有爲您在這個循環中的任何地方線程狀態。這導致危險的泄漏和飢餓。

好像我需要重寫循環,但什麼是處理這種理智和正確的方法是什麼? throw new IOException(new InterruptedException())?聲明方法拋出InterruptedException並把它(討厭這樣做對我所有的IO輔助方法)?

編輯:我剛纔檢查ByteStreams番石榴,他們似乎在做同樣的事情。現在我想知道爲什麼兩個主要的圖書館不支持這種循環中的中斷。我錯過了什麼嗎?

+0

真正的答案,這個問題好像是用NIO。它似乎對線程中斷做出了正確的反應。 –

回答

1

如果您關閉input和/或outputcopyLarge方法將拋出異常,退出循環。

+0

謝謝,這是打破自由的一種方式。 –

1

對於任何阻塞I/O(即java.io包),你必須手動檢查並做一些應對之道。

if (Thread.currentThread().isInterrupted()) { 
    // do something here to stop processing 
} 

如果您使用channels(java.nio),則不必這樣做。在其中一個NIO操作期間發生的任何線程中斷都會導致該操作拋出ClosedByInterruptException。

相關問題