logo
Хабибуллин

Прямой доступ к файлу

Если необходимо интенсивно работать с файлом, записывая в него данные разных типов Java, изменяя их, отыскивая и читая нужную информацию, то лучше всего воспользоваться методами класса FileChannel из пакета java.nio.channels или класса RandomAccessFile из пакета java.io. Эти классы не порождают поток байтов. Они могут читать файл или записывать в него информацию, начиная с любого байта файла, реализуя прямой доступ к файлу.

Поскольку объект типа FileChannel тесно связан с файловой системой, как и все классы NIO, его нельзя создать конструктором, а можно получить из пути к файлу типа Path по такой схеме:

Path path = Paths.get("pub/file.txt");

FileChannel fc = (FileChannel)Files.newByteChannel(path,

StandardOpenOption.READ,

StandardOpenOption.WRITE);

Как видите, с помощью аргументов — констант перечисления StandardOpenOption — файл можно открыть на чтение, на запись или на чтение и запись. Другие возможности

описываются константами APPEND, CREATE, CREATE_NEW, TRANCATE_EXISTING, DELETE_ON_CLOSE, SPARSE, SYNC, DSYNC.

Используя Path можно также получить объект типа FileChannel статическим методом open(), например,

FileChannel fc = FileChannel.open(path, StandardOpenOption.CREATE,

StandardOpenOption.APPEND);

Третий способ получить объект типа FileChannel — это извлечь его из открытого потока

типа FileInputStream или FileOutputStream, или из объекта типа RandomAccessFile методом getChannel():

RandomAccessFile ras = new RandomAccessFile("pub/file.txt", "rw");

FileChannel fc = ras.getChannel();

Как видно из этого примера, объект типа RandomAccessFile создается конструктором. В конструкторах этого класса

RandomAccessFile(File file, String mode);

RandomAccessFile(String fileName, String mode);

вторым аргументом, mode, задается режим открытия файла. Это может быть строка "r" — открытие файла только для чтения, "rw" — открытие файла для чтения и записи, "rwd" — чтение и запись с немедленным обновлением источника данных и "rws" — чтение и запись с немедленным обновлением не только данных, но и метаданных.

Этот класс собрал все полезные методы работы с файлом. Он содержит все методы классов DataInputStream и DataOutputStream, кроме того, позволяет прочитать сразу целую строку методом readLine() и отыскать нужные данные в файле.