2016-12-03 6 views
2

したがって、サーバーに接続して約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); 
    } 
} 
+0

? – ntahoang

+0

.close()メソッドはスレッドをブロックし、すべての2GBが読み込まれるまで受信しますが、入力ストリームをクリアするだけのバイトを転送しません –

+0

おそらく、.close()は原因ではなく周囲のコードです。 InputStreamの実際の実装は何ですか?あなたはいくつかの追加コードを投稿できますか? – ntahoang

答えて

0

のApache HttpClientをの基本的な実装では2メガバイトの応答を維持するためのContentLengthInputStreamを使用しています。 ContentLengthInputStreamで説明したように、.close()メソッドはストリームを実際に閉じることはありませんが、Content-Lengthに達するまで残りのバイトをすべて読み取ります。

策:代わりにres.getEntity().getContent().close()を呼び出す、してみてくださいres.close()か、.close()を呼び出したときにすべてのデータの2Gbがtranferedされるまでので、スレッドがブロックされているreq.abort()

+0

'res.close()'は問題を解決しました。ありがとう –

関連する問題