在查看结果之前,我们先去对应的文件夹看看写入的文件是否正常,如下图所示:
从上述结果可以看出,每种方法都正常写入了 26 MB 的数据,它们最终执行的结果如下图所示:
从以上结果可以看出,字符流的操作速度最快,这是因为我们本次测试的代码操作的是字符串,所以在使用字节流时,需要先将字符串转换为字节流,因此在执行效率上不占优势。
从上述结果可以看出,性能最好的是带有缓冲区的字符串写入流 BufferedWriter
,性能最慢的是 Files
。
PS:以上的测试结果只是针对字符串的操作场景有效,如果操作的是二进制的文件,那么就应该使用带缓冲区的字节流 BufferedOutputStream。
6.扩展知识:内容追加
以上代码会对文件进行重写,如果只想在原有的基础上追加内容,就需要在创建写入流的时候多设置一个 append
的参数为 true
,比如如果我们使用 FileWriter
来实现文件的追加的话,实现代码是这样的:
public static void fileWriterMethod(String filepath, String content) throws IOException { // 第二个 append 的参数传递一个 true = 追加文件的意思 try (FileWriter fileWriter = new FileWriter(filepath, true)) { fileWriter.append(content); } }
如果使用的是 BufferedWriter
或 PrintWriter
,也是需要在构建 new FileWriter
类时多设置一个 append
的参数为 true
,实现代码如下:
try (BufferedWriter bufferedWriter = new BufferedWriter( new FileWriter(filepath, true))) { bufferedWriter.write(content); }
相比来说 Files
类要想实现文件的追加写法更加特殊一些,它需要在调用 write
方法时多传一个 StandardOpenOption.APPEND
的参数,它的实现代码如下:
Files.write(Paths.get(filepath), content.getBytes(), StandardOpenOption.APPEND);
7.总结
本文我们展示了 6 种写入文件的方法,这 6 种方法总共分为 3 类:字符流写入、字节流写入和 Files
类写入。其中操作最便利的是 Files
类,但它的性能不怎么好。如果对性能有要求就推荐使用带有缓存区的流来完成操作,如 BufferedWriter
或 BufferedOutputStream
。如果写入的内容是字符串的话,那么推荐使用 BufferedWriter
,如果写入的内容是二进制文件的话就推荐使用 BufferedOutputStream
。