Ниже представлена подробная десятая глава, ориентированная на новичков. В предыдущих главах мы научились основывать программы, работать с данными, обрабатывать ошибки, изучили ООП. Теперь пришло время научиться взаимодействовать с внешними источниками данных — файлами. Вы сможете сохранять результаты работы программы, загружать их при следующем запуске и обрабатывать хранящуюся вне кода информацию.
До сих пор наши программы "жили" только в памяти компьютера и выводили данные на экран. Это удобно для тестирования, но часто нужно сохранять данные на диск, чтобы при следующем запуске программы снова иметь к ним доступ. Файлы позволяют:
Ввод (Input) — получение данных из внешнего источника (файл, клавиатура).
Вывод (Output) — отправка данных во внешний источник (файл, консоль).
В Java для работы с файлами мы используем классы из пакета java.io
или java.nio.file
. Мы начнём с простых и понятных классов FileReader
, BufferedReader
, FileWriter
, BufferedWriter
.
Представим, что у нас есть текстовый файл input.txt
, в котором записаны строки текста. Мы хотим прочесть их и вывести на экран.
Минимальный пример (старый подход):
Разберём код:
new FileReader("input.txt")
открывает файл для чтения.new BufferedReader(...)
делает чтение более эффективным за счёт буферизации.readLine()
читает строку за строкой, возвращая null
, когда достигнут конец файла.try-with-resources
(в круглых скобках после try
), чтобы автоматически закрыть reader
, даже если возникнет ошибка.Если в input.txt
написано:
Программа выведет:
Чтобы записать текст в файл, используйте FileWriter
и BufferedWriter
:
Теперь в файле output.txt
будет:
Если файла не было, он будет создан. Если он уже был, то по умолчанию будет перезаписан. Если хотите добавлять текст к уже существующему содержимому, создайте FileWriter
так: new FileWriter("output.txt", true)
— где true
означает "добавлять в конец".
Вы можете указать путь к файлу, например:
Или использовать относительные пути, если файл лежит в папке вашего проекта. Принцип работы остаётся тем же.
Работа с файлами всегда связана с потенциальными ошибками:
Поэтому методы ввода/вывода часто выбрасывают IOException
, которую мы обрабатываем в блоке try-catch
.
Использование try-with-resources
гарантирует, что файл закроется автоматически, не оставляя "незакрытых" ресурсов.
Файлы обычно содержат текст. Если хотите работать с числами, вы можете просто записывать их как строки, а потом при чтении преобразовывать:
Главное, чтобы формат данных был согласован: если вы записываете числа как текст, при чтении нужно снова приводить текст к числу методом Integer.parseInt()
или Double.parseDouble()
.
Мы рассмотрели текстовые файлы. Бинарные файлы (картинки, аудио, сжатые данные) работают иначе. Для них используют потоки типа FileInputStream
и FileOutputStream
. Принцип похож, но вы читаете и пишете байты, а не строки.
Этот код копирует бинарный файл, читаючи его поблочно в массив byte[]
и записывая в другой файл.
BufferedReader
и BufferedWriter
с FileReader
и FileWriter
.FileInputStream
и FileOutputStream
.try-with-resources
, чтобы автоматически закрыть файлы.Допустим, у нас есть файл shopping_list.txt
с товарами:
Программа должна прочитать их, вывести на экран, потом предложить пользователю добавить новые товары и сохранить обновлённый список обратно.
В этой главе мы узнали:
FileReader
и BufferedReader
.FileWriter
и BufferedWriter
.FileInputStream
и FileOutputStream
.try-with-resources
для автоматического освобождения ресурсов.Теперь вы можете сохранять результаты работы своих программ, делая их более функциональными и полезными. В следующих главах вы сможете пойти дальше и научиться использовать базы данных, сетевое взаимодействие и другие возможности Java, но работа с файлами — важная ступенька на этом пути.
На этом мы завершаем десятую главу. Далее мы рассмотрим более продвинутые темы, такие как подключение библиотек, сборка проектов, а затем перейдём к практическим мини-проектам, где вы сможете применить полученные знания на практике.
Просмотров: 47