使用java.nio.Files或java.io类创建java.io.BufferedWriter



这两者之间有什么区别?

Path path = FileSystems.getDefault().getPath("file.txt");
BufferedWriter bw = Files.newBufferedWriter(path);

BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"));

这两种方法中哪一种更好?

Files.newBufferedWriter使用的默认字符集是UTF8,但在JDK18之前的JVM中,新的FileWriter将默认为Java平台系统属性file.encoding,该属性可能不是UTF8。

如果您是文件的编写者和读取器,则最安全的做法是使用UTF8版本-使用Files.newBufferedReader/Writer,或者为样式FileReader/Writer/Files.newBufferedReader/Writer提供字符集参数。

这避免了在多个JDK和/或默认字符集可能不同的位置部署同一应用程序时出现问题,因为您可能会在一个位置写入文件,而从不同位置读取的同一个应用程序似乎已损坏。

从JDK18开始,JEP400:UTF-8默认值意味着FileWriter的默认字符集也是UTF-8,以前的平台默认值存储为新的系统属性native.encoding。如果您在JDK18之前的版本中使用FileWriter而没有指定字符编码,那么在升级到JDK18+之前测试并修复您的应用程序将是一个好主意。这可以通过以下方式完成:

// pre-JDK18 only:
java -Dfile.encoding=UTF-8 ...

JEP提到file.encoding=COMPAT模式,以在运行JDK18+时保持JDK18之前的行为,这样您就可以混合使用JDK18+之前的JDK18部署,或者留出更多时间来解析字符集定义。JEP还提出了一种方法来确定默认字符集的传统环境驱动选择。

相关内容

最新更新