0

次のコードで。ファイルを小さなバッファー ( l​​en=CHUNK_SIZE) に読み込んでいます。このバッファーを出力ストリームに書き込みたいだけです。しかし、すべてのチャンクの後にフラッシュしているにもかかわらず、ヒープ オーバーフロー例外が発生します。小さなファイルをストリーミングしたい場合は、すべて問題ありません。しかし、フラッシュはストリーム内のすべてのデータも削除すべきではありませんか?

URL url = new URL(built);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setDoOutput(true);
con.setDoInput(true);
con.setUseCaches(false);
//con.setChunkedStreamingMode(CHUNK_SIZE);
con.setRequestProperty("Content-Type", "multipart/form-data; boundary="
                                + Boundary);

FileInputStream is = new FileInputStream(m_FileList.get(i));
DataOutputStream os = new DataOutputStream(con.getOutputStream());

 // .....

 while((read = is.read(temp, 0, CHUNK_SIZE)) != -1) {
      bytesTotal += read;

      os.write(temp, 0, read); // heap overflow here if the file is to big
      os.flush();                             
 }
4

1 に答える 1

3

DataOutputStreamはまったくバッファリングしませんが、HttpURLConnectionの出力ストリームはデフォルトですべてをバッファリングするため、Content-Lengthヘッダーを設定できます。それを防ぐには、チャンク転送モードを使用します。

ここでは実際には DataOutputStream はまったく必要ありません。接続の出力ストリームに書き込むだけです。

ループ内でも flush() しないでください。

于 2012-11-18T22:16:58.487 に答える