Rukovodstvo
статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.
Java: сохранить / записать строку в файл
Введение Сохранение строки в файлы с помощью Java может быть выполнено несколькими способами. В этой статье мы покажем некоторые распространенные методы записи строки в файл. Вот список всех классов и методов, которые мы рассмотрим: * Files.writeString () * Files.write () * FileWriter * BufferedWriter * PrintWriter Files.writeString () Начиная с Java 11, класс Files содержит полезный служебный метод Files.writeString (). Есть два варианта этого метода. Самая простая форма требует Путь к файлу
Время чтения: 4 мин.
Вступление
Сохранить строку в файлы можно несколькими способами с помощью Java. В этой статье мы покажем некоторые распространенные методы записи строки в файл.
Вот список всех классов и методов, которые мы рассмотрим:
Files.writeString ()
Начиная с Java 11, Files содержит полезный служебный метод Files.writeString() . Есть два варианта этого метода. Самая простая форма требует Path к файлу для записи и текстовое содержимое. Другой вариант также принимает необязательный CharSet :
Path path = Paths.get("output.txt"); String contents = "Hello"; try < Files.writeString(path, contents, StandardCharsets.UTF_8); >catch (IOException ex) < // Handle exception >
Здесь мало места для гибкости, но он отлично работает, если вам нужно быстро что-то записать в файл.
Files.write ()
String, как и другие объекты, можно преобразовать в byte[] . Метод Files.write() работает с байтами:
Path path = Paths.get("output.txt"); String someString = "Hello World"; byte[] bytes = someString.getBytes(); try < Files.write(path, bytes); >catch (IOException ex) < // Handle exception >
Нет необходимости закрывать какие-либо ресурсы, так как мы сами не открывали никаких ресурсов.
FileWriter
FileWriter — один из самых простых способов записать текстовое содержимое в файл. Мы создадим File и передадим его в FileWriter чтобы «связать» их.
Затем мы просто используем FileWriter для записи в него:
File output = new File("output.txt"); FileWriter writer = new FileWriter(output); writer.write("This text was written with a FileWriter"); writer.flush(); writer.close();
После использования писателя важно очистить и закрыть ресурсы. В качестве альтернативы вы можете сделать это с помощью синтаксиса try-with-resources
try(FileWriter writer = new FileWriter("output.txt")) < writer.write("This text was written with a FileWriter"); >catch(IOException e) < // Handle the exception >
BufferedWriter
BufferedWriter — это объект-оболочка, который используется вокруг объектов типа Writer . Если у нас есть существующий Writer такой как FileWriter , мы можем обернуть его внутри BuffereWriter .
BufferedWriter лучше всего использовать, когда для файла write() В этом случае эти многократные записи временно сохраняются во внутренний буфер и записываются в файл только при наличии достаточного содержимого. Это позволяет избежать необходимости хранить каждый новый фрагмент текста в файле и вместо этого предоставляет соответствующий буфер для временного хранения.
Использование BufferedWriter намного эффективнее, чем FileWriter для множественной записи, но это не помогает с одной записью.
Фактически, использование BufferedWriter для одной записи приведет к ненужным накладным расходам. Для таких простых случаев FileWriter — лучший вариант.
BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
BufferedWriter и FileWriter расширяют Writer поэтому у них одинаковые методы:
try(BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) < writer.write("Written with BufferedWriter); >catch(IOException e) < // Handle the exception >
PrintWriter
PrintWriter позволяет нам форматировать текст перед его записью. Он содержит методы, к которым мы привыкли, такие как printf() , println() и т. Д. Давайте создадим PrintWriter :
File output = new File("output.txt"); PrintWriter writer = new PrintWriter(output);
Лучший способ работать с PrintWriter — использовать синтаксис try-with-resources
try(PrintWriter writer = new PrintWriter(new FileWriter("output.txt"))) < // Write using the PrintWriter instance >catch < // Handle Exception >
Когда у нас есть PrintWriter , давайте рассмотрим некоторые из предоставляемых им методов.
PrintWriter с append ()
PrintWriter , как и StringBuilder предоставляет метод append() который позволяет нам добавлять содержимое в конец существующего файла.
Давайте appent() некоторый текст в пустой writer :
writer.append("Welcome to my fruit store! From me, you can buy:\n"); writer.append("Apples"); writer.append("\n"); writer.append("Oranges"); writer.append("\n"); writer.append("Bananas");
Метод append() возвращает PrintWriter к которому он был вызван. Это позволяет append() и упорядочить их более аккуратно:
writer.append("Welcome to my fruit store! From me, you can buy:\n"); writer.append("Apples\n").append("Oranges\n").append("Bananas\n");
PrintWriter с print ()
PrintWriter содержит методы для форматированной печати. К ним относятся print() , printf() и println() :
writer.print("Welcome to my fruit store %f", 2.0); writer.printf("From me, you can buy %s and %s.", "apples", "oranges");
PrintWriter с записью ()
С помощью write() мы можем записывать в поток много различных типов текстового содержимого. Примеры включают массивы символов, строки и целые числа:
char[] hello = ; writer.write(hello); writer.write("Welcome to my fruit store\n"); writer.write("From me, you can buy apples and oranges");
Метод write() принимает только контент без параметров форматирования, поэтому он похож на print() , но не может форматировать строки.
Чтобы завершить каждый PrintWriter в добавлении, печати или записи, важно очистить и закрыть поток:
writer.flush(); writer.close();
Метод flush() «сбрасывает» содержимое в файл, а close() навсегда закрывает поток.
Примечание. Если вы используете try-with-resources , он автоматически очистит и закроет поток.
Заключение
В этой статье мы показали несколько распространенных методов записи строк в файлы. Есть много вариантов, потому что есть много возможных вариантов использования.
Мы рассмотрели Files.writeString() , Files.write() , а также классы FileWriter , BufferedWriter и PrintWriter
Licensed under CC BY-NC-SA 4.0
Чтение и запись файлов
В Java есть четыре основных абстрактных класса, реализующих потоки ввода-вывода: InputStream, OutputStream, Reader, Writer. Первые два работают с байтами, вторые – с символами.
Для работы с файлами от этих абстрактных классов созданы соответственно классы FileInputStream, FileOutputStream, FileReader, FileWriter. Они являются адаптерами для объектов класса File к «интерфейсам» InputStream, OutputStream, Reader, Writer, т. е. к их методам.
Скажем несколько слов об адаптере как паттерне, или шаблоне, проектирования. Класс-адаптер A наследуется от интерфейса B, к которому приспосабливается объект другого класса – C. Класс-адаптер A имеет поле типа класса объекта C.
Например, объект File адаптируется к потоку ввода InputStream, т. е. все, что мы хотим получить из File, в конечном итоге мы будем получать из InputStream. Фактически мы работаем с InputStream, через адаптер FileInputStream, который с одной стороны наследуется от InputStream, а с другой – имеет поле, которому присваивается объект File.
Адаптер выполняет работу по получению данных из файла и адаптации их к тому виду, который можно передать в методы InputStream. Класс-адаптер, в данном примере – FileInputStream, переопределяет методы InputStream, добавляя в них свой код.
В основной ветке сначала создается объект, для которого требуется адаптер. Затем создается переменная класса, к которому выполняется адаптация. Этой переменной присваивается объект класса-адаптера, в конструктор которого передается адаптируемый объект.
File file = new File("/home/user/pic.jpg"); InputStream fIn = new FileInputStream(file);
Часто переменную определяют самим классом-адаптером:
FileInputStream fIn = new FileInputStream(file);
В конструктор можно передать строку-адрес. Объект File будет создан внутри адаптера. Пример побайтового копирования файла:
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class InputOutputStream public static void main(String[] args) throws IOException FileInputStream fileIn = new FileInputStream( "src/file/pets.png"); FileOutputStream fileOut = new FileOutputStream( "src/file/pets2.png"); while (fileIn.available() > 0) int oneByte = fileIn.read(); fileOut.write(oneByte); > fileIn.close(); fileOut.close(); > >
Если используются относительные адреса, они должны начинаться от корня проекта.
В конструктор FileOutputStream можно также передать второй аргумент true. В этом случае, если файл существует, данные в него будут добавляться. Перезаписи файла не произойдет.
Метод available() объекта класса FileInputStream возвращает количество непрочитанных байтов. Метод read() читает один байт и расширяет его до типа int. Кроме этого, есть другой метод read(), читающий массив байт в переменную-аргумент и возвращающий количество реально прочитанных байт. Метод write() также позволяет записывать блоками.
byte[] blockBytes = new byte[100]; while (fileIn.available() > 0) int qtyBytes = fileIn.read(blockBytes); fileOut.write(blockBytes, 0, qtyBytes); >
При чтении конца файла блок может содержать меньше прочитанных байт, чем размерность массива. Поэтому write() позволяет указывать срез массива.
У объектов FileOutputStream имеется метод flush(), который принудительно записывает находящиеся в буфере байты на диск. При вызове close() это происходит автоматически.
С помощью класса PrintStream также можно создать поток вывода в файл. PrintStream является наследником FilterOutputStream, который в свою очередь наследник OutputStream как и FileOutputStream.
import java.io.FileNotFoundException; import java.io.PrintStream; public class PrintStreamTest public static void main(String[] args) throws FileNotFoundException PrintStream fileOut = new PrintStream( "src/file/text.txt"); fileOut.println(10.5); fileOut.printf( "%s - %d - %f", "hi", 10, 1.1); fileOut.close(); > >
Функция printf() предназначена для форматированного вывода.
Заметим, переменная System.out является объектом типа PrintStream.
В работе с вводом-выводом также используется другой паттерн проектирования – обертка (wrapper), он же декоратор (decorator). Декоратор расширяет функциональность объекта, а не приспосабливает объект к какому-либо стороннему интерфейсу.
Поэтому класс-обертка наследуется от того же класса или интерфейса, что и оборачиваемый объект. В классе-обертке переопределяются методы оборачиваемого объекта. В методах обертки вызываются методы оборачиваемого класса и вводится дополнительная функциональность.
В основной ветке создается объект оборачиваемого класса, который передается в конструктор обертки. Внутри класса-обертки есть поле типа декорируемого класса. Этому полю присваивается переданный объект.
BufferedInputStream – класс-обертка для InputStream (наследует через FilterInputStream). В отличие от InputStream класс BufferedInputStream позволяет предварительно читать в буфер порции байт, что уменьшает количество обращений к файлу. Существует также BufferedOutputStream.
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; public class BufferStream public static void main(String[] args) throws IOException FileInputStream fileIn = new FileInputStream("src/file/text.txt"); BufferedInputStream bufIn = new BufferedInputStream(fileIn, 100); int i; while((i = bufIn.read())!= -1) System.out.print((char)i); > > >
Конструктор класса BufferedInputStream принимает объект InputStream или его наследника.
Хотя данные считываются блоками, метод read() извлекает их по одному. Однако в данном случае он будет извлекать их из буфера.
С помощью классов FileReader и FileWriter выполняется ввод-вывод в текстовые файлы.
FileReader reader = new FileReader( "src/file/text.txt"); FileWriter writer = new FileWriter( "src/file/text2.txt"); while (reader.ready()) int c = reader.read(); writer.write(c); > reader.close(); writer.close();
Метод ready() возвращает истину, если остались непрочитанные символы.
Читать и писать можно блоками. Также методу write() можно передать строку:
FileReader reader = new FileReader( "src/file/text.txt"); FileWriter writer = new FileWriter( "src/file/text3.txt"); char[] buff = new char[10]; while (reader.ready()) int qtySymbols = reader.read(buff); writer.write(buff, 0, qtySymbols); > writer.write("Halo"); reader.close(); writer.close();
Рассматривая ввод данных с клавиатуры, мы уже использовали класс BufferedReader, который наследуется от Reader и позволяет читать отдельные строки методом readLine(). Его также можно использовать для построчного чтения файлов:
import java.io.*; public class BufferedReaderTest public static void main(String[] args) throws IOException Reader reader = new FileReader( "src/file/text.txt"); BufferedReader buffReader = new BufferedReader(reader); while (buffReader.ready()) System.out.println( buffReader.readLine()); > reader.close(); buffReader.close(); > >
Существует и BufferedWriter.
X Скрыть Наверх
Программирование на Java. Курс
Как записать строку в файл java
Чтобы записать текст в файл нужно выполнить следующие действия:
- создать объект FileWriter , он является объектом класса java.io.Writer ;
- в конструктор объекта передать путь к файлу (или объект типа File ) и значение параметра append ( true или false ). Этот параметр определяет будет текст записываться в конец файла или целиком его перезаписывать;
- записать текст в файл при помощи метода write() ;
- закрыть поток при помощи метода close() ;
Обязательным условием работы с объектами класса java.io.Writer является обработка исключения java.io.IOException , поэтому код выполняется в блоке try. catch :
try FileWriter writer = new FileWriter("fileForWrite.txt", true); writer.write("Hello, Hexlet!"); // Hello, Hexlet! writer.write("\n"); writer.close(); > catch (IOException e) System.out.println("Возникла ошибка во время записи, проверьте данные."); >
Подробнее ознакомиться с описанием класса java.io.Writer и его методами можно в документации Oracle
#4 — Запись и чтение данных из файлов (Java io)
Работа с файлами это важная часть многих языков программирования. В уроке мы научимся работать с файлами. Мы изучим добавление и чтение информации из файлов.
Видеоурок
Многие языки программирования предоставляют классы для работы с файлами и директориями проекта. Язык Java обладает множеством классов для записи и чтения данных из файлов.
Работа с файлами
При работе с файлами всегда необходимо помнить две вещи:
- Перед началом работы с файлом его необходимо открыть;
- После завершения работы с файлом его необходимо закрыть.
Если файл не открыт или же неверно открыт, то вы не можете полноценно работать с его содержимым.
С закрытием все проще, но и коварнее. Если вы не закроете файл, то программа будет работать верно, тем не менее, чем больше будет открытых файлов, тем больше программа будет перегружена и в какой-то момент она просто зависнет или выключиться.
Исключения и файлы
Поскольку не всегда известно будет ли файл в проекте или на компьютере пользователя, то всегда лучше открывать файлы за счёт использования исключений. Выполняйте открытие файлов в блоке try catch и тем самым вы обезопасите себя от любых непредвиденных обстоятельств.
Запись данных в файл
При записи данных в файл его изначально необходимо открыть. Для этого в языке Java используется класс «File»:
File file = new File("fileName.txt");
После открытия файла вы можете записать в него данные за счёт класса «PrintWriter»:
// Указываем файл для записи // В качестве объекта передаем открытый файл на основе класса File PrintWriter pw = new PrintWriter(file); // Помещаем текст внутрь файла pw.println("Working proccess");
В конце файл необходимо закрыть:
pw.close();
Чтение данных из файла
Для чтения данных файл необходимо также изначально открыть и в конце закрыть. Чтобы прочесть содержимое файла используется класс BufferedReader :
// Открываем файл для чтения // В качестве объекта передаем открытый файл на основе класса FileReader BufferedReader br = new BufferedReader(file); // Считываем данные while((String line = br.readLine()) != null) < // Выводим каждую отдельную строку в консоль System.out.println(line); >
Весь код будет доступен после подписки на проект!
