日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Java Nio FileChannel堆內堆外數據讀寫全流程分析及使用

來源: 責編: 時間:2024-05-27 08:57:11 232觀看
導讀背景java nio中文件讀寫不管是普通文件讀寫,還是基于mmap實現零拷貝,都離不開FileChannel這個類。隨便打開RocketMQ 源碼搜索FileChannel。就可以看到使用頻率。圖片kafka也是。圖片所以在java中文件讀寫FileChannel尤

背景

java nio中文件讀寫不管是普通文件讀寫,還是基于mmap實現零拷貝,都離不開FileChannel這個類。QMK28資訊網——每日最新資訊28at.com

隨便打開RocketMQ 源碼搜索FileChannel。QMK28資訊網——每日最新資訊28at.com

就可以看到使用頻率。QMK28資訊網——每日最新資訊28at.com

圖片圖片QMK28資訊網——每日最新資訊28at.com

kafka也是。QMK28資訊網——每日最新資訊28at.com

圖片圖片QMK28資訊網——每日最新資訊28at.com

所以在java中文件讀寫FileChannel尤為重用。QMK28資訊網——每日最新資訊28at.com

java文件讀寫全流程

圖片圖片QMK28資訊網——每日最新資訊28at.com

這里說的僅僅是FileChannel基于堆內存(HeapByteBuffer)的文件讀寫。QMK28資訊網——每日最新資訊28at.com

如果是mmap或者堆外內存,可能有些步驟會省略,相當于有一些優化。QMK28資訊網——每日最新資訊28at.com

  1. FileChannel調用read,將HeapByteBuffer拷貝到DirectByteBuffer。
  2. JVM在native層使用read系統調用進行文件讀取, 這里需要進行上下文切換,從用戶態進入內核態。
  3. JVM 進程進入虛擬文件系統層,查看文件數據再page cache是否緩存,如果有則直接從page cache讀取并返回到DirectByteBuffer。
  4. 如果請求文件數據不在page caceh,則進入文件系統。通過塊驅動設備進行真正的IO,并進行文件預讀,比如讀取的文件可能只有1-10,但是會將1-20都讀取。
  5. 磁盤控制器DMA將磁盤中的數據拷貝到page cache中。這里發生了一次數據拷貝(非CPU拷貝)。
  6. CPU將page cache數據拷貝到DirectByteBuffer,因為page cache屬于內核空間,JVM進程無法直接尋址。這里是發生第二次數據拷貝。
  7. JVM進程從內核態切換回用戶態,這里如果使用的是堆內存(HeapByteBuffer),實際還需要將堆外內存DirectByteBuffer拷貝到堆內存(HeapByteBuffer)。

FileChannel讀寫文件(非MMAP)

public static void main(String[] args) {        String filename = "小奏技術.txt";        String content = "Hello, 小奏技術.";        // 寫入文件        writeFile(filename, content);        // 讀取文件        System.out.println("Reading from file:");        readFile(filename);    }    public static void writeFile(String filename, String content) {        // 創建文件對象        File file = new File(filename);        // 確保文件存在        if (!file.exists()) {            try {                boolean created = file.createNewFile();                if (!created) {                    System.err.println("Unable to create file: " + filename);                    return;                }            } catch (Exception e) {                System.err.println("An error occurred while creating the file: " + e.getMessage());                return;            }        }        // 使用FileChannel寫入文件        try (RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");             FileChannel fileChannel = randomAccessFile.getChannel()) {            ByteBuffer buffer = ByteBuffer.allocate(content.getBytes().length);            buffer.put(content.getBytes());            buffer.flip(); // 切換到讀模式            while (buffer.hasRemaining()) {                fileChannel.write(buffer);            }        } catch (Exception e) {            System.err.println("An error occurred while writing to the file: " + e.getMessage());        }    }    public static void readFile(String filename) {        // 使用FileChannel讀取文件        try (RandomAccessFile randomAccessFile = new RandomAccessFile(filename, "r");             FileChannel fileChannel = randomAccessFile.getChannel()) {            ByteBuffer buffer = ByteBuffer.allocate((int) fileChannel.size());            while (fileChannel.read(buffer) > 0) {                // Do nothing, just read            }            // 切換到讀模式            buffer.flip();            /* while (buffer.hasRemaining()) {                System.out.print((char) buffer.get());            }*/            Charset charset = StandardCharsets.UTF_8;             String fileContent = charset.decode(buffer).toString();            System.out.print(fileContent);        } catch (Exception e) {            System.err.println("An error occurred while reading the file: " + e.getMessage());        }    }

這里需要注意的一個細節 我們分配的內存的方式是:QMK28資訊網——每日最新資訊28at.com

ByteBuffer.allocate()

這里我們可以進入看看源碼:QMK28資訊網——每日最新資訊28at.com

圖片圖片QMK28資訊網——每日最新資訊28at.com

實際構造的是HeapByteBuffer,也就是JVM的堆內存。QMK28資訊網——每日最新資訊28at.com

如果我們使用:QMK28資訊網——每日最新資訊28at.com

ByteBuffer.allocateDirect()

圖片圖片QMK28資訊網——每日最新資訊28at.com

則構造的是堆外內存DirectByteBuffer。QMK28資訊網——每日最新資訊28at.com

HeapByteBuffer和DirectByteBuffer文件讀寫區別

我們看看FileChannel read方法:QMK28資訊網——每日最新資訊28at.com

圖片圖片QMK28資訊網——每日最新資訊28at.com

發現IO相關的處理被封裝在IOUtil,我們繼續看看IOUtil的write方法:QMK28資訊網——每日最新資訊28at.com

圖片圖片QMK28資訊網——每日最新資訊28at.com

可以看到如果是DirectBuffer則可以直接寫。如果是HeapByteBuffer則需要轉換為DirectByteBuffer。QMK28資訊網——每日最新資訊28at.com

圖片圖片QMK28資訊網——每日最新資訊28at.com

為什么要在DirectByteBuffer做一層轉換

主要是HeapByteBuffer受JVM管理,也就是會受到GC影響。如果在進行native調用的時候發生了GC,會導致HeapByteBuffer的內容出現錯誤。具體詳細的說明可以看看這篇MappedByteBuffer VS FileChannel:從內核層面對比兩者的性能差異。講解的非常清晰。QMK28資訊網——每日最新資訊28at.com

參考

  • MappedByteBuffer VS FileChannel:從內核層面對比兩者的性能差異 

本文鏈接:http://m.www897cc.com/showinfo-26-90858-0.htmlJava Nio FileChannel堆內堆外數據讀寫全流程分析及使用

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Wire:Go語言依賴注入的利器

下一篇: 避免鎖表:為Update語句中的Where條件添加索引字段

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲第一级黄色片| 国产精品网站在线| 久久伊人免费视频| 奶水喷射视频一区| 一区二区在线观看视频| 影音先锋成人资源站| 亚洲片区在线| 国产午夜精品一区二区三区视频| 国产欧美日韩精品在线| 在线电影国产精品| 亚洲三级影院| 亚洲欧美日韩国产综合| 久久精品欧美日韩| 欧美精品一区二区三区很污很色的| 欧美私人啪啪vps| 激情五月综合色婷婷一区二区| 91久久精品国产91久久| 99热在这里有精品免费| 午夜精品久久久久久久久久久久久| 久久久久久色| 欧美日韩国产综合新一区| 国产欧美日韩精品在线| 亚洲国产一区二区在线| 亚洲字幕一区二区| 免费成人毛片| 国产精品一二三| 亚洲欧洲精品一区二区精品久久久| 亚洲综合色婷婷| 欧美国产先锋| 国产一区999| 亚洲神马久久| 另类亚洲自拍| 国产伦精品一区二区三区视频黑人 | 国产精品视频一区二区三区| 在线免费精品视频| 亚洲在线中文字幕| 欧美高清视频一二三区| 国产亚洲欧美激情| 中文国产一区| 欧美xx69| 黄色小说综合网站| 亚洲欧美日韩精品综合在线观看| 欧美成人中文| 国内精品久久久久影院优| 亚洲午夜视频在线| 欧美黑人在线观看| 国产在线麻豆精品观看| 亚洲综合二区| 欧美日韩国产一级| 亚洲国产精品热久久| 久久国产黑丝| 国产精品免费一区豆花| 99国产麻豆精品| 女女同性精品视频| 韩国女主播一区| 午夜综合激情| 国产精品porn| 99这里只有精品| 欧美高清在线一区| 激情小说另类小说亚洲欧美| 香蕉成人啪国产精品视频综合网| 欧美日韩在线综合| 亚洲精品美女久久久久| 美国成人直播| 尤物九九久久国产精品的特点| 午夜视频久久久| 国产精品毛片大码女人| 夜夜精品视频| 欧美剧在线观看| 最新中文字幕亚洲| 欧美a级片网| 亚洲第一区在线观看| 欧美在线影院在线视频| 国产精品羞羞答答xxdd| 亚洲影院色在线观看免费| 欧美日韩一卡| 一区二区三区色| 欧美私人网站| 亚洲字幕一区二区| 国产精品毛片一区二区三区 | 亚洲精品一区二区在线| 免费日韩一区二区| 亚洲国产美国国产综合一区二区| 久久综合久色欧美综合狠狠 | 在线欧美小视频| 久久久国产午夜精品| 国产一区二区三区黄| 欧美一区在线视频| 国产一区二区三区av电影| 欧美主播一区二区三区| 国产一区二区精品丝袜| 久久国产66| 国语精品一区| 毛片基地黄久久久久久天堂| 亚洲国产你懂的| 欧美成在线视频| 亚洲精品午夜| 欧美日韩精品在线| 亚洲影院免费| 国产视频精品va久久久久久| 久久xxxx| 1024国产精品| 欧美精品手机在线| 一区二区精品在线| 国产精品青草综合久久久久99| 小处雏高清一区二区三区| 国产午夜精品全部视频在线播放| 久久爱www.| 亚洲大胆av| 欧美美女福利视频| 亚洲一区视频在线| 国产亚洲综合精品| 免费日韩成人| 中文精品一区二区三区| 国产免费成人在线视频| 久久久久**毛片大全| 亚洲国产精品va在线看黑人动漫| 欧美精选在线| 香蕉国产精品偷在线观看不卡| 韩日欧美一区| 欧美精品在欧美一区二区少妇| 一个色综合导航| 国产日本欧洲亚洲| 猛男gaygay欧美视频| 99在线|亚洲一区二区| 国产精品男女猛烈高潮激情| 久久久精品动漫| 亚洲伦理在线免费看| 国产美女精品免费电影| 欧美成人精品一区二区三区| 亚洲午夜国产成人av电影男同| 国产亚洲精品高潮| 欧美极品在线视频| 欧美一二三区精品| 亚洲经典视频在线观看| 国产精品女同互慰在线看| 免费永久网站黄欧美| 99精品欧美一区| 国产在线日韩| 欧美日韩无遮挡| 久久成人人人人精品欧| 99成人在线| 国内精品久久久久影院薰衣草| 欧美日韩性视频在线| 久久久久久久999| 中国女人久久久| 亚洲国产高清高潮精品美女| 欧美性色综合| 老司机一区二区| 亚洲欧美日本伦理| 亚洲人成网站影音先锋播放| 国产日韩欧美一区在线 | 在线综合视频| 亚洲成人中文| 国产精品亚洲不卡a| 欧美激情精品久久久六区热门 | 一区二区三区高清在线观看| 国产专区综合网| 欧美日韩一区高清| 鲁大师成人一区二区三区| 亚洲欧美一级二级三级| 亚洲精品美女久久久久| 伊人成年综合电影网| 国产精品私房写真福利视频| 欧美精品偷拍| 久久综合中文色婷婷| 欧美一级播放| 亚洲小说欧美另类婷婷| 亚洲毛片视频| 亚洲第一成人在线| 国产亚洲综合精品| 国产精品视频一二| 欧美日韩一区二区免费视频| 蜜臀av一级做a爰片久久| 欧美影院成年免费版| 亚洲视屏一区| 亚洲美女网站| 亚洲国产精品成人精品| 狠狠色噜噜狠狠色综合久| 国产精品综合不卡av| 欧美视频中文一区二区三区在线观看| 欧美暴力喷水在线| 久久综合给合| 欧美一区二区视频观看视频| 亚洲视频在线观看网站| 日韩视频精品在线观看| 亚洲激情婷婷| 在线日本高清免费不卡| 激情久久婷婷| 狠狠色丁香久久婷婷综合丁香| 国产欧美一区二区三区另类精品| 欧美日韩一区在线| 欧美日本成人| 欧美日本精品| 欧美人成免费网站| 欧美激情精品久久久久| 欧美成人免费播放| 欧美va亚洲va香蕉在线| 久久免费视频网站| 久久久.com| 久久精品综合一区| 久久久国际精品| 久久嫩草精品久久久精品| 久久精品人人做人人综合|