私は独自の個人用HTTPサーバーをJavaからゼロから作成しました。 これまではうまくいっていますが、大きな欠陥が1つあります。 大きなファイルをブラウザに渡そうとすると、Javaヒープスペースエラーが発生します。私はJVMを介してこのエラーを修正する方法を知っていますが、私はこれのための長期的な解決策を探しています。JAVA:すべてのファイルをブラウザに正しくストリームします。
//declare an integer for the byte length of the file
int length = (int) f.length();
//start the fileinput stream.
FileInputStream fis = new FileInputStream(f);
//byte array with the length of the file
byte[] bytes = new byte[length];
//write the file until the bytes is empty.
while ((length = fis.read(bytes)) != -1){
write(bytes, 0, length);
}
flush();
//close the file input stream
fis.close();
この方法では、が正常にと完全にそれをストリームが、私は、ファイルの長さのバイト配列を作成していますので、問題は、あるブラウザにファイルを送信します。ファイルが非常に大きくなると、ヒープスペースエラーが発生します。
私はを持っています。この問題は以下のようにバッファを使用することで解消されました。ヒープスペースエラーはもう発生しません。 BUT以下に示す方法では、ブラウザのファイルが正しくストリームされません。これは、ファイルバイトがシャッフルされ、ブラウザに一緒に送信されているかのようです。
final int bufferSize = 4096;
byte buffer[] = new byte[bufferSize];
FileInputStream fis = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(fis);
while (true)
{
int length = bis.read(buffer, 0, bufferSize);
if (length < 0) break;
write(buffer, 0, length);
}
flush();
bis.close();
fis.close();
注1:
すべて正しいレスポンスヘッダがブラウザに完全に送信されています。
注2:
どちらの方法が完全にコンピュータブラウザ上を仕事だけ最初の方法は、スマートフォンのブラウザ上で動作します(時にはそれは私にヒープ領域のエラーを与えます)。 誰かがブラウザにファイルを正しく送信して正しくストリームする方法を知っていれば、私は非常に幸せな人になるでしょう。
ありがとうございます!私はそれを見ることができるように:)
あなたは 'Content-Length'ヘッダーを送信しているようには見えず、' Content-Type'も表示されません。ヘッダーはHTTPにとってかなり重要です。 –
ああ、私はそれを私の質問に追加するのを忘れてしまった。応答ヘッダーが正しく送信されています。 –
Apacheコモンズを使用していますか?もしそうなら、 'IOUtils.copy(inputStream、outputStream);'を試すことができます。 – nickb