http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.htmlIOUtils.copy()
でApacheCommonsからの実装を検討していますが、最終的には次のようになります。
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
しました、そして彼らは同じことをしているようです。今、私は2つの主要なライブラリがそのようなループでの中断をサポートしていないのはなぜだろうと思っています。私は何かが足りないのですか?