web-dev-qa-db-ja.com

ファイルをServletOutputStreamに書き込む最も効果的な方法

ServletOutputStream output = response.getOutputStream();
output.write(byte[]);

ファイルをjavax.servlet.ServletOutputStreamに書き込む最も効果的な方法は何ですか?

編集:

nIOを使用した場合、これはより効果的ではありませんか?

15
IAdapter
IOUtils.copy(in, out);
out.flush();
//...........
out.close(); // depends on your application

ここで、inFileInputStream であり、outSocketOutputStreamです。 IOUtils は、 Commons IO モジュールの Apache Commons からのユーティリティです。

34
AlexR

ServletOutputStreamがあります。これに書き込むことができる唯一の方法は、Java.io。*経由です。その上でNIOを使用することはできません(Channelsでラップする以外は無意味です。それはまだOutputStreamであり、上に処理を追加しているだけです)。実際のI/Oはネットワークにバインドされており、書き込みはサーブレットコンテナー(Content-Lengthを設定できるようにするため)ヘッダーによってバッファリングされるため、ここでパフォーマンスの微調整を探しても意味がありません。

5
user207421

まず、これはサーブレットとは無関係です。これは、Java IO一般に当てはまります。結局のところ、InputStreamOutputStreamだけです。

答えについては、これについて疑問に思ったのはあなただけではありません。インターウェブ上で、同じことについて疑問に思ったが、自分でテスト/ベンチマークするために努力した人を見つけることができます:

一般的に、 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();
}
3
BalusC