Java PrintWriter文件覆盖

Java PrintWriter文件覆盖,java,file,io,printwriter,writer,Java,File,Io,Printwriter,Writer,我想使用UTF-16写入一个文件,所以我使用了PrintWriterfile,UTF-16,但它会删除文件中的所有内容,我可以使用FileWriterfile,true,但它不会在UTF-16中,而且显然没有像PrintWriterWriter、Charset、boolean append这样的PrintWriter构造函数 我应该怎么做?使用带有UTF-16字符集的OutputStreamWriter,包装使用append=true打开的FileOutputStream。备选方案,使用File

我想使用UTF-16写入一个文件,所以我使用了PrintWriterfile,UTF-16,但它会删除文件中的所有内容,我可以使用FileWriterfile,true,但它不会在UTF-16中,而且显然没有像PrintWriterWriter、Charset、boolean append这样的PrintWriter构造函数

我应该怎么做?

使用带有UTF-16字符集的OutputStreamWriter,包装使用append=true打开的FileOutputStream。备选方案,使用Files.newBufferedWriter:

使用带有UTF-16字符集的OutputStreamWriter,包装使用append=true打开的FileOutputStream。备选方案,使用Files.newBufferedWriter:

你可以使用

new PrintWriter(new OutputStreamWriter(new FileOutputStream(file, true), "UTF-16"));
你可以使用

new PrintWriter(new OutputStreamWriter(new FileOutputStream(file, true), "UTF-16"));
FileWriter的JavaDoc说明:

此类的构造函数假定默认字符编码和默认字节缓冲区大小是可接受的。要自己指定这些值,请在FileOutputStream上构造OutputStreamWriter

因此,您可以:

 Writer writer = new PrintWriter(
     new OutputStreamWriter(
           new FileOutputStream(filename, true),
           StandardCharsets.UTF16));
您可能也希望在其中包含BufferedOutputStream以获得最高效率。

FileWriter的JavaDoc说明:

此类的构造函数假定默认字符编码和默认字节缓冲区大小是可接受的。要自己指定这些值,请在FileOutputStream上构造OutputStreamWriter

因此,您可以:

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

您可能也希望在其中包含BufferedOutputStream以获得最大效率。

您可以先读取所有内容,更新数据,然后将其重写到新文件中?@tima:据我所知,它不是该文件的副本。里面没有处理追加和指定编码的内容。@KenReid追加到文件是一件非常主流的事情。从一开始就不必先把文件弄脏再重写。这通常是低效的。在某些情况下,该文件无法放入内存。您可以先读取所有内容,更新数据,然后将其重写为新文件?@tima:据我所知,它不是该文件的副本。里面没有处理追加和指定编码的内容。@KenReid追加到文件是一件非常主流的事情。从一开始就不必先把文件弄脏再重写。这通常是低效的。在某些情况下,该文件无法放入内存。