人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

とやってもダメでした。

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

●質問者: nacookan
●カテゴリ:コンピュータ
✍キーワード:Java Out Write アップロード アプレット
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● t_shiono
●35ポイント

確認してませんが、

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)


2 ● mass3
●35ポイント

"in" は BufferedInputStream なんですね。

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ