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


89

Я хочу скопіювати вміст файлу "A" у файл "B". Після закінчення копіювання я хочу очистити вміст файлу "А" і хочу писати на ньому з самого початку. Я не можу видалити файл "А", оскільки він пов'язаний з іншим завданням.

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

Відповіді:


134

Просто надрукуйте у файлі порожній рядок:

PrintWriter writer = new PrintWriter(file);
writer.print("");
writer.close();

14
Запис не є необхідним, і якщо інше завдання відкриває файл, відкрити його може бути навіть неможливо.
Маркіз Лорнський

письменник.закрити ??, ми в 2017 році !!!. Також не потрібно друкувати (""), оскільки текст буде перезаписано
FSm

1
@Andro, помітив позначку часу та теги? Тоді я пам’ятаю, що це був найнадійніший спосіб очистити файл на пристроях Android.
Влад

@Vlad Якщо зараз немає необхідності закривати автора, можливо, це гарна ідея оновити відповідь?
Лінія

70

Я не вірю, що вам навіть потрібно писати порожній рядок у файл.

PrintWriter pw = new PrintWriter("filepath.txt");
pw.close();

9
Ви праві в цьому. Усі відповіді, що показують запис, є помилковими або в кращому випадку зайвими.
Маркіз Лорнський

33
Як щодо просто new PrintWriter("filepath.txt").close();?
Супухстар

1
цитата з java docs "Якщо файл існує, він буде усічений до нульового розміру"
Пінкертон,

1
але що робити, якщо файл знаходиться в режимі додавання.
GURMEET SINGH

О, людино, я не вірю, що пропустив просту відповідь. Відкрити файл у режимі усічення. Я настільки ненавиджу режим усічення, що він мене підсунув.

30

Вам потрібен метод setLength () у класі RandomAccessFile.


5
Це фактично єдина правильна відповідь, оскільки вона не видаляє файл. Усі інші відповіді відповідають.
Маркіз Лорнський

Мені це потрібно, оскільки я хотів би очистити файл журналу, створений бібліотекою logback-android . Якщо я видаляю файл журналу вручну, бібліотека недостатньо розумна, щоб створити його знову, якщо є журнал для запису, поки я не перезапущу свою програму. Тому я використав цей метод і працюю. Я мало вчився. Хіба це не найкращий підхід? Будь ласка, порадь.
Yeung

смішно, у мене проблема з виробництвом, тому що картка Intenso класу 10 зависає (і змушує скидати батарею), коли я викликаю fileOnSdCard.setLength (0) для програми, встановленої з файлу .apk. Їхня картка класу 4 ніколи не показувала проблеми.
Путратор

17

Просто, нічого не пишіть!

FileOutputStream writer = new FileOutputStream("file.txt");
writer.write(("").getBytes());
writer.close();

3
-1: java.lang.String не має методу toByteArray () ні в 6, ні в 7. docs.oracle.com/javase/6/docs/api/java/lang/String .
james.garriss

1
Він існує довгий час: docs.oracle.com/javase/6/docs/api/java/lang/…
kmas

1
Запис тут непотрібний.
Маркіз Лорнський

10

Один вкладиш для операції зрізання:

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

6

Як щодо нижче:

File temp = new File("<your file name>");
if (temp.exists()) {
    RandomAccessFile raf = new RandomAccessFile(temp, "rw");
    raf.setLength(0);
}

5

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


5

Одним з найкращих супутників Java є Apache Projects, і будь ласка, зверніться до нього. Для роботи з файлами ви можете звернутися до проекту Commons IO .

Код нижче одного рядка допоможе нам зробити файл порожнім.

FileUtils.write(new File("/your/file/path"), "")


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! Будь ласка, використовуйте вбудовані засоби форматування, щоб полегшити читання коду.
Michael L.

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;
}

5
Це не створює порожній файл, він створює файл з одним нульовим байтом.
Маркіз Лорнський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.