Java работа с файлами

Каждое приложение, программа имеют возможности записи чего-либо в файл. В данном уроке я продемонстрирую как можно записать какие-то данные в файл, а потом считать их оттуда.

Какие проблемы мы будем решать в этом уроке?

1. Как записывать в файл?

2. Как читать файл?

3. Как обновить файл?

4. Как удалить файл?

Подготовительные работы

Создадим простой проект, не обязательно Maven проект, так как нам не потребуется не каких дополнительных библиотек.

После того как вы создали проект, создайте класс WorkInFile.java и напишите туда стандартную конструкцию main:

public static void main(String[] args){
   //тут будем вызывать наши методы
}

Теперь создадим класс который будет иметь методы для работы с файлами, а назовем его FileWorker.java все методы в нем которые не есть private будут статическими для того чтобы мы получали к ним доступ без экземпляра этого класса.

Как записывать в файл?

В классе FileWorker.java создадим статический метод который будет осуществлять запись в файл и назовем этот метод write(String text; String nameFile):

public static void write(String fileName, String text) {
    //Определяем файл
    File file = new File(fileName);

    try {
        //проверяем, что если файл не существует то создаем его
        if(!file.exists()){
            file.createNewFile();
        }

        //PrintWriter обеспечит возможности записи в файл
        PrintWriter out = new PrintWriter(file.getAbsoluteFile());

        try {
            //Записываем текст у файл
            out.print(text);
        } finally {
            //После чего мы должны закрыть файл
            //Иначе файл не запишется
            out.close();
        }
    } catch(IOException e) {
        throw new RuntimeException(e);
    }
}

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

private static String text = "This new text \nThis new text2\nThis new text3\nThis new text4\n";
private static String fileName = "C://blog/a.txt";

public static void main(String[] args) throws FileNotFoundException {

    //Запись в файл
    FileWorker.write(fileName, text);

}

После чего мы получим новый файл «a.txt» со следующим содержимым:

This new text 
This new text2
This new text3
This new text4

2. Как читать файл?

Теперь в классе FileWorker создадим метод для чтения файла, также статический:

public static String read(String fileName) throws FileNotFoundException {
    //Этот спец. объект для построения строки
    StringBuilder sb = new StringBuilder();

    exists(fileName);

    try {
        //Объект для чтения файла в буфер
        BufferedReader in = new BufferedReader(new FileReader( file.getAbsoluteFile()));
        try {
            //В цикле построчно считываем файл
            String s;
            while ((s = in.readLine()) != null) {
                sb.append(s);
                sb.append("\n");
            }
        } finally {
            //Также не забываем закрыть файл
            in.close();
        }
    } catch(IOException e) {
        throw new RuntimeException(e);
    }

    //Возвращаем полученный текст с файла
    return sb.toString();
}

StringBuilder — в чем разница между обычным String? В том что когда  вы в StringBuilder добавляете текст он не пересоздается, а String пересоздает себя.

Также если файла нет то метод выкинет Exception.

Для проверки на существование файла создадим метод, так как нам еще потребуется эта проверка в следующих методах:

private static void exists(String fileName) throws FileNotFoundException {
    File file = new File(fileName);
    if (!file.exists()){
        throw new FileNotFoundException(file.getName());
    }
}

Теперь проверим его:

private static String text = "This new text \nThis new text2\nThis new text3\nThis new text4\n";
private static String fileName = "C://blog/a.txt";

public static void main(String[] args) throws FileNotFoundException {
    //Попытка прочитать несуществующий файл
    FileWorker.read("no_file.txt");

    //Чтение файла
    String textFromFile = FileWorker.read(fileName);
    System.out.println(textFromFile);
}

В первом случае когда файл не существует мы получим это:

Exception in thread "main" java.io.FileNotFoundException: no_file.txt
	at com.devcolibri.tools.FileWorker.read(FileWorker.java:31)

Во втором случае, мы получим содержимое файла в виде строки. (для этого закомментируйте первый случай)

3. Как обновить файл?

Как такого Update для файлов нет, но способ обновить его есть, для этого можно его перезаписать.

Давайте создадим метод update в классе FileWorker:

public static void update(String nameFile, String newText) throws FileNotFoundException {
    exists(fileName);
    StringBuilder sb = new StringBuilder();
    String oldFile = read(nameFile);
    sb.append(oldFile);
    sb.append(newText);
    write(nameFile, sb.toString());
}

Тут мы считываем старый файл в StringBuilder после чего добавляем к нему новый текст и записываем опять. Обратите внимание что для этого мы используем наши методы.

В результате обновления файла:

private static String text = "This new text \nThis new text2\nThis new text3\nThis new text4\n";
private static String fileName = "C://blog/a.txt";

public static void main(String[] args) throws FileNotFoundException {
    //Обновление файла
    FileWorker.update(fileName, "This new text");
}

мы получим следующее содержание файла «a.txt«:

This new text 
This new text2
This new text3
This new text4
This new text

4. Как удалить файл?

В тот же наш утилитный класс FileWorker добавим метод delete, он будет очень простым так как у объекта File уже есть метод delete():

public static void delete(String nameFile) throws FileNotFoundException {
    exists(nameFile);
    new File(nameFile).delete();
}

Проверяем:

private static String fileName = "C://blog/a.txt";

public static void main(String[] args) throws FileNotFoundException {
    //Удаление файла
    FileWorker.delete(fileName);
}

После чего файл будет удален.

Урок создан: 02 апреля 2013 | Просмотров: 197137 | Автор: Александр Барчук | Правила перепечатки


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

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

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

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

  • 25 июля 2013 в 14:42

    Аноним

    Спасибо!

  • 27 августа 2013 в 12:36

    Аноним

    Необходимо добавить
    import java.io.*;
    иначе может ругаться компилятор

  • 19 декабря 2013 в 09:15

    Александр Резванов

    Необходимо объявить переменную
    File file = new File(fileName);

    • 19 декабря 2013 в 09:16

      Александр Резванов

      StringBuilder sb = new StringBuilder();
      <<<>>>>>
      exists(fileName);

  • 02 декабря 2014 в 22:08

    Павел

    А почему в записи 2 try и один catch и finally?

  • 17 апреля 2015 в 10:18

    Василий

    Обновление файла происходит таким образом, что все содержимое файла становится одной строкой…

    • 15 мая 2015 в 22:01

      Александр

      Создавайте файл с расширением .doc (не .docx!)

  • 12 ноября 2015 в 22:57

    Аноним

    Блин! Выклвдываэте рабочий код! сначала код должен просто завестись от копипасты!!!!! а потом я буду его адаптировать. Да я новичек и не шарю в программировании но вы же и не для синьеров выкладываете.

    • 19 ноября 2015 в 19:22

      Аноним

      Копипаста не для новичков, а для тех, кто не программирует. Сам новичок, пытаюсь сделать файловый менеджер в консоли винды на Java. Суть в том, что такой..эмм..таким делом никто не занимается, сама джава не предоставляет никаких модулей для чтения клавишь без нажатия Enter. Есть некий awt от джава, да только он, скажем так — ПОЛНЫЙ графический интерфейс. А мне нужна командная строка. И ёпта — я нашел красавицу Lаnterna, я разбираюсь собственноручно со всеми вытекающими как в этом модуле, так и с объектом File. Мой пиструн аж дымит и поднимается до небывалых высот! Весь говнокод своими руками! Да это просто прекрасно!

    • 15 марта 2016 в 22:16

      Анонимка

      Таких как ты еще не видел, и видеть не хочу, завязывай, это не твоё.

  • 04 апреля 2016 в 22:56

    Иван

    Как так? Файл нельзя обновить? =)

    https://docs.oracle.com/javase/7/docs/api/java/io/FileWriter.html#FileWriter(java.io.File,%20boolean)

  • 22 сентября 2016 в 14:10

    Дмитрий

    Не рабочий код. Вот сидишь и выковыриваешь, что в нем именно не работает — уж проще самому написать было. Там кто-то кричит, что «не твое это», а я скажу, что я потому и полез искать готовый скрипт, потому что оно мне нахрен не сдалось тут тратить на это время, когда основа моей программы не в этом , аэто лишь так, приятное добавление, а вместо этого я уже несколько часов пытаюсь заставить работать update

  • 06 декабря 2016 в 14:05

    Ержан

    как удалить запись внутри файла?

  • 31 января 2017 в 13:43

    Олег

    Как указать путь, если файл будет расположен в корневом каталоге проекта?

  • 31 января 2017 в 15:01

    Олег

    В пункте 2 — «Как читать файл?» в строке ниже выдает ошибку:

    BufferedReader in = new BufferedReader(new FileReader( file.getAbsoluteFile()));

    Ругается на file, Как исправить?

  • 31 января 2017 в 15:11

    Олег

    Не совсем понял смысл этих строк:
    if(!file.exists()){
    file.createNewFile();}
    Если следующая конструкция:
    PrintWriter out = new PrintWriter(file.getAbsoluteFile());
    по умолчанию создаст новый файл, если его не существует.

  • 06 февраля 2017 в 10:10

    Игорь Никитин

    Спасибо за статью Александр Барчук, Вы мне очень помогли! Подскажите пожалуйста, как можно по названию строки получить данные из файла (int,float, string ), то есть например в файле есть запись «intn1 5» и нужно по названию intn1 получить 5 (int x= object.getInteger(«intn1»)), или наоборот туда записать (object.putInteger(«intn1»,5)) (так же с float)? По идее есть Scanner scan = new Scanner(file);, но он считывает целиком строку, как вы думаете обязательно тут конвертировать полученный из файла String в int,float или можно иначе решить проблему?

  • 25 февраля 2017 в 01:34

    Андрей

    Питання таке: При загрузці файла, як можна задати який саме файл можна загрузити. Наприклад: .txt , 3mb. як це реалізувати.

  • 18 марта 2017 в 05:55

    писатель

    В методе read
    после
    StringBuilder sb = new StringBuilder();
    пропущена строка:
    File file = new File(fileName);

  • 19 марта 2017 в 20:10

    ProgLang

    Здесь хорошие примеры работы с файлами http://proglang.su/java/149.

  • 30 мая 2017 в 09:39

    Erick

    Подготовительные работы
    Создадим простой проект, не обязательно Maven проект, так как нам не потребуЕтся НЕ КАКИХ дополнительных библиотек.
    (не ПОТРЕБУЮТСЯ НИКАКИЕ… ) и никакие здесь лишнее слово. лучше так «не потребуются дополнительные библиотеки»
    простите за грамматический нацизм. и все же. глаз режет.
    спасибо за обучающий материал.

    • 30 мая 2017 в 09:42

      Erick

      и было бы полезно сделать форму для отправки ошибок что-то типа «нашли ошибку? выделите текст и нажмите Alt + Enter»

  • 30 мая 2017 в 09:46

    Erick

    вообще прошу прощения за комменты. не посмотрел истории. с 2013 года
    NOBODY CARES!