2017-06-05 45 views
-2

我想知道是否有可能使用通道和緩衝區(來自java.nio)來讀取/寫入從文件創建的對象類型?例如,下面是一個代碼示例(不使用「finally」或者甚至更好的try-with-ressources既不關閉文件,因爲它不是代碼的一部分,只是一個例子來說明我爲什麼要問這個問題)。是否可以使用通道和緩衝區(java.nio)讀取/寫入從文件創建的對象類型?

import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.nio.CharBuffer; 
import java.nio.channels.FileChannel; 

public class Main { 
public static void main(String[] args) { 

FileInputStream fis; 
BufferedInputStream bis; 
FileChannel fc; 

try { 
    fis = new FileInputStream(new File("test.txt")); 
    bis = new BufferedInputStream(fis); 
    //initializing timer 
    long time = System.currentTimeMillis(); 
    //reading 
    while(bis.read() != -1); 
    //execution time 
    System.out.println("Execution time with a conventionnal buffer (BufferedInputStream) : " + (System.currentTimeMillis() - time)); 

    //again 
    fis = new FileInputStream(new File("test.txt")); 
    //but we catch the channel 
    fc = fis.getChannel(); 
    //from that we deduce the size 
    int size = (int)fc.size(); 
    //We create a buffer corresponding to the size of the file 
    ByteBuffer bBuff = ByteBuffer.allocate(size); 

    //initializing the timer 
    time = System.currentTimeMillis(); 
    //starting reading 
    fc.read(bBuff); 
    //preparing reading calling flip 
    bBuff.flip(); 
    //printing execution time 
    System.out.println("Execution time with a new buffer (java.nio Buffer) : " + (System.currentTimeMillis() - time)); 

} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
} 
} 

當我執行這個代碼(test.txt的是一個4沫文件),I可以看到,執行時間是與所述第二方法的速度比與第一個10倍左右。在這個例子中,它是用一個字節緩衝區完成的,但是你可以用任何一種基本類型(IntBuffer,CharBuffer,...)來完成它;

是否有可能使用第二種方法(使用java.nio緩衝區)和我創建的對象類型?或者我應該使用第一種方法(使用BufferedInoutStream)與它像:

ObjectInputStream ois = new ObjectInputStream(
          new BufferedInputStream(
           new FileInputStream(
            new File("test.txt")))); 

回答

0
  1. 你的基準是無效的,因爲它僅測試在第二種情況下有底漆的緩存。嘗試使用兩個不同的文件,或以其他順序嘗試。你不會得到相同的結果。
  2. 在任何情況下,您的測試都不具有遠程可比性。在第一種情況下,您應該計時的時間是bis.read(byte[]),與第二種情況中的緩衝區大小相同。

當您運行有效測試時,您會發現幾乎沒有差異,因此對您的問題沒有動機。根據第一個示例使用BufferedInputStream

相關問題