http://d.hatena.ne.jp/nacookan/20071109/1194588900
当初はこれで問題なかったのですが、ファイルサイズが大きくなると、
while((buff = in.read()) != -1){
out.write(buff);
}
のout.write(buff)の部分で
java.lang.OutOfMemoryError: Java heap space
になってしまいます。
while((buff = in.read()) != -1){
out.write(buff);
out.flush();
}
とやってもダメでした。
いちいちメモリ上にデータをバッファする必要はなく、そのままどんどんアップロード先に
データを送信してしまって構わないのですが、どのように書けばいいのでしょうか。
確認してませんが、
public void setChunkedStreamingMode(int chunklen)
このメソッドは、コンテンツ長が事前にわからない場合に、内部バッファ処理を行わずに HTTP 要求本体のストリーミングを有効にするために使用します。このモードでは、チャンクされた転送エンコーディングを使用して要求本体が送信されます。すべての HTTP サーバでこのモードがサポートされているわけではないことに留意してください。
出力ストリーミングが有効な場合、認証とリダイレクトを自動的に行うことはできません。認証やリダイレクトが必要な場合、応答を読み取っているときに HttpRetryException がスローされます。この例外について問い合わせることで、エラーの詳細を取得できます。
このメソッドは、URLConnection の接続前に呼び出す必要があります
を指定するとどうなりますか?
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/net/HttpURLCo...(int)
"in" は BufferedInputStream なんですね。
BufferedInputStreamでラッピング前のFileInputStreamのreadメソッドで1バイトずつちょろちょろ読み出して書き出したらどうでしょう?
これでうまくいくようなら(このままだと性能が悪いので)もう一度BufferedInputStreamを使うようにしてコンストラクタの第2引数でバッファサイズを指定してみてください。いくつからはじめたらいいかわかりませんが、小さな数字から始めてだんだん大きくしてみます。
BufferedInputStreamを使わなくても性能上問題ないようなら無理に使う必要は無いです。回線のほうが遅いとかでそういう状況もあるでしょう。
コメント(1件)