Чтение файла с каналами и буферами

Научитесь читать маленькие и большие файлы из файловой системы, используя API Java NIO Path, FileChannel, ByteBuffer и MappedByteBuffer.

  • Мы используем экземпляр RandomAccessFile, который ведет себя как большой массив байтов, хранящихся в файловой системе. Он использует указатели файлов, которые действуют как курсор для поддержания текущего местоположения чтения в файле.
  • ByteBuffer представляет собой буферизованные байты в памяти во время операций чтения/записи.
  • MappedByteBuffer — это прямой байтовый буфер, содержимое которого представляет собой отображенную в памяти область файла.

1. Чтение небольших файлов с помощью ByteBuffer и FileChannel

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

try(RandomAccessFile aFile = new RandomAccessFile("test.txt", "r");FileChannel inChannel = aFile.getChannel();) {long fileSize = inChannel.size();//Create buffer of the file sizeByteBuffer buffer = ByteBuffer.allocate((int) fileSize);inChannel.read(buffer);buffer.flip();// Verify the file contentfor(int i = 0; i < fileSize; i++) {System.out.print((char) buffer.get());}} catch(IOException e) {e.printStackTrace();}

2. Чтение больших файлов с помощью ByteBuffer и FileChannel

Используйте эту технику для чтения большого файла, когда все содержимое файла не поместится в буфер за один раз. Чтобы избежать проблем OutOfMemory, мы можем читать файл по частям с фиксированным размером небольшого буфера.

try(RandomAccessFile aFile = new RandomAccessFile("test.txt", "r");FileChannel inChannel = aFile.getChannel();) {//Buffer size is 1024ByteBuffer buffer = ByteBuffer.allocate(1024);while(inChannel.read(buffer) > 0) {buffer.flip();for(int i = 0; i < buffer.limit(); i++) {System.out.print((char) buffer.get());}buffer.clear(); // do something with the data and clear/compact it.}} catch(IOException e) {e.printStackTrace();}

3. Чтение файла с использованием MappedByteBuffer

MappedByteBuffer расширяет класс ByteBuffer с помощью операций, специфичных для отображенных в памяти областей файла.

try(RandomAccessFile aFile = new RandomAccessFile("test.txt", "r");FileChannel inChannel = aFile.getChannel();) {MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());buffer.load();for(int i = 0; i < buffer.limit(); i++) {System.out.print((char) buffer.get());}buffer.clear(); // do something with the data and clear/compact it.} catch(IOException e) {e.printStackTrace();}

Все вышеперечисленные методы считывают содержимое файла и выводят его на консоль.

Исходный код на Github

Прокрутить вверх