Есть только два случая, когда FileChannel
быстрее, чем FileInputStream
или FileOutputStream
.
Первый - это когда вы можете использовать кучу ("direct") ByteBuffer
хранить данные, чтобы они не копировались в кучу Java.Например, если вы писали веб-сервер, который доставлял статические файлы в сокет, было бы быстрее использовать FileInputStream
и SocketChannel
, а не FileInputStream
и SocketOutputStream
.
Эти случаи, на мой взгляд, очень немногочисленны.Обычно, когда вы читаете (или пишете) файл в Java, вы будете что-то делать с данными.В этом случае вы не можете избежать копирования данных в кучу.
Другое использование для FileChannel
- создание MappedByteBuffer
для произвольного доступа к содержимому файла.Это значительно быстрее, чем использование RandomAccessFile
, поскольку он заменяет явные вызовы ядра ОС на доступ к памяти, который использует механизм разбиения на страницы ОС.
Если вы только начинаете работать с вводом / выводом в Java, я рекомендуюпридерживаться классов в java.io
до тех пор, пока вы не сможете объяснить, почему переход на java.nio
даст вам улучшенную производительность.Гораздо проще использовать потоковую абстракцию, чем блочную.