-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"))));