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

Существует ли путь (не буферизуя целый Inputstream), чтобы взять 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 был быстрее МНОГО, но я застреваю с Сервлетом InputStream.

7
задан Gandalf 17 June 2010 в 16:51
поделиться

4 ответа

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

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

7
ответ дан 7 December 2019 в 03:11
поделиться

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

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

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

1
ответ дан 7 December 2019 в 03:11
поделиться

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

1
ответ дан 7 December 2019 в 03:11
поделиться

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

0
ответ дан 7 December 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: