前言

众所周知,Java中有多种针对文件的操作类,以面向字节流和字符流可分为两大类,这里以写入为例:

面向字节流的:FileOutputStream 和 BufferedOutputStream

面向字符流的:FileWriter 和 BufferedWriter

近年来发展出New I/O ,也叫NIO,里面又包装了两个类:NewOutputStream 和 NewBufferedWriter

现在,我们建立测试程序,比较这些类写入文件的性能。

机器配置

Processor Name: Intel Core i7

Processor Speed: 2.2 GHz

Number of Processors: 1

Total Number of Cores: 4

L2 Cache (per Core): 256 KB

L3 Cache: 6 MB

Memory: 16 GB

测试程序

纵向比较:几种文件操作类向文件中写入相同行数的内容(每行内容均为“写入文件Datan”),比较其耗费时间

横向比较:对于同一个文件操作类,比较写入不同行数内容情况下所耗费时间;本文以2的次方指数级增长行数

1 importjava.io.File;2 importjava.io.FileOutputStream;3 import java.io.*;4 importjava.nio.file.Files;5 importjava.nio.file.Paths;6

7 public classtestFileIO {8

9 public static void testDriver () throwsIOException {10 int maxlineNum = 100000001;//写入文件的最大行数

11 int startlineNum = 1;//写入文件的行数

12 int Multiplying = 2;//行数增长倍率

13

14 long begin = 0L;15 long end = 0L;16

17 //将时间统计写入文件Result.txt中

18 FileWriter fileWriter = new FileWriter("./Result.txt", true);19 BufferedWriter bufferedWriter = newBufferedWriter(fileWriter);20

21 System.out.println("Test FileOutputStream begin.");22 for (int lineNum = startlineNum; lineNum < maxlineNum; lineNum *=Multiplying) {23 begin =System.currentTimeMillis();24 testFileOutputStream(lineNum);25 end =System.currentTimeMillis();26 long timeElapse_FileOutputStream = end -begin;27 bufferedWriter.write(String.valueOf(timeElapse_FileOutputStream)+"t");28 }29 System.out.println("Test FileOutputStream end.n");30

31 System.out.println("Test BufferedOutputStream begin.");32 bufferedWriter.write("n");33 for (int lineNum = startlineNum; lineNum < maxlineNum; lineNum *=Multiplying) {34 begin =System.currentTimeMillis();35 testBufferedOutputStream(lineNum);36 end =System.currentTimeMillis();37 long timeElapse_BufferedOutputStream = end -begin;38 bufferedWriter.write(String.valueOf(timeElapse_BufferedOutputStream)+"t");39 }40 System.out.println("Test BufferedOutputStream end.n");41

42 System.out.println("Test FileWriter begin.");43 bufferedWriter.write("n");44 for (int lineNum = startlineNum; lineNum < maxlineNum; lineNum *=Multiplying) {45 begin =System.currentTimeMillis();46 testFileWriter(lineNum);47 end =System.currentTimeMillis();48 long timeElapse_FileWriter = end -begin;49 bufferedWriter.write(String.valueOf(timeElapse_FileWriter)+"t");50 }51 System.out.println("Test FileWriter end.n");52

53 System.out.println("Test BufferedWriter begin.");54 bufferedWriter.write("n");55 for (int lineNum = startlineNum; lineNum < maxlineNum; lineNum *=Multiplying) {56 begin =System.currentTimeMillis();57 testBufferedWriter(lineNum);58 end =System.currentTimeMillis();59 long timeElapse_BufferedWriter = end -begin;60 bufferedWriter.write(String.valueOf(timeElapse_BufferedWriter)+"t");61 }62 System.out.println("Test BufferedWriter end.n");63

64 System.out.println("Test NewOutputStream begin.");65 bufferedWriter.write("n");66 for (int lineNum = startlineNum; lineNum < maxlineNum; lineNum *=Multiplying) {67 begin =System.currentTimeMillis();68 testNewOutputStream(lineNum);69 end =System.currentTimeMillis();70 long timeElapse_NewOutputStream = end -begin;71 bufferedWriter.write(String.valueOf(timeElapse_NewOutputStream)+"t");72 }73 System.out.println("Test NewOutputStream end.n");74

75 System.out.println("Test NewBufferedWriter begin.");76 bufferedWriter.write("n");77 for (int lineNum = startlineNum; lineNum < maxlineNum; lineNum *=Multiplying) {78 begin =System.currentTimeMillis();79 testNewBufferedWriter(lineNum);80 end =System.currentTimeMillis();81 long timeElapse_NewBufferedWriter = end -begin;82 bufferedWriter.write(String.valueOf(timeElapse_NewBufferedWriter)+"t");83 }84 System.out.println("Test NewOutputStream end.n");85

86 bufferedWriter.close();87 }88

89 /************************** I/O *****************************/

90 //面向字节

91 public static void testFileOutputStream (int lineNum) throwsIOException {92 FileOutputStream fileOutputStream = new FileOutputStream(new File("./testFileOutputStream.txt"));93 while (--lineNum > 0) {94 fileOutputStream.write("写入文件Datan".getBytes());95 }96 fileOutputStream.close();97 }98

99 public static void testBufferedOutputStream (int lineNum) throwsIOException {100 FileOutputStream fileOutputStream = new FileOutputStream(new File("./testBufferedOutputStream.txt"));101 BufferedOutputStream bufferedOutputStream = newBufferedOutputStream(fileOutputStream);102 while (--lineNum > 0) {103 bufferedOutputStream.write("写入文件Datan".getBytes());104 }105 bufferedOutputStream.close();106 }107

108 //面向字符

109 public static void testFileWriter (int lineNum) throwsIOException {110 FileWriter fileWriter = new FileWriter("./testFileWriter.txt");111 while (--lineNum > 0) {112 fileWriter.write("写入文件Datan");113 }114 fileWriter.close();115 }116

117 public static void testBufferedWriter (int lineNum) throwsIOException {118 FileWriter fileWriter = new FileWriter("./testBufferedWriter.txt");119 BufferedWriter bufferedWriter = newBufferedWriter(fileWriter);120 while (--lineNum > 0) {121 bufferedWriter.write("写入文件Datan");122 }123 bufferedWriter.close();124 }125

126

127 /************************** NIO ****************************/

128 public static void testNewOutputStream (int lineNum) throwsIOException {129 OutputStream outputStream = Files.newOutputStream(Paths.get("./testNewOutputStream.txt"));130 while (--lineNum > 0) {131 outputStream.write("写入文件Datan".getBytes());132 }133 outputStream.close();134 }135

136 public static void testNewBufferedWriter (int lineNum) throwsIOException {137 BufferedWriter newBufferedReader = Files.newBufferedWriter(Paths.get("./testNewBufferedWriter.txt"));138 while (--lineNum > 0) {139 newBufferedReader.write("写入文件Datan");140 }141 newBufferedReader.close();142 }143

144

145 public static void main (String[] args) throwsIOException {146 //多次测试时可清空result.txt文件

147 FileWriter fileWriter = new FileWriter("./Result.txt");148 testDriver();149 }150 }

测试结果

从上图可以看出,写入行数超过20W以上时,FileOutputStream和NewOutputStream耗费时间远远超出其他4个类。为了清晰,让我们放大其他4个类的图:

可以看出,这4个类中,BufferWriter和NewBufferedWriter所耗费时间更少,但总体差别不是很大。

让我们再来看看,写入26W行数据以下时的情况:

可以看出,在数据量较小的情况下,这4个类所耗费时间的差异并不是很大,在更小的数据量下,它们的效率几乎没有差别。

后记

从以上分析可知(注意横坐标写入行数是指数级增加的),各个类的时间复杂度大致为O(1/kn),其中不同的类的k不同,导致了最终巨大的差异。

这里只给出了测试结果,并未分析其底层实现原理,欢迎评论区留言。

另外,我没有在其他机器测试,有兴趣的小伙伴可以将自己的测试结果发出来,共同进步^_^

附件

本次测试数据结果(若看不清,可以下载到本地看)

java 高性能读写文件_Java写入文件的性能详细分析相关推荐

  1. java写入文件不覆盖写入_Java写入文件–用Java写入文件的4种方法

    java写入文件不覆盖写入 Java provides several ways to write to file. We can use FileWriter, BufferedWriter, ja ...

  2. java文件写入不覆盖_java写入文件不覆盖写入_Java写入文件–用Java写入文件的4种方法...

    java写入文件不覆盖写入 Java provides several ways to write to file. We can use FileWriter, BufferedWriter, ja ...

  3. scala 写入文件_Scala文件IO –写入文件,读取文件

    scala 写入文件 Today we will look into Scala File IO operations. File operations mainly include reading ...

  4. python读取写入文件_Python读取文件,写入文件,打开文件,删除文件,复制文件

    python读取写入文件 In this tutorial we are going to learn about Python File Operations such as python read ...

  5. Go 打开文件,写入文件。

    demo.go(打开文件,写入文件): package mainimport ("fmt""io""os" )func main() {// ...

  6. java 内存读写文件_Java的文件读写操作

    file(内存)----输入流---->[程序]----输出流---->file(内存) 当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader,InputStr ...

  7. java写入dat文件_java写入dat文件

    Java的输入输出包括字节流.文件流.对象流等,要注意区分不同流使用的不同类.字... Java的输入输出包括字节流.文件流.对象流等,要注意区分不同流使用的不同类.字... Java的输入输出包括字 ...

  8. java文件流写入文件_JAVA IO流编程 实现文件的写入、写出以及拷贝

    一.流的概念 流:数据在数据源(文件)和程序(内存)之间经历的路径. 输入流:数据从数据源(文件)到程序(内存)的路径. 输出流:数据从程序(内存)到数据源(文件)的路径. 以内存为参照,如果数据向内 ...

  9. java 数据写入txt乱码_java写入文件是乱码

    java写入文件是乱码 我们读取.写入文件流时,经常会遇到乱码的现象,造成乱码的原因当然不可能是一个,这里主要介绍因为文件编码格式而导致的乱码的问题.首先,明确一点,文本文件与二进制文件的概念与差异. ...

最新文章

  1. 干货丨计算机视觉必读:图像分类、定位、检测,语义分割和实例分割方法梳理(经典长文,值得收藏)
  2. java反射三种_Java反射
  3. PHP Shell生成工具Weevely
  4. 弹性地基梁板法计算原理_建筑混凝土结构设计和计算方法,老师傅总结:其原理就是这么简单...
  5. ACCESS 文本文件导入和导出指定字段类型的方法
  6. linux基础知识——创建进程
  7. 在Serverless Kubernetes集群中轻松运行Argo Workflow
  8. Catch him(HDU-2351)
  9. 转载文章:Microsoft 将僵尸网络威胁智能分析程序引入云中以提供近实时数据
  10. linux定时任务打印日志,Centos7(linux)使用crond服务定时执行js脚本并将脚本的输出内容记录日志文件的简单应用...
  11. Android攻城狮—TextView实现跑马灯
  12. Silverlight笔记:模态窗体的实现
  13. 猿创征文|网络安全的十大经典工具介绍
  14. 官方FastReport 2021最新中文开发者指南
  15. 关于计算机网络以下说法哪个正确().,青书学堂: (多选题) 关于计算机网络,以下说法哪个正确?( )(本题4.0分)...
  16. 微信公众号创建菜单报错40016
  17. 微信聊天防封 亲测 百分之95有效 【附源码】
  18. Easyui设置easyui-textbox不可编辑
  19. matlab与maple互联,Maple与Matlab
  20. 如何实现RTS游戏中鼠标在屏幕边缘时移动视角

热门文章

  1. vs2015 c++11 log4cplus 中文问题
  2. GRPS 与WIFI环境下,REST中的Delete方法不被支持
  3. 六月集训(第15天) —— 深度优先搜索
  4. RS485 转光纤_光猫使用说明书(工业级)
  5. 谷歌浏览器官方下载地址
  6. 数字量产工具:输入系统-触摸屏编程
  7. 机器学习分类算法(二)-KNN(近邻)算法
  8. 汽车云市场:华为云、百度云上演追逐战
  9. Google Scholar英文写作工具使用
  10. 【C++】爱因斯坦台阶问题