Существует ли путь (не буферизуя целый 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.
Основное преимущество чистого решения NIO в том, что вы можете избежать копирования данных из ядра в пространство пользователя и обратно в пространство ядра. Когда вы используете transferTo()
или transferFrom()
, этих накладных расходов можно избежать, и передача данных между каналами может быть очень быстрой (в зависимости от базовой реализации).
Однако API сервлетов не позволяет вам получить доступ к исходному каналу
; к тому времени, когда ваш сервлет видит данные, они находятся в пространстве пользователя. Поэтому я бы не ожидал прироста производительности от записи в Channel
.
вы не можете всерьез сравнивать производительность с помощью тестов длительностью в миллисекунды.
диски не будут вращаться быстрее из-за выбора API. то, что произошло в FileChannel->FileChannel, вероятно, что вызов вернулся до того, как запись действительно зафиксировалась на диске.
nio
может сэкономить немного процессора/памяти. но не много в вашей ситуации. для сохранения файлов, загруженных пользователями, обычно они в формате multipart/form-data, и сервер должен читать поток байт за байтом, чтобы разобрать входные данные и извлечь содержимое файла, он не может просто напрямую сбрасывать сырой поток в файл.
HttpServletRequest дает вам обычный поток ввода "pull" - не понимаю, как использование NIO здесь поможет.
Я думаю, что вы ни о чем не беспокоитесь. Средняя скорость сети (~ 1 МБ / с) не может догнать среднюю скорость жесткого диска (~ 100 МБ / с) (даже с самыми оптимистичными средними значениями). Файловые каналы не дадут вам никаких преимуществ. «Наследия» java.io
более чем достаточно.