java 高性能读写文件_Java写入文件的性能详细分析
前言
众所周知,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写入文件的性能详细分析相关推荐
- java写入文件不覆盖写入_Java写入文件–用Java写入文件的4种方法
java写入文件不覆盖写入 Java provides several ways to write to file. We can use FileWriter, BufferedWriter, ja ...
- java文件写入不覆盖_java写入文件不覆盖写入_Java写入文件–用Java写入文件的4种方法...
java写入文件不覆盖写入 Java provides several ways to write to file. We can use FileWriter, BufferedWriter, ja ...
- scala 写入文件_Scala文件IO –写入文件,读取文件
scala 写入文件 Today we will look into Scala File IO operations. File operations mainly include reading ...
- python读取写入文件_Python读取文件,写入文件,打开文件,删除文件,复制文件
python读取写入文件 In this tutorial we are going to learn about Python File Operations such as python read ...
- Go 打开文件,写入文件。
demo.go(打开文件,写入文件): package mainimport ("fmt""io""os" )func main() {// ...
- java 内存读写文件_Java的文件读写操作
file(内存)----输入流---->[程序]----输出流---->file(内存) 当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader,InputStr ...
- java写入dat文件_java写入dat文件
Java的输入输出包括字节流.文件流.对象流等,要注意区分不同流使用的不同类.字... Java的输入输出包括字节流.文件流.对象流等,要注意区分不同流使用的不同类.字... Java的输入输出包括字 ...
- java文件流写入文件_JAVA IO流编程 实现文件的写入、写出以及拷贝
一.流的概念 流:数据在数据源(文件)和程序(内存)之间经历的路径. 输入流:数据从数据源(文件)到程序(内存)的路径. 输出流:数据从程序(内存)到数据源(文件)的路径. 以内存为参照,如果数据向内 ...
- java 数据写入txt乱码_java写入文件是乱码
java写入文件是乱码 我们读取.写入文件流时,经常会遇到乱码的现象,造成乱码的原因当然不可能是一个,这里主要介绍因为文件编码格式而导致的乱码的问题.首先,明确一点,文本文件与二进制文件的概念与差异. ...
最新文章
- 干货丨计算机视觉必读:图像分类、定位、检测,语义分割和实例分割方法梳理(经典长文,值得收藏)
- java反射三种_Java反射
- PHP Shell生成工具Weevely
- 弹性地基梁板法计算原理_建筑混凝土结构设计和计算方法,老师傅总结:其原理就是这么简单...
- ACCESS 文本文件导入和导出指定字段类型的方法
- linux基础知识——创建进程
- 在Serverless Kubernetes集群中轻松运行Argo Workflow
- Catch him(HDU-2351)
- 转载文章:Microsoft 将僵尸网络威胁智能分析程序引入云中以提供近实时数据
- linux定时任务打印日志,Centos7(linux)使用crond服务定时执行js脚本并将脚本的输出内容记录日志文件的简单应用...
- Android攻城狮—TextView实现跑马灯
- Silverlight笔记:模态窗体的实现
- 猿创征文|网络安全的十大经典工具介绍
- 官方FastReport 2021最新中文开发者指南
- 关于计算机网络以下说法哪个正确().,青书学堂: (多选题) 关于计算机网络,以下说法哪个正确?( )(本题4.0分)...
- 微信公众号创建菜单报错40016
- 微信聊天防封 亲测 百分之95有效 【附源码】
- Easyui设置easyui-textbox不可编辑
- matlab与maple互联,Maple与Matlab
- 如何实现RTS游戏中鼠标在屏幕边缘时移动视角