Вопрос-ответ

How to append text to an existing file in Java?

Как добавить текст к существующему файлу в Java?

Мне нужно повторно добавить текст к существующему файлу в Java. Как мне это сделать?

Переведено автоматически
Ответ 1

Вы делаете это для ведения журнала? Если да, то для этого есть несколько библиотек. Двумя наиболее популярными являются Log4j и Logback.

Java 7+

Для одноразовой задачи класс Files упрощает это:

try {
Files.write(Paths.get("myfile.txt"), "the text".getBytes(), StandardOpenOption.APPEND);
}catch (IOException e) {
//exception handling left as an exercise for the reader
}

Осторожно: описанный выше подход выдастNoSuchFileException, если файл еще не существует. Он также не добавляет новую строку автоматически (что часто требуется при добавлении в текстовый файл). Другой подход заключается в передаче обоих параметров CREATE и APPEND, которые сначала создадут файл, если он еще не существует:

private void write(final String s) throws IOException {
Files.writeString(
Path.of(System.getProperty("java.io.tmpdir"), "filename.txt"),
s + System.lineSeparator(),
CREATE, APPEND
);
}

Однако, если вы будете выполнять запись в один и тот же файл много раз, приведенные выше фрагменты должны открывать и закрывать файл на диске много раз, что является медленной операцией. В этом случае a BufferedWriter выполняется быстрее.:

try(FileWriter fw = new FileWriter("myfile.txt", true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw))
{
out.println("the text");
//more code
out.println("more text");
//more code
} catch (IOException e) {
//exception handling left as an exercise for the reader
}

Примечания:


  • Второй параметр конструктора FileWriter укажет ему добавить к файлу, а не записывать новый файл. (Если файл не существует, он будет создан.)

  • Использование BufferedWriter рекомендуется для дорогостоящего разработчика (такого как FileWriter).

  • Использование a PrintWriter дает вам доступ к println синтаксису, к которому вы, вероятно, привыкли из System.out.

  • Но обертки BufferedWriter и PrintWriter не являются строго необходимыми.


Более старая Java

try {
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}

Обработка исключений

Если вам нужна надежная обработка исключений для старой Java, она становится очень подробной:

FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter out = null;
try {
fw = new FileWriter("myfile.txt", true);
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
finally {
try {
if(out != null)
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(bw != null)
bw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(fw != null)
fw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
}
Ответ 2

Вы можете использовать fileWriter с флагом, установленным в true , для добавления.

try
{
String filename= "MyFile.txt";
FileWriter fw = new FileWriter(filename,true); //the true will append the new data
fw.write("add a line\n");//appends the string to the file
fw.close();
}
catch(IOException ioe)
{
System.err.println("IOException: " + ioe.getMessage());
}
Ответ 3

Не должны ли все ответы здесь с блоками try / catch содержать фрагменты .close(), содержащиеся в блоке finally?

Пример отмеченного ответа:

PrintWriter out = null;
try {
out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)));
out.println("the text");
} catch (IOException e) {
System.err.println(e);
} finally {
if (out != null) {
out.close();
}
}

Также, начиная с Java 7, вы можете использовать инструкцию try-with-resources. Для закрытия объявленных ресурсов не требуется блок finally, поскольку он обрабатывается автоматически, а также является менее подробным:

try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)))) {
out.println("the text");
} catch (IOException e) {
System.err.println(e);
}
Ответ 4

Использование Apache Commons 2.1:

import org.apache.logging.log4j.core.util.FileUtils;

FileUtils.writeStringToFile(file, "String to append", true);
java