Научитесь читать маленькие и большие файлы из файловой системы, используя 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();}
Все вышеперечисленные методы считывают содержимое файла и выводят его на консоль.