Мы продолжаем серию уроков пакета 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
ПОХОЖИЕ ПУБЛИКАЦИИ
- None Found
4 комментариев к статье "Урок 4. RandomAccessFile и его возможности"
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.
Чересчур много комментариев. Думаю человек дошедший до потоков должен уже знать что значит ключевое слово this и что делается в конструкторе.
// этот метод читает файл и выводит его содержимое
public String read() throws IOException {…}
Если назвать метод readFromFile() тогда по названию будет видно что он делает. То что на этот метод возлагают вывод содержимого – неправильно. Алекс, пиши качественные статьи, рефактори код свой код.
// побитово читаем символы и плюсуем их в строку
while(b != -1){
res = res + (char)b;
b = file.read();
}
1) Не побитово ведь!
2) Из-за автобоксинга будет выделяться каждый раз новая память для Стринга, здесь лучше применить StringBuilder
Вроде как из-за того что Стринг имютебл, а не из-за того что автобоксинг
String res = “”;
while (end_file) {
res = res + (char)b;
}
За это руки надо отрывать. Каждый байт в immutable String!!