Javaアプレットからファイルをアップロードするため、以下のコードを書きました。


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();
}

とやってもダメでした。

いちいちメモリ上にデータをバッファする必要はなく、そのままどんどんアップロード先に
データを送信してしまって構わないのですが、どのように書けばいいのでしょうか。

回答の条件
  • 1人2回まで
  • 登録:2007/11/30 17:53:27
  • 終了:2007/12/07 17:55:04

回答(2件)

id:t_shiono No.1

t_shiono回答回数256ベストアンサー獲得回数222007/11/30 19:21:58

ポイント35pt

確認してませんが、

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)

id:mass3 No.2

mass3回答回数118ベストアンサー獲得回数152007/12/01 10:35:08

ポイント35pt

"in" は BufferedInputStream なんですね。

BufferedInputStreamでラッピング前のFileInputStreamのreadメソッドで1バイトずつちょろちょろ読み出して書き出したらどうでしょう?

これでうまくいくようなら(このままだと性能が悪いので)もう一度BufferedInputStreamを使うようにしてコンストラクタの第2引数でバッファサイズを指定してみてください。いくつからはじめたらいいかわかりませんが、小さな数字から始めてだんだん大きくしてみます。

BufferedInputStreamを使わなくても性能上問題ないようなら無理に使う必要は無いです。回線のほうが遅いとかでそういう状況もあるでしょう。

  • id:nacookan
    検証に時間がかかり、質問が自動終了してしまいました。教えていただいた内容も含めて頑張った結果、なんとか解決しました。ここにトラックバックしておきます。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません