Очистить содержимое файла в Java с помощью RandomAccessFile

Я пытаюсь очистить содержимое файла, созданного в java. Файл создается вызовом PrintWriter. Я прочитал здесь, что можно используйте RandomAccessFile для этого и где-то читал, что это на самом деле лучше использовать, чем вызывать новый PrintWriter и немедленно закрывать его, чтобы перезаписать файл пустым.

Однако использование RandomAccessFile не работает, и я не понимаю, почему. Вот основная схема моего кода.

PrintWriter writer = new PrintWriter("temp","UTF-8");

while (condition) {
writer.println("Example text");

if (clearCondition) {
new RandomAccessFile("temp","rw").setLength(0);
      //  Although the solution in the link above did not include ',"rw"'
      //  My compiler would not accept without a second parameter
writer.println("Text to be written onto the first line of temp file");
}
}
writer.close();

Выполнение эквивалента приведенного выше кода дает моему временному файлу содержимое:
(Давайте представим, что программа дважды зациклилась до того, как было выполнено clearCondition)

Example Text
Example Text
Text to be written onto the first line of temp file



ПРИМЕЧАНИЕ. Модуль записи должен иметь возможность снова записать пример текста в файл после очистки файла. ClearCondition не означает, что цикл while прерывается.


person ErikAGriffin    schedule 31.01.2014    source источник


Ответы (2)


Вы хотите либо сбросить PrintWriter, чтобы убедиться, что изменения в его буфере записаны первыми, прежде чем вы установите длину RandomAccessFile в 0, либо закрыть его и повторно открыть новый PrintWriter, чтобы записать последнюю строку (Текст для записи. ..). Желательно первое:

if (clearCondition) {
writer.flush();
new RandomAccessFile("temp","rw").setLength(0);
person Martin Dinov    schedule 31.01.2014
comment
Таким образом, добавление writer.flush() привело к тому, что ^@ (который, как я полагаю, является нулевым символом UNIX) был записан в файл количество раз, равное (numberOfcharactersPreviouslywrite + 1) * timesLooped. Предыдущий текст был удален, но эти символы ^@^@ появляются перед новым текстом. - person ErikAGriffin; 01.02.2014
comment
Предпочтительнее последнее на самом деле. Первый может работать не на всех платформах, например, на Windows. - person user207421; 01.02.2014

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

Что вам нужно сделать, так это закрыть PrintWriter и открыть новый без параметра «добавить» или с «добавить», установленным на «ложь».

person user207421    schedule 31.01.2014
comment
Я не верю, что смогу сделать то, что вы предлагаете, потому что после очистки файла исходный «писатель» все еще должен иметь возможность добавлять текст в файл. - person ErikAGriffin; 01.02.2014
comment
Почему? Почему вы не можете просто присвоить новый PrintWriter этой переменной «писатель»? Я не верю, что ты даже пробовал это. - person user207421; 01.02.2014