Сервлет Java NIO в файл

Есть ли способ (без буферизации всего потока ввода) взять HttpServletRequest из сервлета Java и записать его в файл, используя все NIO? Стоит ли вообще пытаться? Будет ли это более быстрое чтение из обычного потока java.io и запись в канал java.nio, или они оба действительно должны быть чистыми NIO, чтобы увидеть преимущество? Спасибо.

РЕДАКТИРОВАТЬ:

Поэтому я просто сделал быстрый и грязный тест, прочитав файл с одного диска и записав его на другой диск (поэтому я на самом деле тестирую код, а не диск).

Averages:
InputStream -> OutputStream : 321 ms.
FileChannel -> FileChannel  :   3 ms.
InputStream -> FileChannel  : 600 ms.

На самом деле я ухудшил производительность, пытаясь использовать гибрид java.io -> java.nio. nio->nio был НАМНОГО быстрее, но я застрял с Servlet InputStream.


person Gandalf    schedule 17.06.2010    source источник


Ответы (4)


Основное преимущество чистого решения NIO заключается в том, что вы можете избежать копирования данных из ядра в пользователя и обратно в пространство ядра. Когда вы используете операцию transferTo() или transferFrom(), этих накладных расходов можно избежать, а передача между каналами может быть очень быстрой (в зависимости от базовой реализации).

Однако API сервлетов не позволяет вам получить доступ к источнику Channel; к тому времени, когда ваш сервлет увидит данные, они уже находятся в пользовательском пространстве. Так что я бы не ожидал прироста производительности от записи на Channel.

person erickson    schedule 17.06.2010

HttpServletRequest дает вам обычный входной поток "pull" - не вижу, как здесь поможет использование NIO.

person mdma    schedule 17.06.2010
comment
У меня было такое чувство, за исключением того, что FileChannel может использовать DMA для записи потока на диск, что может повысить производительность. - person Gandalf; 17.06.2010

вы не можете серьезно сравнивать производительность с тестами длиной в миллисекунды.

диски не будут вращаться быстрее из-за выбора API. то, что произошло в FileChannel->FileChannel, вероятно, связано с тем, что вызов вернулся до того, как записи были фактически зафиксированы на диске.

nio может немного сократить использование процессора/памяти. но не очень в вашей ситуации. для сохранения файлов, загруженных пользователями, обычно в формате multipart/form-data, и сервер должен читать поток побайтно, чтобы анализировать ввод и извлекать содержимое файла, он не может просто напрямую сбрасывать необработанный поток в файл.

person irreputable    schedule 17.06.2010

Я думаю, вы зря беспокоитесь. Средняя скорость сети (~ 1 МБ/с) не может догнать среднюю скорость жесткого диска (~ 100 МБ/с) (даже при самых оптимистичных средних). Файловые каналы не дадут вам никаких преимуществ. «Наследия» java.io более чем достаточно.

person BalusC    schedule 17.06.2010