ServletOutputStream output = response.getOutputStream();
output.write(byte[]);
ファイルをjavax.servlet.ServletOutputStreamに書き込む最も効果的な方法は何ですか?
編集:
nIOを使用した場合、これはより効果的ではありませんか?
IOUtils.copy(in, out);
out.flush();
//...........
out.close(); // depends on your application
ここで、in
は FileInputStream であり、out
はSocketOutputStream
です。 IOUtils は、 Commons IO モジュールの Apache Commons からのユーティリティです。
ServletOutputStreamがあります。これに書き込むことができる唯一の方法は、Java.io。*経由です。その上でNIOを使用することはできません(Channels
でラップする以外は無意味です。それはまだOutputStream
であり、上に処理を追加しているだけです)。実際のI/Oはネットワークにバインドされており、書き込みはサーブレットコンテナー(Content-Lengthを設定できるようにするため)ヘッダーによってバッファリングされるため、ここでパフォーマンスの微調整を探しても意味がありません。
まず、これはサーブレットとは無関係です。これは、Java IO一般に当てはまります。結局のところ、InputStream
とOutputStream
だけです。
答えについては、これについて疑問に思ったのはあなただけではありません。インターウェブ上で、同じことについて疑問に思ったが、自分でテスト/ベンチマークするために努力した人を見つけることができます:
一般的に、 FileChannel
は、ラップされた ByteBuffer
で、バイト配列から直接書き込むのが最も速い方法です。確かに、NIO。
FileInputStream input = new FileInputStream("/path/to/file.ext");
FileChannel channel = input.getChannel();
byte[] buffer = new byte[256 * 1024];
ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
try {
for (int length = 0; (length = channel.read(byteBuffer)) != -1;) {
System.out.write(buffer, 0, length);
byteBuffer.clear();
}
} finally {
input.close();
}