したがって、サーバーに接続して約2GBのコンテンツを2MBのチャンクでダウンロードするコードがあります。これはすべてスレッドで行われます。スレッドを停止する必要がある場合があります。なぜなら、メインスレッドで異なるエラーが発生したか、アプリケーションを終了したいからです。私の問題は、私が接続のInputStreamを閉じることができないことです。私がclose()
メソッドを呼び出すたびに、InputStreamはサーバーによって送信される2GBの全体を消費します。 サーバーによって送信されるコンテンツ全体を消費せずにInputStreamを閉じる方法はありますか?close()メソッドのないJava割り込み入力ストリーム
fos.getChannel().transferFrom(Channels.newChannel(res.getEntity().getContent()), bytes_read, CHUNK_SIZE);
res.getEntity().getContent().close();
res.getEntity().getContent()
は、接続から作成されたInputStreamを返します。
res
はapache httpResponseです。
fos
は、応答内容を保存するFileOutputStreamです。
編集:スレッドの実行方法
CHUNK_SIZE:INT:バイト
@Override
public void run() {
int expectedCode;
do{
try {
client = HttpClients.createDefault();
HttpGet req = new HttpGet(url.toString());
HttpResponse res = client.execute(req);
if (res.getStatusLine().getStatusCode() == 200) {
while(running){
fos.getChannel().transferFrom(Channels.newChannel(res.getEntity().getContent()), bytes_read, CHUNK_SIZE);
}
} else {
log.error(Languages.getString("Download.2") + expectedCode); //$NON-NLS-1$
}
} catch (Exception ex) {
log.error(ex);
} finally{
try{
rbc.close();
} catch(Exception ex){
log.error(ex);
}
}
}while(!isFinished() && running);
try{
rbc.close();
fos.close();
client.close();
} catch(Exception ex){
log.error(ex);
}
}
? – ntahoang
.close()メソッドはスレッドをブロックし、すべての2GBが読み込まれるまで受信しますが、入力ストリームをクリアするだけのバイトを転送しません –
おそらく、.close()は原因ではなく周囲のコードです。 InputStreamの実際の実装は何ですか?あなたはいくつかの追加コードを投稿できますか? – ntahoang