直接緩存
直接緩存相比與緩存而言庆聘,加快了I/O速度,使用一種特殊方式為其分配內(nèi)存的緩沖區(qū),原本硬盤與應(yīng)用程序之間信息的交互是通過(guò)內(nèi)核地址空間與用戶地址空間竭沫,兩者里面開(kāi)辟各開(kāi)辟一個(gè)緩存區(qū),這便是ByteBuffer.allocation(int capacity)方法的實(shí)現(xiàn)骑篙,而直接緩存是通過(guò)開(kāi)辟一個(gè)物理內(nèi)存蜕提,從而硬盤與應(yīng)用程序之間的交互只存在物理內(nèi)存這一層,避免了將緩存區(qū)的內(nèi)容拷貝到一個(gè)中間緩存區(qū)或者從一個(gè)中間緩存區(qū)拷貝數(shù)據(jù)靶端。
public class DirectDemo {
public static void main(String[] args) throws IOException {
//從系統(tǒng)硬盤中讀取文件內(nèi)容
String file="E://a.txt";
FileInputStream fileInputStream = new FileInputStream(file);
FileChannel channel = fileInputStream.getChannel();
//直接申請(qǐng)物理內(nèi)存
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
//向系統(tǒng)硬盤中讀入文件內(nèi)容
FileOutputStream fileOutputStream = new FileOutputStream("E://b.txt");
FileChannel channel1 = fileOutputStream.getChannel();
while (true){
buffer.clear();
//數(shù)據(jù)讀入到直接緩存中
int read = channel.read(buffer);
if (read==-1){
break;
}
buffer.flip();
//數(shù)據(jù)從緩存中讀入到硬盤中
channel1.write(buffer);
}
}
}
內(nèi)存映射
內(nèi)存映射是一種讀和寫文件數(shù)據(jù)的方法谎势,可以比常規(guī)的基于流或者通道的I/O快得多,內(nèi)存映射文件I/O通過(guò)使文件中的數(shù)據(jù)表現(xiàn)為內(nèi)存數(shù)組的內(nèi)容來(lái)實(shí)現(xiàn)杨名,也就是說(shuō)把緩沖區(qū)跟文件系統(tǒng)進(jìn)行一個(gè)映射關(guān)聯(lián)脏榆,只要操作緩沖區(qū)里面的內(nèi)容,文件內(nèi)容也會(huì)跟著改變
public class FileMapper {
public static void main(String[] args) throws IOException {
RandomAccessFile file = new RandomAccessFile("E://a.txt","wr");
FileChannel channel = file.getChannel();
MappedByteBuffer map = channel.map(FileChannel.MapMode.READ_WRITE, 0, 1024);
map.put(0,(byte)79);
file.close();
}
}