Как очистить файл java

Обновлено: 05.07.2024

Чтобы работать с файлами, есть шикарный утилитный класс — java.nio.file.Files . У него есть методы просто на все случаи жизни. Все методы этого класса статические и работают с объектами типа Path. Методов очень много, поэтому мы рассмотрим только основные:

Метод Описание
Создает новый файл с путем path
Создает новую директорию
Создает несколько директорий
Создает временный файл
Создает временную директорию
Удаляет файл или директорию, если она пуста
Копирует файл
Перемещает файл
Проверяет, что путь — это директория, а не файл
Проверяет, что путь — это файл, а не директория
Проверяет, что объект по заданному пути существует
Возвращает размер файла
Возвращает все содержимое файла в виде массива байт
Возвращает все содержимое файла в виде строки
Возвращает все содержимое файла в виде списка строк
Записывает в файл массив байт
Записывает в файл строку
Возвращает коллекцию файлов (и поддиректорий) из заданной директории

2. Создание файлов и директорий

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

Код Примечание
Создает файл
Создает директорию
Создает директорию и все нужные поддиректории, если их не существует.

3. Копирование, перемещение и удаление

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

Код Примечание
Копирует файл
Перемещает и переименовывает файл
Удаляет файл

4. Проверка типа файла и факта существования

Когда у вас есть какой-то путь, полученный извне, вы бы хотели знать, это файл или директория. Ну и вообще: существует такой файл/директория или нет?

Для этого тоже есть специальные методы. Так же можно легко узнать длину файла:

Код Примечание

5. Работа с содержимым файла

И наконец, есть целая серия методов, которые позволяют легко прочитать или записать содержимое файла. Пример:


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

И кажется, в этом проблемы нет. В стандартной библиотеке Java есть метод delete() в классе java.io.File для удаления файла.


Метод delete() в классе java.io.File вызывает под капотом нативную функцию для удаления файла в зависимости от ОС. А современные ОС при удалении файла сразу не удаляют файл, а только удаляют имя файла. Содержимое файла остается, и память занимаемая под уже удаленный файл может быть в будущем переиспользована. Но все таки некоторое время кажется уже удаленный файл является доступный.

И если посмотреть на просторы интернета, то имеется немало программ для восстановления удаленных файлов, например Recuva.

Но хочется чтобы файлы были удалены без возможности востановления их в будущем. Начав искать в интернете, оказывается удаление файла без восстановление (затирание) очень не тривиальная задача. И при реализации такой задачи требуется учитывать особенности работы с файлами в определенной ОС. И при этом нужно для этого использовать либо вручную написанное нативное API или какую-то нативную библиотеку.

Поскольку приложения разрабатовалось в Ubuntu, то эта ОС предоставляет немало готовых решений в виде утилит командной строки. Например, утилита secure-delete, которая позволяет удалять файлы без востановления используя разные подходы.


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

Что очень не удобно и хочется уйти от этих проблем. Если посмотреть исходный код утилиты secure-delete, то она позволяет работать под разные операционные системы. Написана на С99 и использует разную препроцессорную магию и платформо-зависимый API. Отлаживать такой нативный код в случае ошибки очень сложно и еще та задача.

Если разобраться как работает утилита secure-delete, то можно выделить следующие этапы.

  • сначала проверяется существует ли файл и корректность прав.
  • в зависимости от указаного алгоритма перезаписывает содержимое файла.
  • сокращает размер файла к нуль байтам.
  • переименовует файл рандомной последовательностю символов.
  • удаляет файл.
  • Simple алгоритм — перезаписывает 1 проходом 0x00 байтами.
  • DOE алгоритм — перезаписывает 3 проходами random, random, «DoE».
  • RCMP алгоритм — перезаписывает 3 проходами 0x00 ,0xFF, «RCMP».
  • OPENBSD алгоритм — перезаписывает 3 проходами 0xFF, 0x00, 0xFF байтами.
  • DOD алгоритм — перезаписывает 7 проходами.
  • Gutmann алгоритм — перезаписывает 35 проходами.

Для того чтобы проверить существует ли файл и имеет ли он корректные права можно использовать std::filesystem, которая была добавлена в C++17.

Для предыдущих версий стандарта можно использовать boost::filesystem.


Для перезаписывания содержимого файла в зависимости от выбраного алгортма можно оставить реализацию, как в secure-delete.


Заполняется буфер определеного размера, определеным набором данных, в зависимости от алгоритма и записывает это буфер в файл, пока не достигнет конца.


Потом сократим размер файла к нуль байтам, используя для этого функцию std::filesystem::resize_file().


Следующим этапом переименовуем файл рандомной последовательностю символов, используя для этого std::random() и std::filesystem::file::replace_filename().


И на завершающем этапе нужно просто удалить файл, используя для этого std::filesystem::remove().


Ну и для использования на Java нужно объявить нативные методы.


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

Стандарт С++17 уже поддерживают все популярные компиляторы: MVSC, Clang, GCC.
Полный исходной код можно посмотреть на github: code.


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

  • 1 Вы должны перепроверить свои знания, потому что не создаст файл.

Если вы хотите очистить файл без удаления, возможно, вы можете обойти это

Изменить: он выдает исключение, поэтому необходимо поймать исключения

  • Вы уверены, что метод очищает содержимое файла? Я думал, что просто убедится, что поток полностью опустошен.
  • FileWriter во второй строке выдает исключение io, нужно ли что-то изменить, а не просто выбросить IOException после clearFile ()?
  • @Bagel здесь вам нужно будет поймать IOexception .. так что просто броски будут работать
  • @bot В printWriter я передаю объект FileWriter .. который гарантирует, что он пуст!

Лучшее, что я мог придумать, это:

В обоих случаях, если файл, указанный в pathObject, доступен для записи, этот файл будет усечен. Не нужно вызывать функцию write (). Приведенного выше кода достаточно, чтобы очистить / обрезать файл. Это нововведение в java 8.

Надеюсь, это поможет

  • Спасибо за это .. Это помогло мне решить проблему с завершающей строкой из предыдущего содержимого файла.

Вы можете удалить файл и создать его снова вместо того, чтобы делать много io.

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

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


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

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

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

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

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