FileInput / OutputStream против FileChannels - что дает лучшую производительность - PullRequest
2 голосов
/ 06 июля 2011

Я пишу программу, которая должна копировать большие, но не огромные объемы данных из папки в папку (в диапазоне от нескольких десятков фотографий одновременно). Первоначально я использовал java.io.FileOutputStream для простого чтения в буфер и записи, но потом я услышал о возможном увеличении производительности при использовании java.nio.FileChannel.

У меня нет ресурсов для проведения серьезного контролируемого теста с данными, которые у меня есть, но, похоже, нет единого мнения о преимуществах каждого из них (за исключением того, что FileChannel является поточно-ориентированным). Некоторые пользователи сообщают, что FileChannel отлично подходит для небольших файлов, другие сообщают об огромном увеличении скорости с большими файлами.

Мне интересно, если кто-нибудь точно знает, для чего вообще было создано FileChannel: было ли оно разработано для повышения производительности? В каких случаях? И есть ли определенное увеличение производительности для общих типов данных, или я должен ожидать тривиальных различий, потому что я не работаю с данными, которые достаточно специализированы?

РЕДАКТИРОВАТЬ: Предположим, мои данные не должны быть потокобезопасными.

Ответы [ 3 ]

2 голосов
/ 06 июля 2011

FileChannel.transferFrom/To должен быть быстрее, чем поток ввода-вывода для копирования файлов.

Или вы можете просто использовать Java 7 java.nio.file.Files.copy(source, target).Это должно быть как можно быстрее.

Однако, в конце концов, производительность не будет заметно отличаться - узким местом является скорость жесткого диска.


FileChannelне неблокируемый и не выбираемый.Не уверен, что они собираются добавить эти функции в будущем.Java 7 имеет AsynchronousFileChannel, хотя.

1 голос
/ 06 июля 2011

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

Каналы - это средство для копирования информации в буферы. Это обеспечивает более низкий уровень доступа к процедурам ввода и вывода. С продуманным размером буфера ускорение может быть впечатляющим. Структурирование вашего кода вокруг буферов может сократить время, затрачиваемое на цикл чтения (также увеличивая производительность). Наконец, хотя можно выполнить предварительную проверку состояния входного потока, пытаясь избежать блокировки, каналы и буферы позволяют выполнять операции неблокирующим образом (даже в наихудших условиях).

0 голосов
/ 06 июля 2011

Вы взглянули на commons-io?

FileUtils.copyFileToDirectory(srcFile, destDir);
...