1. 程式人生 > >Java多種IO方式的實現與效能對比

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