Глава 9. Обработка ошибок и исключений ← Вернуться к списку глав

Глава 10. Работа с файлами и вводом/выводом

Ниже представлена подробная десятая глава, ориентированная на новичков. В предыдущих главах мы научились основывать программы, работать с данными, обрабатывать ошибки, изучили ООП. Теперь пришло время научиться взаимодействовать с внешними источниками данных — файлами. Вы сможете сохранять результаты работы программы, загружать их при следующем запуске и обрабатывать хранящуюся вне кода информацию.


10.1 Зачем нужна работа с файлами?

До сих пор наши программы "жили" только в памяти компьютера и выводили данные на экран. Это удобно для тестирования, но часто нужно сохранять данные на диск, чтобы при следующем запуске программы снова иметь к ним доступ. Файлы позволяют:

10.2 Основные понятия ввода/вывода (I/O)

Ввод (Input) — получение данных из внешнего источника (файл, клавиатура).
Вывод (Output) — отправка данных во внешний источник (файл, консоль).

В Java для работы с файлами мы используем классы из пакета java.io или java.nio.file. Мы начнём с простых и понятных классов FileReader, BufferedReader, FileWriter, BufferedWriter.

10.3 Чтение из файла

Представим, что у нас есть текстовый файл input.txt, в котором записаны строки текста. Мы хотим прочесть их и вывести на экран.

Минимальный пример (старый подход):

java
import java.io.FileReader; import java.io.BufferedReader; import java.io.IOException; public class Main { public static void main(String[] args) { try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { System.out.println("Ошибка при чтении файла: " + e.getMessage()); } } }

Разберём код:

Если в input.txt написано:

Привет Это текстовый файл

Программа выведет:

Привет Это текстовый файл

10.4 Запись в файл

Чтобы записать текст в файл, используйте FileWriter и BufferedWriter:

java
import java.io.FileWriter; import java.io.BufferedWriter; import java.io.IOException; public class Main { public static void main(String[] args) { try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) { writer.write("Первая строка"); writer.newLine(); // переход на новую строку writer.write("Вторая строка"); } catch (IOException e) { System.out.println("Ошибка при записи в файл: " + e.getMessage()); } } }

Теперь в файле output.txt будет:

Первая строка Вторая строка

Если файла не было, он будет создан. Если он уже был, то по умолчанию будет перезаписан. Если хотите добавлять текст к уже существующему содержимому, создайте FileWriter так: new FileWriter("output.txt", true) — где true означает "добавлять в конец".

10.5 Работа с файлами в каталогах

Вы можете указать путь к файлу, например:

java
FileReader fr = new FileReader("C:/Users/ВашеИмя/Documents/input.txt");

Или использовать относительные пути, если файл лежит в папке вашего проекта. Принцип работы остаётся тем же.

10.6 Обработка исключений при работе с файлами

Работа с файлами всегда связана с потенциальными ошибками:

Поэтому методы ввода/вывода часто выбрасывают IOException, которую мы обрабатываем в блоке try-catch.

Использование try-with-resources гарантирует, что файл закроется автоматически, не оставляя "незакрытых" ресурсов.

10.7 Чтение и запись чисел

Файлы обычно содержат текст. Если хотите работать с числами, вы можете просто записывать их как строки, а потом при чтении преобразовывать:

java
// Запись числа в файл writer.write(String.valueOf(123)); // Чтение числа из файла int number = Integer.parseInt(lineFromFile);

Главное, чтобы формат данных был согласован: если вы записываете числа как текст, при чтении нужно снова приводить текст к числу методом Integer.parseInt() или Double.parseDouble().

10.8 Работа с бинарными файлами

Мы рассмотрели текстовые файлы. Бинарные файлы (картинки, аудио, сжатые данные) работают иначе. Для них используют потоки типа FileInputStream и FileOutputStream. Принцип похож, но вы читаете и пишете байты, а не строки.

java
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class BinaryCopy { public static void main(String[] args) { try (FileInputStream in = new FileInputStream("image.jpg"); FileOutputStream out = new FileOutputStream("copy.jpg")) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } } catch (IOException e) { System.out.println("Ошибка при копировании файла: " + e.getMessage()); } } }

Этот код копирует бинарный файл, читаючи его поблочно в массив byte[] и записывая в другой файл.

10.9 Резюме по ввод/вывод

10.10 Пример: читаем список покупок из файла и добавляем новые

Допустим, у нас есть файл shopping_list.txt с товарами:

Хлеб Молоко Яблоки

Программа должна прочитать их, вывести на экран, потом предложить пользователю добавить новые товары и сохранить обновлённый список обратно.

java
import java.io.*; import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { ArrayList<String> items = new ArrayList<>(); // Чтение из файла try (BufferedReader reader = new BufferedReader(new FileReader("shopping_list.txt"))) { String line; while ((line = reader.readLine()) != null) { items.add(line.trim()); } } catch (IOException e) { System.out.println("Не удалось прочитать файл: " + e.getMessage()); } System.out.println("Ваш список покупок:"); for (String item : items) { System.out.println(item); } // Добавляем новые товары Scanner scanner = new Scanner(System.in); System.out.println("Введите новые товары (пустая строка для выхода):"); while (true) { String input = scanner.nextLine(); if (input.isEmpty()) { break; } items.add(input); } // Запись обновлённого списка обратно в файл try (BufferedWriter writer = new BufferedWriter(new FileWriter("shopping_list.txt"))) { for (String item : items) { writer.write(item); writer.newLine(); } } catch (IOException e) { System.out.println("Не удалось записать в файл: " + e.getMessage()); } System.out.println("Список обновлён."); } }

10.11 Подводим итоги

В этой главе мы узнали:

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


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

Глава 9. Обработка ошибок и исключений ← Вернуться к списку глав

Просмотров: 47