筆記:I/O流-記憶體映射文件

来源:http://www.cnblogs.com/li3807/archive/2017/05/06/6819187.html
-Advertisement-
Play Games

記憶體映射文件時利用虛擬記憶體實現來將一個文件或者文件的一部分映射到記憶體中,然後整個文件就可以當作數組一樣的訪問,這個比傳統的文件操作要快得多,Java 使用記憶體映射文件首先需要從文件中獲取一個channel(通道),通道時磁碟文件的一個抽象,他使得我們可以訪問諸如記憶體映射、文件加鎖機制以及文件間快速數... ...


記憶體映射文件時利用虛擬記憶體實現來將一個文件或者文件的一部分映射到記憶體中,然後整個文件就可以當作數組一樣的訪問,這個比傳統的文件操作要快得多,Java 使用記憶體映射文件首先需要從文件中獲取一個channel(通道),通道時磁碟文件的一個抽象,他使得我們可以訪問諸如記憶體映射、文件加鎖機制以及文件間快速數據傳遞等操作系統特性,然後通過調用 FileChannel 類的 map 方法從這個通道獲取一個映射塊(ByteBuffer),然後就可以讀取/寫入文件塊內容,map 支持的模式有如下:

  • FileChannel.MapMode.READ_ONLY:所產生的緩衝區是只讀的,如果對只讀的緩衝區進行寫操作,將會導致 ReadonlyBufferException 異常
  • FileChannel.MapMode.READ_WRITE:所產生的緩衝區是可寫的,任何修改都會在某個時刻寫迴文件(寫入不是及時的)
  • FileChannel.MapMode.PRIVATE:所產生的緩衝區是可寫的,但是任何修改對這個緩衝區來說都是私有的,不會傳播到文件中

映射文件示例代碼:

  • 讀取文件:

             Path filePath = Paths.get("D:\\我的游戲\\World of Warcraft\\Data\\data", "data.001");

             long startTime = System.currentTimeMillis(); //獲取開始時間

            try {

                   try (FileChannel channel = FileChannel.open(filePath, StandardOpenOption.READ)) {

                           int size = 40960;

                           long readByteSize = 0;

                           ByteBuffer byteBuffer = ByteBuffer.allocate(size);

                           int readCount;

                            do {

                                     readCount = channel.read(byteBuffer);

                                     byte[] readBytes = new byte[byteBuffer.limit()];

                                    // channel.read 後其 position 是 readCount,因此需要讀取數據時,需要重置 position = 0

                                     byteBuffer.position(0);

                                     for(int i=0;i< readBytes.length;i++){

                                            readBytes[i] = byteBuffer.get();

                                     }

                                     byteBuffer.clear();

                                    if (readCount != -1) {

                                           readByteSize += readCount;

                                     }

                                    System.out.print("readCount +" + readCount + " readByteSize " + readByteSize + " ");

                             } while (readCount != -1);

                    }

            } catch (IOException ex) {

                            ex.printStackTrace();

            }

            long endTime = System.currentTimeMillis(); //獲取結束時間

            System.out.println("程式運行時間: " + (endTime - startTime) + "ms");

       

  • 寫入文件(使用 RandomAccessFile MappedByteBuffer):

                    Random random = new Random();

                    Path writeFilePath = Paths.get("d:\\channel.dat");

                    startTime = System.currentTimeMillis(); //獲取開始時間

                    try {

                            byte[] buff = new byte[40960];

                            long position = 0;

                            long size = buff.length;

                            RandomAccessFile randomAccessFile = new RandomAccessFile(writeFilePath.toString(), "rw");

                            try (FileChannel outChannel = randomAccessFile.getChannel()) {

                                    for (int i = 0; i < 1000; i++) {

                                            random.nextBytes(buff);

                                            MappedByteBuffer buffer = outChannel.map(FileChannel.MapMode.READ_WRITE, position, size);

                                            buffer.put(buff);

                                            position += size;

                                    }

                            }

                    } catch (IOException ex) {

                            ex.printStackTrace();

                    }

                    endTime = System.currentTimeMillis(); //獲取結束時間

                    System.out.println("程式運行時間: " + (endTime - startTime) + "ms");

       


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一些概念 Nginx ("engine x") 是一個高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。Nginx是由Igor Sysoev為俄羅斯訪問量第二的Rambler.ru站點開發的,第一個公開版本0.1.0發佈於2004年10月4日。其將源代碼以類BSD許可證的 ...
  • vim [OPTION]... FILE... +/PATTERN:打開文件後,直接讓游標處於第一個被PATTERN匹配到的行的行首vim + file 直接打開file,游標在最後一行 三種主要模式: 命令模式:移動游標,剪切粘貼等 插入模式:編輯,修改文本 擴展模式:保存退出等 模式轉換: a ...
  • 目的:1、學好linux,隨著大數據,雲等應用,開源軟體將占領市場,這些應用都是基於linux的。 2、通過RHCE認證考試 原因:1、人的自律很困難,必須付出代價(交錢上課完成作業)等方式強迫自己學習。(自己也喜歡學習linux) 2、本人年齡偏大40歲,但認為學習不可放鬆,活到老學到老。 正題: ...
  • Linux 中的基本命令與目錄結構 目錄 一、Linux 基本目錄結構 二、基本命令 三、瀏覽目錄 四、中間命令 五、更改密碼 六、環境變數和 shell 變數 七、命令路徑 八、文本編輯器 九、獲取線上幫助 十、shell 輸入輸出 十一、操作進程 十二、更改文件許可權 十三、歸檔和壓縮 一、Lin ...
  • 最近工作碰到一個問題,我和一個同伙負責開發一個管理系統,基於原來的代碼上進行修改,每當他修改之後,我要再修改都要和他確定是不是最新的文件,才能進行修改。非常影響工作的效率,所以在網上找了關於svn的使用。下麵開始svn的安裝和部署,解決開發中代碼的同步問題。 在Linux上安裝很簡單。 第一。先查看 ...
  • 方法1 : 在/etc/rc.local文件中添加 方法 2: 在搜索中找到 startup application 打開界面添加命令即可 ...
  • 原理是將SS轉化成http代理提供命令行終端使用。 1. privoxy安裝 2. privoxy配置 打開配置文件 加入下麵這兩項配置項 第一行設置privoxy監聽任意IP地址的8118埠。第二行設置本地socks5代理客戶端埠,註意不要忘了最後有一個空格和點號。 3. privoxy啟動 ...
  • 前言 在Python官方文檔的標準庫章節中,第一節是簡介,第二節就是Built_in Functions,可見內建函數是Python標準庫的重要組成部分,而有很多內建函數我們平時卻很少用到或根本就不知道原來還有這麼好用的函數居然直接就可以拿來用。 Built_in Funtions 接下來為大家介紹 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...