Урок 4. RandomAccessFile и его возможности

Мы продолжаем серию уроков пакета IO, и в этом уроке мы познакомимся с более интересным классом данного пакета, который называется RandomAccessFile.

RandomAccessFile — класс пакета Java IO API, он позволяет перемещаться по файлу, читать из него или писать в него, как вам будет угодно. Вы также сможете заменить существующие части файла, речь идет о обновлении содержимого файла, а точней о обновлении фрагмента файла. Это невозможно сделать с помощью FileInputStream или FileOutputStream, но RandomAccessFile даст вам эту возможность.

Шаг 1

Как во всех уроках, первый шаг — создаем проект. И в нем один Main класс, в нем мы будем тестировать возможности RandomAccessFile. Но мы не будим писать сразу в main метод код, а создадим новый класс в котором опишем нужный нам функционал, и уже в методе main мы будем его проверять.

Структура проекта простая:

Как видите у нас есть два класса, где класс Main имеет метод main(String[] args) в котором мы и будем проверять роботу методов класса WorkWithFile.

Шаг 2

Открываем класс WorkWithFile и пишем следующее содержимое:

import java.io.IOException;
import java.io.RandomAccessFile;

public class WorkWithFile {

    private String path;

    // Экземпляр класса который обеспечит возможность 
    // работать с файлом
    private RandomAccessFile file;

    // говорим конструктору проинициализировать путь к файлу
    public WorkWithFile(String path) {
        this.path = path;
    }

    // метод демонстрирует переход на указанный символ
    public long goTo(int num) throws IOException {
        // инициализируем класс RandomAccessFile 
        // в параметры передаем путь к файлу 
        // и модификатор который говорит, что файл откроется только для чтения
        file = new RandomAccessFile(path, "r");

        // переходим на num символ
        file.seek(num);

        // получаем текущее состояние курсора в файле
        long pointer = file.getFilePointer();
        file.close();

        return pointer;
    }

    // этот метод читает файл и выводит его содержимое
    public String read() throws IOException {
        file = new RandomAccessFile(path, "r");
        String res = "";
        int b = file.read();
        // побитово читаем символы и плюсуем их в строку
        while(b != -1){
            res = res + (char)b;
            b = file.read();
        }
        file.close();

        return res;
    }

    // читаем файл с определенного символа
    public String readFrom(int numberSymbol) throws IOException {
        // открываем файл для чтения
        file = new RandomAccessFile(path, "r");
        String res = "";

        // ставим указатель на нужный вам символ
        file.seek(numberSymbol);
        int b = file.read();

        // побитово читаем и добавляем символы в строку
        while(b != -1){
            res = res + (char)b;

            b = file.read();
        }
        file.close();

        return res;
    }

    // запись в файл
    public void write(String st) throws IOException {
        // открываем файл для записи
        // для этого указываем модификатор rw (read & write)
        // что позволит открыть файл и записать его
        file = new RandomAccessFile(path, "rw");

        // записываем строку переведенную в биты
        file.write(st.getBytes());

        // закрываем файл, после чего данные записываемые данные попадут в файл
        file.close();
    }

}

Шаг 3

Теперь в классе Main в методе main() проверим работу наших методов класса WorkWithFile:

import java.io.IOException;

public class Main {

    // создаем экземпляр класса что мы создали
    private static WorkWithFile worker;

    public static void main(String[] args) throws IOException {
        // инициализируем класс передавая в него путь к файлу
        // так как мой файл лежит в корне проекта, то я просто указываю его имя
        worker = new WorkWithFile("testfile.txt");

        // пишем передаваемый текст в файл
        worker.write("Give me a break from your take and your take. \n" +
                "Come on and give me a break,\n" +
                "what do you want from me?\n" +
                "Feeding the rich with that son of a bitch.\n" +
                "Well that son of a bitch,\n" +
                "he looks just like me!\n" +
                "Yeah, yeah");

        // переходим на указанный символ в файле
        System.out.println(worker.goTo(100));
        System.out.println("*******");

        // читаем весь файл
        System.out.println(worker.read());
        System.out.println("*******");

        // читаем файл с указанного символа
        System.out.println(worker.readFrom(105));
    }
}

Шаг 4

Запускаем и смотрим что выведет в консоль:

100
*******
Give me a break from your take and your take. 
Come on and give me a break,
what do you want from me?
Feeding the rich with that son of a bitch.
Well that son of a bitch,
he looks just like me!
Yeah, yeah, yeah
*******
ding the rich with that son of a bitch.
Well that son of a bitch,
he looks just like me!
Yeah, yeah, yeah
Урок создан: 18 сентября 2013 | Просмотров: 27148 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 12 октября 2013 в 16:53

    Василий

    Чересчур много комментариев. Думаю человек дошедший до потоков должен уже знать что значит ключевое слово this и что делается в конструкторе.
    // этот метод читает файл и выводит его содержимое
    public String read() throws IOException {…}
    Если назвать метод readFromFile() тогда по названию будет видно что он делает. То что на этот метод возлагают вывод содержимого — неправильно. Алекс, пиши качественные статьи, рефактори код свой код.

  • 18 февраля 2014 в 17:46

    Andrey

    // побитово читаем символы и плюсуем их в строку
    while(b != -1){
    res = res + (char)b;
    b = file.read();
    }

    1) Не побитово ведь!
    2) Из-за автобоксинга будет выделяться каждый раз новая память для Стринга, здесь лучше применить StringBuilder

    • 05 июня 2016 в 14:46

      Стас

      Вроде как из-за того что Стринг имютебл, а не из-за того что автобоксинг

  • 04 августа 2017 в 13:08

    Мимо

    String res = «»;
    while (end_file) {
    res = res + (char)b;
    }
    За это руки надо отрывать. Каждый байт в immutable String!!