Сервлет Java NIO в файл - PullRequest
       34

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

7 голосов
/ 17 июня 2010

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

EDIT:

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

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

Я на самом деле ухудшил производительность, пытаясь использовать гибрид java.io -> java.nio. NOT-> NIO был быстрее на много, но я застрял с Servlet InputStream.

Ответы [ 4 ]

7 голосов
/ 17 июня 2010

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

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

1 голос
/ 17 июня 2010

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

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

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

1 голос
/ 17 июня 2010

HttpServletRequest дает вам регулярный поток ввода данных - не смотрите, как использование NIO поможет здесь.

0 голосов
/ 17 июня 2010

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

...