Как сохранить в файл в java

Обновлено: 06.07.2024

В Java у меня есть текст из текстового поля в строковой переменной с именем «текст».

Как я могу сохранить содержимое переменной «text» в файл?

Если вы просто выводите текст, а не какие-либо двоичные данные, сработает следующее:

Затем запишите свою строку, как и в любой выходной поток:

Вам понадобится обработка исключений, как всегда. Обязательно позвоните, out.close() когда закончите писать.

Если вы используете Java 7 или более позднюю версию, вы можете использовать « оператор try-with-resources », который автоматически закроет ваш файл, PrintStream когда вы закончите с ним (то есть выйдите из блока), примерно так:

Вам все равно нужно будет явно бросить, java.io.FileNotFoundException как и раньше.

@Justin, вы также можете передать абсолютный путь (например, «/tmp/filename.txt») в конструктор FileOutputStream, чтобы сохранить файл в любом месте Кстати, это можно упростить, используя удобные конструкторы, которые PrintStream имеет с 1.5. Этого будет достаточно: PrintStream out = new PrintStream ("filename.txt"); Вы хотите использовать try <> catch () <> finally <>, где в finally <> вы закрываете файл, если он не равен нулю. В java8 вы можете попробовать (PrintStream ps = new PrintStream ("filename")) это поможет вам

Apache Commons IO содержит несколько отличных методов для этого, в частности FileUtils содержит следующий метод:

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

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

Просто небольшая поправка, второй фрагмент должен выглядеть следующим образом: FileUtils.writeStringToFile (new File ("test.txt"), "Hello File"); Теперь функция устарела, вы должны добавить кодировку по умолчанию -> FileUtils.writeStringToFile(new File("test.txt"), "Hello File", forName("UTF-8")); @ XP1 Я знаю, это большое улучшение. Я использовал Lombok для этого в Java 6: просто иди @Cleanup new FileOutputStream(. ) и готово. Большие файлы записываются в фоновом режиме (другой поток) и требуют времени для записи. Вызов flush () гарантирует, что все было записано на следующей строке, синхронизируя операцию. Но это необязательно , но хорошая практика, если вы обрабатываете большие файлы, такие как журналы. Обратите внимание, что out.close () уже очищает поток, что означает, что нет необходимости вызывать out.flush ().

В Java 7 вы можете сделать это:

В случае, если кто-то потом задумался, кодировка будет стандартом платформы. content.getBytes(StandardCharsets.UTF_8) может использоваться для явного определения кодировки. Обратите внимание, что StandardOpenOption.CREATE не является значением по умолчанию, а StandardOpenOption.CREATE и StandardOpenOption.TRUNCATE_EXISTING является значением по умолчанию. Чтобы использовать значение по умолчанию, просто удалите третий параметр. Пожалуйста, смотрите комментарий Тинус Тейт! Как происходит редактирование этого примера? Интересно, сколько тысяч людей взяли этот пример «как есть» только для того, чтобы обнаружить, что они получают неожиданные результаты, когда перезаписывают файл более короткой строкой. Как указывает Tinus, TRUNCATE_EXISTING имеет решающее значение, если вы не полностью понимаете и не имеете реальной причины не желать обрезать существующий файл при перезаписи более короткой строкой. В Java 11 вы можете просто поместить строку в качестве второго параметра! Ура!

Просто сделал что-то похожее в моем проекте. Использование FileWriter упростит часть вашей работы. И здесь вы можете найти хороший учебник .

Удаляя все try / catch и упрощая его, я также могу сделать это в одну строку, просто выполнив: (new BufferedWriter (new FileWriter (filename))). Write (str); Итак, покажи свое простое и приятное решение. Я был бы рад узнать, как сделать это лучше. Проигнорируйте троллей . они всегда критикуют, не предлагая их собственного решения. Спасибо, что спасли меня от написания собственного кода / загрузки дополнительной библиотеки и введения зависимости . Кажется, что .close() не выдает (по крайней мере, в Java 7?), Является ли последний trycatch возможно избыточным? Проглатывание подобных исключений усложнит вам жизнь, когда действительно произойдут исключения. По крайней мере, вы должны отбросить их: throw new RuntimeException(e);

Используйте FileUtils.writeStringToFile() от Apache Commons IO . Не нужно изобретать это колесо.

Я не мог не согласиться больше. Эти библиотеки есть, поэтому мы не вносим тонких ошибок в такое простое решение. Нет, очевидно нет. Я только не согласен с тем, что ваше решение, возможно, не первое, что я бросил бы на кого-то, кто является начинающим Java-программистом. Вы же не говорите, что никогда не писали ничего подобного? У меня есть, да, но это до того, как я нашел обыкновенные. С тех пор, как я нашел это, я никогда не писал такого рода вещи вручную, даже в одноклассном проекте. Если бы я знал об этом с первого дня, я бы использовал это с первого дня. Точно, но вы опытный разработчик. В вашей биографии говорится, что вы - пользователь JBOSS / Spring, но, конечно, вы не смогли бы участвовать ни в одном из своих первых попыток "Hello, World". Я не согласен с правильным использованием библиотек. Я говорю о том, что люди, пытающиеся использовать язык впервые, должны постараться узнать его в самом низу, даже если это означает делать то, что они откажутся позже, когда будут иметь опыт и будут лучше знать. Я реализовал это без общего достояния и получил менее очевидное исключение. Затем я реализовал это с помощью общих ресурсов, и он сказал мне, что именно не так. Мораль истории: зачем жить в темные века, если не нужно?

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

В Java 11 java.nio.file.Files класс был продлен на два новых служебных методов , чтобы записать строку в файл. Первый метод (см. JavaDoc здесь ) использует кодировку UTF-8 по умолчанию:

И второй метод (см. JavaDoc здесь ) позволяет указать отдельную кодировку:

Оба метода имеют необязательный параметр Varargs для настройки параметров обработки файлов (см. JavaDoc здесь ). В следующем примере будет создан несуществующий файл или добавлена ​​строка к существующему:

Я предпочитаю полагаться на библиотеки, когда это возможно, для такого рода операций. Это снижает вероятность того, что я случайно пропущу важный шаг (например, ошибку, сделанную выше). Некоторые библиотеки предложены выше, но мой фаворит для такого рода вещей - Google Guava . У Guava есть класс Files, который отлично подходит для этой задачи:

Родительская папка должна существовать. Пример: destination.mkdirs (). Files.write (CharSequence from, File to, Charset charset) устарел в guava 26.0. Современная гуавы альтернатива устаревшей Files.write: Files.asCharSink(file, charset).write(text)

Используйте Apache Commons IO api. Это просто

Использовать API как

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

Files.write (path, byte []) будет использовать кодировку UTF-8. String.getBytes () использует кодировку платформы по умолчанию. Так что это потенциальная проблема. Используйте string.getBytes (StandardCharsets.UTF_8)!

Используйте это, это очень читабельно:

Вы можете вставить этот метод в ваши классы. Если вы используете этот метод в классе с методом main, измените этот класс на статический, добавив ключевое слово static. В любом случае вам нужно будет импортировать java.io. *, чтобы он работал, иначе File, FileWriter и BufferedWriter не будут распознаны.

Вы могли бы сделать это:

Использование Java 7 :

Слово мудрому - это создаст новый файл, если его там нет, но перезапишет символы существующего файла, если он там есть. Если новые данные меньше, это будет означать, что вы, вероятно, создаете поврежденный файл. Спроси меня, откуда я знаю! Просто используйте, Files.write(targetPath, bytes); чтобы перезаписать файл тогда. Это будет работать как ожидалось.

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

Этот пример позволяет пользователю выбрать файл с помощью средства выбора файлов.

@Eric Leschinski: спасибо за то, что вы сделали мой ответ более профессиональным (я также предположил, что именно этого и хотел ОП, поскольку именно этого и хочет большинство людей, просто После того, как первоначальный вопрос получен, а ОП удовлетворен и ушел в прошлое, подобные страницы служат лишь полезным артефактом для людей, которые попадают сюда из поиска Google. Я попал на эту страницу, чтобы создать мини-текстовый аппендер к файлу. Так что лучше говорить со всей аудиторией, а не с ОП после того, как ОП продолжится.

Лучше закрыть писатель / выходной поток в блоке finally, на случай, если что-то случится

Обработка файлов в 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 -> Это необязательно, чтобы упоминать список атрибутов файла, чтобы установить атомарно при создании файла

Download

Сохранение файлов в приложение и данных о них на БД - 7

Controller: Реализация: Тут особо интересного ничего нет: метод поиска сущности по id и загрузка файла, разве что 46 — помечаем, что транзакция у нас для чтения. Уровень dao: Имплементация: 4 — поиск по id c использованием jdbcTemplate и RowMapper . 8 - 15 — реализация RowMapper для нашего конкретного случая, для сопоставления данных из БД и полей модели. Идем в FileManager и смотрим, как загружается наш файл: Возвращаем файл в виде объекта Resource , а искать будем по ключу. 3 — создаем Resource по пути + ключ. 4 - 8 — проверяем, что файл по заданному пути не пуст и читаем. Если всё ОК, возвращаем его, а если нет, прокидываем IOException наверх. Проверяем наш метод в Postman: Как видим, он отработал на ОК))

Delete

Тут ничего особенного: также возвращаем 404 в случае неудачи с помощью try-catch . Интерфейс сервиса: Implementation: 1 — также откат изменения данных (удаления) при падении IOException. 5 — удаляем информацию о файле из БД. 6 — удаляем сам файл из нашего “хранилища”. Интерфейс dao: Реализация: Ничего такого — просто delete. Удаление самого файла: Юзаем в Postman: Смотрим в хранилище: Пусто :) Теперь в БД: Видим, что все good))

Сохранение файлов в приложение и данных о них на БД - 12

Давайте попробуем написать тест под наш FileManager . Для начала взглянем на структуру тестовой части: mockFile.txt — это файл, с помощью которого мы будем тестить наши операции с file storage. testFileStorage будет заменой нашего хранилища. FileManagerTest : Здесь мы видим задание тестовых данных. Тест сохранения файла: 3 — с помощью тестовой рефлексии меняем нашу константу в сервисе для задания пути сохранения файла. 5 — вызываем проверяемый метод. 7 - 10 — проверяем правильность исполнения сохранения. 11 — удаляем сохраненный файл (мы не должны оставить никаких следов). Тест загрузки файла: 3 — опять же, меняем путь для нашего FileManager . 5 — юзаем проверяемый метод. 7 - 9 — проверяем результат исполнения. Тест удаления файла: 9 - 3 - 4 — задаем путь и создаем файл. 5 - 6 — проверяем его существование. 9 — используем проверяемый метод. 77 — проверяем, что обьекта уже нет. И смотрим, что там у нас по зависимостям: На этом у меня сегодня всё))


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

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

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

Создадим простой проект, не обязательно 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():

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