Po pierwsze, nie ma to związku z serwletami. Dotyczy to ogólnie Java IO. Masz przecież tylko InputStream
i OutputStream
.
Jeśli chodzi o odpowiedź, nie jesteś jedynym, który się nad tym zastanawia. Na interwebs można znaleźć innych, którzy zastanawiali się takie same, ale miały starań, aby przetestować/benchmark to sami:
Ogólnie FileChannel
z tablicy 256K bajtów który jest odczytywany przez owinięte ByteBuffer
i zapisany bezpośrednio z tablicy bajtów jest najszybszym sposobem. Rzeczywiście, 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();
}
nio nie jest magiczną kulą, która sprawia, że wszystko dzieje się szybciej. w rzeczywistości nio jest generalnie przydatne, jeśli chcesz, aby Twój kod był bardziej skalowalny (np. mniej wątków obsługuje więcej połączeń). w przypadku kodu z pojedynczym gwintem, io jest prawie zawsze tak dobre lub lepsze (wyjątkiem od tej reguły może być przesyłanie plików do pliku). – jtahlborn