Java多种IO方式的实现与性能对比
一、概述:
(1)Input:这个input是对计算机内存而言的,也就是从外部文件读取信息到内存中,采用了五种方式
(2)Output:这个Output是对计算机内存而言的,也就是从将信息写入外部文件,采用了四种方式
二、具体实现:
(1)Input
A、 InputStream:
下面的关键代码为in.read(fileContent);
FileInputStreamin = new FileInputStream(filePath);
byte[]fileContent = new byte[in.available()];
in.read(fileContent);
in.close();
B、 BufferedReader:
下面的关键代码为br.readLine()
BufferedReaderbr = new BufferedReader(new FileReader(filePath));
line =br.readLine();
C、 Buffer/Channel:
下面的关键代码为buf.flip();buf.get(fileContent);
RandomAccessFilerandomAccessFile = new RandomAccessFile(filePath, "r");
FileChannel fromChannel =randomAccessFile.getChannel();
long target = fromChannel.size();
ByteBuffer buf = ByteBuffer.allocate((int)target);
fromChannel.read(buf);
buf.flip();
byte[] fileContent = new byte[buf.remaining()];
buf.get(fileContent);
D、 Files:
byte[]dataBytes = Files.readAllBytes(Paths.get(filePath));
E、 Scanner:
while(sc.hasNextLine()) { line = sc.nextLine();}
(2)Output:
A、 OutputStream:
下面的关键代码为out.write(graphGrammarBytes);
FileOutputStreamout = new FileOutputStream(file);
out.write(graphGrammarBytes);
out.close();
B、 BufferedWriter:
下面的关键代码为writer.write(graphGrammar);
OutputStreamWriterwrite = new OutputStreamWriter(new FileOutputStream(file));
BufferedWriterwriter = new BufferedWriter(write);
writer.write(graphGrammar);
writer.flush();
将write,writer关闭
C、 Buffer/Channel:
与读文件的区别在于将用grammar构造好的byteBuffer写进通道
toChannel.write(byteBuffer);
D、 Files:
下面的关键代码为writer.write(graphGrammar);
BufferedWriterwriter = Files.newBufferedWriter(Paths.get(filePath + "_Written"),StandardCharsets.UTF_8);
writer.write(graphGrammar);
writer.flush();
writer.close();
三、性能对比:
精准收集io的时间,只考虑内存与磁盘交换的时间,对于一个30M的的txt文件,结果如下所示
四、总结分析:
由于我测量每种io的时间时,采用的精准测量,只测量了io的时间,然而io的时间很大一部分是由垃圾回收决定的,而垃圾回收又具有偶然性。
虽然如此,结合上图,找到相同的部分,还是可以看出哪种io效率比较高的,
对于写来说,Files的效率最高,Writer次之
对于读来说,Scanner>Channel>Files