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