2017-08-07 9 views
0

この標準コードを使用していますが、メモリが不足しています。 GoogleグーバのBytestream.toArrayとIOUtils.toByteArrayを試しましたが、運はありません。目的は、入力ストリームをさらに処理するために、大きなバイナリの入力ストリームの長さを取得することです。また、ファイルシステムを使用するという制約があります。大きな入力ストリームのJavaサイズがメモリ不足の場合

byte[] data = new byte[4096]; 
while ((nRead = is.read(data, 0, data.length)) != -1) { 
    buffer.write(data, 0, nRead); 
} 
+2

メモリに大量のデータを保存する予定がある場合(通常はお勧めできません)、大量のメモリが必要です。 JVMにもっと多くのメモリを与えるか、スマートな設計を考えてください。 – Kayaman

+0

私はそのスマートなデザインを探しています:-)。 1つの選択肢は、入力ストリームをファイルシステムに保存することでしたが、残念ながらこのオプションは使用できません。私は入力ストリームの長さを計算し、その入力ストリームで特定のアクションを実行する必要があるという制約があります。 – Gopal

+0

あなたの唯一の目標が全体のサイズを見つけることであるならば、なぜあなたは全体のことを記憶に残していますか?後で使うためにあなたが書いたデータをバッファに保存していますか? – litelite

答えて

1

ファイルを読み込むことはオプションではありません、それはマルチパートリクエストから来ている場合は、content-lengthヘッダーを使用して試みることができます。

もう1つの方法は、クライアントにファイルのファイルサイズを指定してメモリにロードする必要がないようにすることです。これは、APIクライアントが信頼できる場合にのみ意味があることに注意してください。

+0

content-dispositionヘッダーは、別のスタックオーバーフローポストhttps://stackoverflow.com/a/11317380/4374481に記載されているオプションです – Palamino

関連する問題