Когда использовать FileChannel для чтения () / записи () файлов? - PullRequest
0 голосов
/ 15 ноября 2018

Я читаю книгу Thinking in Java, , которая объясняет пакет java.nio.* и говорит, что NIO быстрее, чем чтение и запись файлов с традиционными потоками ввода-вывода.Зачем?

Я просмотрел следующую информацию:

  • Поток ввода-вывода ориентирован на байты, традиционный блок обработки ввода-вывода - байтовый, а блок обработки NIO - блочный (байтовый массив), ноЯ думаю, что традиционный IO может также напрямую обрабатывать блок (байтовый массив) через BufferedFile *, и традиционный IO также имеет прямой метод обработки байтового массива

    private native int readBytes(byte b[], int off, int len) throws IOException;
    
  • IO блокирует чтение, NIO можетбыть неблокирующим, но я обнаружил, что файл NIO может быть только неблокирующим, тогда у NIO нет никаких преимуществ.

  • Я думаю, что необходимость использования NIO - это, как правило, другие преимущества, которые требуютиспользовать NIO, например:

     transferTo()/transferFrom()
    

Итак, когда я должен использовать NIO для чтения и записи файлов?Почему это быстрее, чем традиционный ввод-вывод?Как правильно его использовать?Следует ли использовать IO или NIO только при чтении и записи файлов?

1 Ответ

0 голосов
/ 16 ноября 2018

Есть только два случая, когда FileChannel быстрее, чем FileInputStream или FileOutputStream.

Первый - это когда вы можете использовать кучу ("direct") ByteBufferхранить данные, чтобы они не копировались в кучу Java.Например, если вы писали веб-сервер, который доставлял статические файлы в сокет, было бы быстрее использовать FileInputStream и SocketChannel, а не FileInputStream и SocketOutputStream.

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

Другое использование для FileChannel - создание MappedByteBuffer для произвольного доступа к содержимому файла.Это значительно быстрее, чем использование RandomAccessFile, поскольку он заменяет явные вызовы ядра ОС на доступ к памяти, который использует механизм разбиения на страницы ОС.

Если вы только начинаете работать с вводом / выводом в Java, я рекомендуюпридерживаться классов в java.io до тех пор, пока вы не сможете объяснить, почему переход на java.nio даст вам улучшенную производительность.Гораздо проще использовать потоковую абстракцию, чем блочную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...