Перезапись файла Java PrintWriter

Я хочу записать в файл, используя UTF-16, поэтому я использую PrintWriter(file,"UTF-16"), но тогда он удаляет все в файле, я мог бы использовать FileWriter(file,true), но тогда это не быть в UTF-16, и, по-видимому, нет конструктора для PrintWriter, такого как PrintWriter(Writer,Charset,boolean append);

Что я должен делать?


person DSOI__UNUNOCTIUM    schedule 14.08.2017    source источник
comment
Вы могли бы сначала прочитать все, обновить эти данные, а затем перезаписать их в новый файл?   -  person Dr Ken Reid    schedule 14.08.2017
comment
@tima: Насколько я понимаю, это не дубликат. Ничто там не обрабатывает добавление и с указанием кодировки.   -  person Jon Skeet    schedule 14.08.2017
comment
Добавление @KenReid к файлу - довольно распространенная вещь, которую нужно делать. Никогда не должно быть необходимости глотать файл, а затем переписывать его с самого начала. Часто это было бы неэффективно. В некоторых случаях файл не помещался в памяти.   -  person slim    schedule 14.08.2017


Ответы (3)


JavaDoc для FileWriter говорит:

Конструкторы этого класса предполагают, что кодировка символов по умолчанию и размер байтового буфера по умолчанию являются приемлемыми. Чтобы указать эти значения самостоятельно, создайте OutputStreamWriter на FileOutputStream.

Итак, вы можете сделать:

 Writer writer = new PrintWriter(
     new OutputStreamWriter(
           new FileOutputStream(filename, true),
           StandardCharsets.UTF16));

Возможно, вы также захотите включить BufferedOutputStream для максимальной эффективности.

person slim    schedule 14.08.2017

Используйте OutputStreamWriter с кодировкой UTF-16, обернув FileOutputStream открытым с append=true. Альтернативы, используйте Files.newBufferedWriter:

try (Writer writer = Files.newBufferedWriter(
        Paths.of("filename.txt"),
        StandardCharsets.UTF_16,
        StandardOpenOption.APPEND)) {
    ...
}
person Jon Skeet    schedule 14.08.2017

Вы можете сделать это с помощью

new PrintWriter(new OutputStreamWriter(new FileOutputStream(file, true), "UTF-16"));
person Thomas Fritsch    schedule 14.08.2017