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

89

Я хочу скопировать содержимое файла «A» в файл «B». после завершения копирования я хочу очистить содержимое файла «A» и хочу писать в нем с самого начала. Я не могу удалить файл «А», так как он связан с другой задачей.

Мне удалось скопировать содержимое с помощью API файлов Java (readLine ()), но я не знаю, как очистить содержимое файла и установить указатель файла на начало файла.

бриг
источник

Ответы:

135

Просто выведите в файл пустую строку:

PrintWriter writer = new PrintWriter(file);
writer.print("");
writer.close();
Влад
источник
14
В записи нет необходимости, и если файл открыт для другой задачи, открытие может быть даже невозможно.
Marquis of Lorne
писатель. закрыть ??, мы в 2017 году !!!. Кроме того, не нужно печатать (""), потому что текст будет перезаписан
FSm
1
@Andro, заметили метку времени и теги? Тогда я помню, что это был самый надежный способ очистить файл на устройствах Android.
Влад
@Vlad Если сейчас нет необходимости закрывать писателя, может быть, стоит обновить ответ?
Line
72

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

PrintWriter pw = new PrintWriter("filepath.txt");
pw.close();
Camleng
источник
9
Вы правы в этом. Все ответы, показывающие запись, неверны или в лучшем случае избыточны.
Marquis of Lorne
33
Как насчет того, чтобы просто new PrintWriter("filepath.txt").close();?
Supuhstar
1
цитата из java docs «Если файл существует, он будет обрезан до нулевого размера»
Пинкертон
1
но что делать, если файл находится в режиме добавления.
GURMEET SINGH
О, чувак, я не могу поверить, что пропустил простой ответ. Открыть файл в режиме усечения. Я так ненавижу режим обрезки, что мне это подсунули.
30

Вам нужен метод setLength () в классе RandomAccessFile.

Берли Медведь
источник
5
Фактически, это единственный правильный ответ, поскольку он не удаляет файл. Все остальные ответы подходят.
Marquis of Lorne
Мне это нужно, потому что я хотел бы очистить файл журнала, созданный библиотекой logback-android . Если я удалю файл журнала вручную, библиотека будет недостаточно умной, чтобы создать ее снова, если есть журнал для записи, пока я не перезапущу свое приложение. Поэтому я использовал этот метод и работаю. Я мало учусь. Разве это не лучший подход? Пожалуйста посоветуй.
Yeung
Как ни странно, у меня есть производственная проблема, потому что карта Intenso класса 10 зависает (и принудительно сбрасывает батарею), когда я вызываю fileOnSdCard.setLength (0) для приложения, установленного из файла .apk. На их карточке 4-го класса проблемы не было.
Poutrathor
11

Один лайнер для выполнения операции усечения:

FileChannel.open(Paths.get("/home/user/file/to/truncate"), StandardOpenOption.WRITE).truncate(0).close();

Дополнительная информация доступна в документации по Java: https://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html

Михал
источник
+1 За то, что не создает экземпляр всего класса записи файла (и, что еще хуже, пишет в него). Это действительно должен быть принятый ответ.
Kröw 06
6

Как насчет ниже:

File temp = new File("<your file name>");
if (temp.exists()) {
    RandomAccessFile raf = new RandomAccessFile(temp, "rw");
    raf.setLength(0);
}
Санджай Сингх
источник
5

После копирования из A в B снова откройте файл A в режиме записи, а затем запишите в него пустую строку

Rasel
источник
5

Один из лучших компаньонов для java - это Apache Projects, и пожалуйста, обратитесь к нему. Для операций с файлами вы можете обратиться к проекту Commons IO .

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

FileUtils.write(new File("/your/file/path"), "")
Анвер Садхат
источник
4

Просто пиши:

FileOutputStream writer = new FileOutputStream("file.txt");
Manh Vu
источник
2

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

хакон
источник
2

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

new FileWriter("/path/to/your/file.txt").close();
Маркус Л.
источник
1

используя: Новая библиотека Java 7 NIO, попробуйте

        if(!Files.exists(filePath.getParent())) {
            Files.createDirectory(filePath.getParent());
        }
        if(!Files.exists(filePath)) {
            Files.createFile(filePath);
        }
        // Empty the file content
        writer = Files.newBufferedWriter(filePath);
        writer.write("");
        writer.flush();

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

суровый
источник
0

Ты можешь использовать

FileWriter fw = new FileWriter(/*your file path*/);
PrintWriter pw = new PrintWriter(fw);
pw.write("");
pw.flush(); 
pw.close();

Помните, что нельзя использовать

FileWriter fw = new FileWriter(/*your file path*/,true);

True в конструкторе файлового редактора включит добавление.

Ревант Кумар
источник
0
FileOutputStream fos = openFileOutput("/*file name like --> one.txt*/", MODE_PRIVATE);
FileWriter fw = new FileWriter(fos.getFD());
fw.write("");
Харприт Сингх
источник
Добро пожаловать в SO! Пожалуйста, используйте встроенные инструменты форматирования, чтобы ваш код было легче читать.
Майкл Л.
0

При использовании try-with-resources писатель будет автоматически закрыт:

import org.apache.commons.lang3.StringUtils;
final File file = new File("SomeFile");
try (PrintWriter writer = new PrintWriter(file))  {
    writer.print(StringUtils.EMPTY);                
}
// here we can be sure that writer will be closed automatically
Бартек
источник
0

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


источник
-2

вы можете написать общий метод как (это слишком поздно, но код ниже поможет вам / другим)

public static FileInputStream getFile(File fileImport) throws IOException {
      FileInputStream fileStream = null;
    try {
        PrintWriter writer = new PrintWriter(fileImport);
        writer.print(StringUtils.EMPTY);
        fileStream = new FileInputStream(fileImport);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            writer.close();
        }
         return fileStream;
}
Vishal
источник
5
Это не создает пустой файл, он создает файл с одним нулевым байтом в нем.
Marquis of Lorne