Java как записывать в файл без перезаписи

Обновлено: 06.07.2024

Запись в текстовый файл немного проще, чем чтение файла в Java. Для записи в файл мы будем использовать еще два встроенных класса: класс FileWriter и класс PrintWriter.

В качестве имени класса введите Write, затем нажмите «Готово». Добавьте следующие три import в свой новый код:

Ваш новый класс должен выглядеть так:

Опять же, подчеркивание, потому что мы еще не использовали импортированные классы.

Когда вы хотите сделать запись в текстовый файл в Java, вы можете начать с самого начала текста и перезаписать все. Или можно начать с конца и добавить в текст. Класс FileWriter позволяет вам указать, что именно вы хотите сделать. Мы добавим поле, которое устанавливает значение для добавления текста для класса FileWriter. Мы также добавим поле, чтобы установить имя файла.

Итак добавьте следующие два поля и конструктор:

Переменную boolean мы назвали append и установили для нее значение false. Это значение по умолчанию для класса FileWriter, и означает, что мы не хотим делать запись в текстовый файл, а хотим полностью стереть его.

Конструктор устанавливает значение для поля path_to_file (переменной экземпляра), которое является именем и расположением файла. Оно будет передано, когда мы создадим новый объект из нашего класса Write.

Как уже упоминалось в предыдущем разделе, вы можете установить более одного конструктора в коде. Мы можем установить второй конструктор и передать значение добавления или нет.

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

Этот второй конструктор в круглых скобках имеет два значения: путь к файлу и значение добавления текста (то есть, мы укажем, будем ли мы добавлять текст к файлу, либо перезаписывать весь файл) в логической переменной. Если вы хотите добавить запись в текстовый файл, вы можете использовать этот конструктор для создания нового объекта. Если просто хотите перезаписать текстовый файл, вы можете использовать первый конструктор.

Ваш код теперь должен выглядеть так:

Чтобы записать в текстовый файл, добавьте следующий метод под последним конструктором:

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

Как и в прошлом уроке мы добавили throws IOException, поскольку нам нужно обрабатывать ошибки при записи текстов в файлы.

Первое, что нам нужно в методе - это объект FileWriter. FileWriter позаботится об открытии правильного файла и сохранении текста в байтах. Добавьте следующую строку в метод fileWrite:

Итак, мы создаем новый объект FileWriter с именем write_to_file. В круглых скобках FileWriter мы передаем имя и путь, а также значение добавления. Оно будет либо true (добавить в файл), либо false (не добавлять).

Если файл, который вы передаете, не существует, FileWriter создаст его сам.

Но FileWriter записывает только байты. А мы можем передать простой текст FileWriter с помощью класса PrintWriter. Для этого PrintWriter имеет несколько удобных методов печати. Но ему нужно имя от FileWriter для создания объекта из класса. Итак, добавьте эту строку в свой метод:

Наш объект PrintWriter называется print. В круглых скобках PrintWriter мы добавили имя нашего объекта FileWriter.

Чтобы Java-программа сделала запись в текстовый файл, введите имя объекта PrintWriter, и поставьте точку:

Как только вы введете точку, NetBeans отобразит список доступных параметров:

В списке очень много вариантов print!

Мы будем использовать один из методов printf. Он позволяет передавать отформатированную строку текста на PrintWriter. Причиной для использования printf является обработка символов новой строки. Символ новой строки различается в зависимости от используемой операционной системы. Windows добавит символы \r\n для новой строки. А вот системы Unix просто используют \n. Использование функции printf обеспечит правильное написание кода для записи в текстовый файл Java-программой независимо от платформы.

Добавьте следующую строку в свой код:

Мы передали методу printf две вещи: формат для текста и строку, которую мы хотим записать в текстовый файл. Они разделяются запятой. Обратите внимание на первое:

%s в двойных кавычках означает строку символов любой длины. %n означает перевод на новую строку. Итак, мы говорим методу printf о форматировании строки символов и добавлении новой строки в конце. Фактический текст, который нужно отформатировать, идет после запятой. Метод printf весьма полезен, и мы рассмотрим параметры более подробно в следующем разделе. А пока давайте продолжим.

Осталось добавить единственное в наш метод:

Эта строка закрывает текстовый файл и освобождает все ресурсы, которые он использовал.

Ваш класс Write теперь должен выглядеть так:

Чтобы проверить свой новый класс, вернитесь к классу ReadFile (класс с методом main). Добавьте следующее, чтобы создать новый объект из класса Write:

Итак, мы создали объект Write с именем line. В круглых скобках Write мы добавили две вещи: имя файла и значение добавления текста true. Это обеспечит вызов второго из созданных нами конструкторов. Если мы хотим просто добавить запись в текстовый файл, то код будет таким:

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

Чтобы вызвать метод fileWrite для вашего объекта Write, добавьте эту строку:

Меняйте текст в круглых скобках метода как вам угодно.

Чтобы сообщить пользователю о том, что происходит, вы можете напечатать что-то в этом духе:

Ваш код ReadFile теперь должен выглядеть следующим образом (мы добавили несколько комментариев):

Если хотите, добавьте блок try . catch для записи текста. Вместо вышеизложенного напишите следующее:

Запустите программу еще раз, и вы должны увидеть эту новую записанную строку:

И это все - теперь вы можете делать запись в текстовый файл и читать его содержимое с помощью Java-программы. В следующем разделе мы продолжим программирование с помощью Java Forms и создадим свой собственный калькулятор на Java.

Множество способов записи данных в файл с помощью Java.

1. Обзор

В этом уроке мы рассмотрим различные способы записи в файл с помощью Java. Мы будем использовать BufferedWriter , PrintWriter , FileOutputStream , DataOutputStream , RandomAccessFile , FileChannel, и класс утилиты Java 7 Files .

Мы также рассмотрим блокировку файла во время записи и обсудим некоторые окончательные выводы о записи в файл.

Дальнейшее чтение:

Java – Добавление данных в файл

Исключение FileNotFoundException в Java

Как скопировать файл с помощью Java

2. Запись С Помощью BufferedWriter

Давайте начнем с простого и используем BufferedWriter для записи Строки в новый файл :

Вывод в файле будет:

Затем мы можем добавить Строку к существующему файлу :

Затем файл будет:

3. Пишите С Помощью PrintWriter

Далее давайте посмотрим, как мы можем использовать PrintWriter для записи форматированного текста в файл :

Полученный файл будет содержать:

Обратите внимание, что мы записываем в файл не только необработанную строку , но и некоторый форматированный текст с помощью метода printf .

Мы можем создать запись с помощью FileWriter , BufferedWriter или даже System.out .

4. Запись С Помощью FileOutputStream

Теперь давайте посмотрим, как мы можем использовать FileOutputStream для записи двоичных данных в файл.

Следующий код преобразует Строку в байты и записывает байты в файл с помощью FileOutputStream :

Вывод в файле, конечно, будет:

5. Запись С Помощью DataOutputStream

Далее давайте рассмотрим, как мы можем использовать DataOutputStream для записи Строки в файл:

6. Запись С Помощью RandomAccessFile

Давайте теперь проиллюстрируем, как писать и редактировать внутри существующего файла , а не просто записывать в совершенно новый файл или добавлять к существующему. Проще говоря: нам нужен произвольный доступ.

RandomAccessFile позволяет нам записывать в определенную позицию в файле с учетом смещения — от начала файла — в байтах.

Этот код записывает целочисленное значение со смещением, заданным с начала файла:

Если мы хотим прочитать int , хранящийся в определенном месте , мы можем использовать этот метод:

Чтобы проверить наши функции, давайте напишем целое число, отредактируем его и, наконец, прочитаем его обратно:

7. Запись С Помощью FileChannel

Если мы имеем дело с большими файлами, FileChannel может быть быстрее, чем стандартный ввод-вывод. Следующий код записывает Строку в файл с помощью FileChannel :

8. Запись С Помощью Класса Files

Java 7 представляет новый способ работы с файловой системой, а также новый класс утилит: Files .

Используя класс Files , мы можем создавать, перемещать, копировать и удалять файлы и каталоги. Он также может использоваться для чтения и записи в файл:

9. Запись во Временный файл

Теперь давайте попробуем записать во временный файл. Следующий код создает

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

10. Блокировка Файла Перед Записью

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

Давайте воспользуемся FileChannel , чтобы попытаться заблокировать файл перед записью в него:

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

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

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

  • Если мы попытаемся прочитать из файла, который не существует, будет выдано исключение FileNotFoundException .
  • Если мы попытаемся записать в файл, который не существует, файл будет создан первым, и никаких исключений не будет.
  • Очень важно закрыть поток после его использования, так как он не закрыт неявно, чтобы освободить любые ресурсы, связанные с ним.
  • В выходном потоке метод close() вызывает flush() перед высвобождением ресурсов, что заставляет все буферизованные байты записываться в поток.

Рассматривая общие методы использования, мы можем видеть, например, что PrintWriter используется для записи форматированного текста, FileOutputStream для записи двоичных данных, DataOutputStream для записи примитивных типов данных, RandomAccessFile для записи в определенную позицию и FileChannel для более быстрой записи в большие файлы. Некоторые API этих классов позволяют больше, но это хорошее место для начала.

12. Заключение

В этой статье проиллюстрировано множество вариантов записи данных в файл с помощью Java.


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В 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 будет создан внутри адаптера. Пример побайтового копирования файла:

Если используются относительные адреса, они должны начинаться от корня проекта.

В конструктор FileOutputStream можно также передать второй аргумент true. В этом случае, если файл существует, данные в него будут добавляться. Перезаписи файла не произойдет.

Метод available() объекта класса FileInputStream возвращает количество непрочитанных байтов. Метод read() читает один байт и расширяет его до типа int. Кроме этого, есть другой метод read(), читающий массив байт в переменную-аргумент и возвращающий количество реально прочитанных байт. Метод write() также позволяет записывать блоками.

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

У объектов FileOutputStream имеется метод flush(), который принудительно записывает находящиеся в буфере байты на диск. При вызове close() это происходит автоматически.

С помощью класса PrintStream также можно создать поток вывода в файл. PrintStream является наследником FilterOutputStream, который в свою очередь наследник OutputStream как и FileOutputStream.

Функция printf() предназначена для форматированного вывода.

Заметим, переменная System.out является объектом типа PrintStream.

В работе с вводом-выводом также используется другой паттерн проектирования – обертка (wrapper), он же декоратор (decorator). Декоратор расширяет функциональность объекта, а не приспосабливает объект к какому-либо стороннему интерфейсу.

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

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

BufferedInputStream – класс-обертка для InputStream (наследует через FilterInputStream). В отличие от InputStream класс BufferedInputStream позволяет предварительно читать в буфер порции байт, что уменьшает количество обращений к файлу. Существует также BufferedOutputStream.

Конструктор класса BufferedInputStream принимает объект InputStream или его наследника.

Хотя данные считываются блоками, метод read() извлекает их по одному. Однако в данном случае он будет извлекать их из буфера.

С помощью классов FileReader и FileWriter выполняется ввод-вывод в текстовые файлы.

Метод ready() возвращает истину, если остались непрочитанные символы.

Читать и писать можно блоками. Также методу write() можно передать строку:

Рассматривая ввод данных с клавиатуры, мы уже использовали класс BufferedReader, который наследуется от Reader и позволяет читать отдельные строки методом readLine(). Его также можно использовать для построчного чтения файлов:

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

Поток выполнения Java-программы

Выполнение программы Java

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

Что такое файл в Java?

При чтении файла в Java мы должны знать класс файлов Java. Класс Java File представляет файлы и имена каталогов в абстрактной манере. Класс File имеет несколько методов для работы с каталогами и файлами, таких как создание новых каталогов или файлов, удаление и переименование каталогов или файлов и т. д. Объект File представляет фактический файл / каталог на диске.

Теперь давайте разберемся с различными методами создания файла.

Методы для создания файла в Java

1. Создайте файл с классом java.io.File

Вам нужно использовать метод File.createNewFile(). Этот метод возвращает логическое значение:

  • истина, если файл выполнен.
  • false, если файл уже существует или операция по какой-то причине не открывается.

Этот метод также генерирует исключение java.io.IOException, когда он не может создать файл.

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

Если мы запустим программу из командной строки, для неабсолютного пути объект File попытается найти файлы из текущего каталога. Экземпляры класса File являются неизменяемыми; то есть, после создания абстрактный путь, представленный объектом File, никогда не изменится.

Теперь давайте рассмотрим небольшой пример и разберемся, как он работает.

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

2. Создайте файл с классом java.io.FileOutputStream

Если вы хотите создать новый файл и в то же время, если хотите записать в него некоторые данные, вы можете использовать метод записи FileOutputStream. В Java FileOutputStream является классом потока байтов. Чтобы записать данные в файл, вы должны преобразовать данные в байты, а затем сохранить их в файл.

Класс FileOutputStream хранит данные в виде отдельных байтов. Может использоваться для создания текстовых файлов. Файл представляет собой хранилище данных на втором носителе, таком как жесткий диск или компакт-диск. Метод FileOutputStream.write() автоматически создает новый файл и записывает в него содержимое.

public static Path createFile(Path path, FileAttribute<?>. attrs) throws IOException

Создает новый и пустой файл, и если файл уже существует, то будет ошибка.

Далее, давайте посмотрим на создание временного файла.

4. Java также может создавать временные файлы

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

Создание временного файла с использованием java.io.File.createTempFile()

с использованием NIO

Для создания временного файла используются следующие два метода.

Вышеуказанный метод принимает четыре аргумента.

Путь -> указать каталог, в котором будет создан файл.

Строка -> чтобы упомянуть префикс имени файла. Используйте ноль, чтобы избежать префикса.

Строка -> чтобы упомянуть суффикс имени файла. т.е. расширение файла. Используйте null, чтобы использовать .tmp в качестве расширения.

attrs -> Это необязательно, чтобы упоминать список атрибутов файла, чтобы установить атомарно при создании файла

Читайте также: