国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java nio 之MappedByteBuffer

2019-11-17 04:01:59
字體:
來源:轉載
供稿:網友
其實掌握 MappedByteBuffer 并不難,只要記住“三方三法三特性”(我自己總結的,呵呵 ~~ 不要扔雞蛋哦。。。)這句話就可以輕松搞定! MappedByteBuffer 只是一種特殊的 ByteBuffer ,即是 ByteBuffer 的子類。 MappedByteBuffer 將文件直接映射到內存(這里的內存指的是虛擬內存,并不是物理內存,后面說證明這一點)。通常,可以映射整個文件,如果文件比較大的話可以分段進行映射,只要指定文件的那個部分就可以。而且,與 ByteBuffer 十分類似,沒有構造函數(你不可 new MappedByteBuffer ()來構造一個 MappedByteBuffer ),我們可以通過 java.nio.channels.FileChannel 的 map() 方法來獲取 MappedByteBuffer 。其實說的通俗一點就是 Map 把文件的內容被映像到計算機虛擬內存的一塊區域,這樣就可以直接操作內存當中的數據而無需操作的時候每次都通過 I/O 去物理硬盤讀取文件,所以效率上有很大的提升!

三種方式:

              FileChannel 提供了 map 方法來把文件影射為內存映像文件: MappedByteBuffer map(int mode,long position,long size); 可以把文件的從 position 開始的 size 大小的區域映射為內存映像文件, mode 指出了 可訪問該內存映像文件的方式: READ_ONLY,READ_WRITE,PRIVATE.                      

a. READ_ONLY, (只讀): 試圖修改得到的緩沖區將導致拋出 ReadOnlyBufferException .(MapMode.READ_ONLY )

       b. READ_WRITE (讀 / 寫): 對得到的緩沖區的更改最終將傳播到文件;該更改對映射到同一文件的其他程序不一定是可見的。 ( MapMode.READ_WRITE )

        c. PRIVATE (專用): 對得到的緩沖區的更改不會傳播到文件,并且該更改對映射到同一文件的其他程序也不是可見的;相反,會創建緩沖區已修改部分的專用副本。 ( MapMode.PRIVATE )

  

三個方法:

a. fore(); 緩沖區是 READ_WRITE 模式下,此方法對緩沖區內容的修改強行寫入文件

b. load() 將緩沖區的內容載入內存,并返回該緩沖區的引用

c. isLoaded() 如果緩沖區的內容在物理內存中,則返回真,否則返回假

三個特性:

調用信道的 map() 方法后,即可將文件的某一部分或全部映射到內存中,映射內存緩沖區是個直接緩沖區,繼承自 ByteBuffer, 但相對于 ByteBuffer, 它有更多的優點:

a. 讀取快

b. 寫入快

c. 隨時隨地寫入

       口說無憑,俗話說的好,是金子是銀子拿來煉一煉就知道 ( 也不知道有沒有這么一句俗話,反正用到這還合適,就這么湊合吧,大家扔雞蛋 ~~~) !

1 MappedByteBuffer 的讀取 / 寫入文件和普通 I/O 流的對比

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.nio.ByteBuffer;

import java.nio.CharBuffer;

import java.nio.MappedByteBuffer;

import java.nio.channels.FileChannel;

import java.nio.charset.Charset;

import java.nio.charset.CharsetDecoder;

  

  

public class MapMemeryBuffer {

       public static void main(String[] args) throws Exception {

              ByteBuffer byteBuf = ByteBuffer.allocate(1024 * 14 * 1024);

              byte[] bbb = new byte[14 * 1024 * 1024];

              FileInputStream fis = new FileInputStream("d://test");

              FileOutputStream fos = new FileOutputStream("d://outFile.txt");

              FileChannel fc = fis.getChannel();

              

              long timeStar = System.currentTimeMillis();// 得到當前的時間

  

              fc.read(byteBuf);//1 讀取

  

              long timeEnd = System.currentTimeMillis();// 得到當前的時間

  

              System.out.println("Read time :" + (timeEnd - timeStar) + "ms");

              timeStar = System.currentTimeMillis();

  

              fos.write(bbb);// 寫入

  

              timeEnd = System.currentTimeMillis();

              System.out.println("Write time :" + (timeEnd - timeStar) + "ms");

              fos.flush();

              fc.close();

              fis.close();

       }

}

輸出結果:

Read time :1874ms

Write time :360ms

把上面的程序的 1 換成 MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fileLength);

2 換成 mbb.flip();

輸出結果:

Read ByteBuf take time :16ms

Write ByteBuf take time :0ms

可見普通 I/O 和 MappedByteBuffer 是沒法比的。另外在寫入的時候花了 0ms 說明 Map 寫入機制是根據你的更改量來決定,就是只保存修改部分的!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 博爱县| 乾安县| 肥城市| 个旧市| 肃北| 长乐市| 丹寨县| 民县| 庄浪县| 龙海市| 横峰县| 蕲春县| 石家庄市| 铁力市| 阿合奇县| 连云港市| 宣城市| 彩票| 探索| 胶南市| 大兴区| 闽清县| 鹰潭市| 伊春市| 洮南市| 古丈县| 屯昌县| 翁源县| 家居| 林芝县| 长岛县| 贵港市| 桐庐县| 尉氏县| 凌海市| 天等县| 顺昌县| 右玉县| 乡城县| 射洪县| 苍山县|