这两者之间有什么区别?
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还提出了一种方法来确定默认字符集的传统环境驱动选择。