最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java的Channel通道之FileChannel類詳解

 更新時(shí)間:2023年10月24日 09:44:56   作者:liyong0829  
這篇文章主要介紹了Java的Channel通道之FileChannel類詳解,FileChannel類是Java NIO中的一個(gè)重要類,用于在文件中進(jìn)行讀寫操作,它提供了一種高效的方式來處理大文件和隨機(jī)訪問文件的需求,需要的朋友可以參考下

Channel(通道)之FileChannel類

  • FileChannel類的基本使用 獲取FileChannel類的對(duì)象
  • java.nio.channels.FileChannel (抽象類):用于讀、寫文件的通道
  • FileChannel是抽象類,我們可以通過FileInputStream和FileOutputStream的getChannel()方法方便的獲取一個(gè)它的子類對(duì)象。
FileInputStream fi=new FileInputStream(new File(src));
FileOutputStream fo=new FileOutputStream(new File(dst));
//獲得傳輸通道channel
FileChannel inChannel=fi.getChannel();
FileChannel outChannel=fo.getChannel();

使用FileChannel類完成文件的復(fù)制

 public static void main(String[] args) throws Exception{
        FileInputStream fis = new FileInputStream("a.txt");
        FileOutputStream fos = new FileOutputStream("aCopy1.txt");
        // 獲得FileChannel管道對(duì)象
        FileChannel c1 = fis.getChannel();
        FileChannel c2 = fos.getChannel();

        // 創(chuàng)建ByteBuffer數(shù)組
        ByteBuffer b = ByteBuffer.allocate(1000);

        // 循環(huán)讀取數(shù)據(jù)
        while ((c1.read(b)) != -1){// 讀取的字節(jié)會(huì)填充postion到limit位置之間
            // 重置 postion為0,limit為postion的位置
            b.flip();
            // 寫出數(shù)據(jù)
            c2.write(b);// 會(huì)把postion到limit之間的數(shù)據(jù)寫出
            // 還原
            b.clear();// positon為:0  limit為: capacity 用于下次讀取
        }
        // 釋放資源
        c2.close();
        c1.close();
        fos.close();
        fis.close();
        /*byte[] bys = new byte[8192];
        int len;
        while ((len = fis.read(bys)) != -1){
            fos.write(bys,0,len);
        }
        fos.close();
        fis.close();*/
    }

FileChannel結(jié)合MappedByteBuffer實(shí)現(xiàn)高效讀寫

MappedByteBuffer類

  • 使用FileChannel結(jié)合ByteBuffer實(shí)現(xiàn)的管道讀寫,但并不能提高文件的讀寫效率。
  • ByteBuffer有個(gè)抽象子類:MappedByteBuffer,它可以將文件直接映射至內(nèi)存,把硬盤中的讀寫變成內(nèi)存中的讀寫, 所以可以提高大文件的讀寫效率
  • 可以調(diào)用FileChannel的map()方法獲取一個(gè)MappedByteBuffer,map()方法的原型: MappedByteBuffer map(MapMode mode, long position, long size); 說明:將節(jié)點(diǎn)中從position開始的size個(gè)字節(jié)映射到返回的MappedByteBuffer中

//復(fù)制2GB以下的文件 //map的第三個(gè)參數(shù)被限制在Integer.MAX_VALUE(字節(jié)) = 2G

public static void main(String[] args) throws Exception{
        //java.io.RandomAccessFile類,可以設(shè)置讀、寫模式的IO流類。
        //"r"表示:只讀--輸入流,只讀就可以。
        RandomAccessFile r1 = new RandomAccessFile("a.txt","r");
        //"rw"表示:讀、寫--輸出流,需要讀、寫。
        RandomAccessFile r2 = new RandomAccessFile("aCopy2.txt","rw");

        // 獲得FileChannel管道對(duì)象
        FileChannel c1 = r1.getChannel();
        FileChannel c2 = r2.getChannel();

        // 獲取文件的大小
        long size = c1.size();

        // 直接把硬盤中的文件映射到內(nèi)存中
        MappedByteBuffer b1 = c1.map(FileChannel.MapMode.READ_ONLY, 0, size);
        MappedByteBuffer b2 = c2.map(FileChannel.MapMode.READ_WRITE, 0, size);

        // 循環(huán)讀取數(shù)據(jù)
        for (long i = 0; i < size; i++) {
            // 讀取字節(jié)
            byte b = b1.get();
            // 保存到第二個(gè)數(shù)組中
            b2.put(b);
        }
        // 釋放資源
        c2.close();
        c1.close();
        r2.close();
        r1.close();
    }

//下例使用循環(huán),將文件分塊,可以高效的復(fù)制大于2G的文件

    public static void main(String[] args) throws Exception{
        //java.io.RandomAccessFile類,可以設(shè)置讀、寫模式的IO流類。
        //"r"表示:只讀--輸入流,只讀就可以。
        RandomAccessFile r1 = new RandomAccessFile("H:\\資料.zip","r");
        //"rw"表示:讀、寫--輸出流,需要讀、寫。
        RandomAccessFile r2 = new RandomAccessFile("H:\\資料2.zip","rw");

        // 獲得FileChannel管道對(duì)象
        FileChannel c1 = r1.getChannel();
        FileChannel c2 = r2.getChannel();

        // 獲取文件的大小
        long size = c1.size();

        // 每次期望復(fù)制500M
        int everySize = 1024*1024*500;

        // 總共需要復(fù)制多少次
        long count = size % everySize == 0 ? size/everySize : size/everySize+1;

        // 開始復(fù)制
        for (long i = 0; i < count; i++) {
            // 每次開始復(fù)制的位置
            long start = everySize*i;

            // 每次復(fù)制的實(shí)際大小
            long trueSize = size - start > everySize ? everySize : size - start;

            // 直接把硬盤中的文件映射到內(nèi)存中
            MappedByteBuffer b1 = c1.map(FileChannel.MapMode.READ_ONLY, start, trueSize);
            MappedByteBuffer b2 = c2.map(FileChannel.MapMode.READ_WRITE, start, trueSize);

            // 循環(huán)讀取數(shù)據(jù)
            for (long j = 0; j < trueSize; j++) {
                // 讀取字節(jié)
                byte b = b1.get();
                // 保存到第二個(gè)數(shù)組中
                b2.put(b);
            }
        }

        // 釋放資源
        c2.close();
        c1.close();
        r2.close();
        r1.close();
        
    }

ServerSocketChannel和SocketChannel創(chuàng)建連接

SocketChannel創(chuàng)建連接

  • 客戶端:SocketChannel類用于連接的客戶端,它相當(dāng)于:Socket。

ServerSocketChanne創(chuàng)建連接

  • 服務(wù)器端:ServerSocketChannel類用于連接的服務(wù)器端,它相當(dāng)于:ServerSocket 服務(wù)器代碼
public class Server {
    public static void main(String[] args)  throws IOException{
		//創(chuàng)建對(duì)象
        //ServerSocket ss = new ServerSocket(8888);

        //創(chuàng)建
        ServerSocketChannel ssc = ServerSocketChannel.open();
        //服務(wù)器綁定端口
        ssc.bind(new InetSocketAddress(8888));

        //連接上客戶端
        SocketChannel sc = ssc.accept();
       
        //服務(wù)器端接受數(shù)據(jù)
        //創(chuàng)建數(shù)組
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        //接收數(shù)據(jù)
        int len = sc.read(buffer);
        //打印結(jié)構(gòu)
        System.out.println(new String(buffer.array(),0,len));

        //關(guān)閉資源
        sc.close();
    }
}

客戶端代碼

public class Client {
    public static void main(String[] args) {
        //創(chuàng)建對(duì)象
        //Socket s = new Socket("127.0.0.1",8888);

        //創(chuàng)建對(duì)象
        SocketChannel sc = SocketChannel.open();
        //連接服務(wù)器
        sc.connect(new InetSocketAddress("127.0.0.1",8888));

        //客戶端發(fā)數(shù)據(jù)
        //創(chuàng)建數(shù)組
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        //數(shù)組中添加數(shù)據(jù)
        buffer.put("你好".getBytes());
        //切換
        buffer.flip();
        //發(fā)出數(shù)據(jù)
        sc.write(buffer);

        //關(guān)流
        sc.close();
    }
}

到此這篇關(guān)于Java的Channel通道之FileChannel類詳解的文章就介紹到這了,更多相關(guān)Java的FileChannel類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot項(xiàng)目test文件夾下帶main方法的類不能運(yùn)行問題

    springboot項(xiàng)目test文件夾下帶main方法的類不能運(yùn)行問題

    這篇文章主要介紹了springboot項(xiàng)目test文件夾下帶main方法的類不能運(yùn)行問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java concurrency集合之LinkedBlockingDeque_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java concurrency集合之LinkedBlockingDeque_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    LinkedBlockingDeque是雙向鏈表實(shí)現(xiàn)的雙向并發(fā)阻塞隊(duì)列。該阻塞隊(duì)列同時(shí)支持FIFO和FILO兩種操作方式,即可以從隊(duì)列的頭和尾同時(shí)操作(插入/刪除);并且,該阻塞隊(duì)列是支持線程安全。
    2017-06-06
  • GsonFormat快速生成JSon實(shí)體類的實(shí)現(xiàn)

    GsonFormat快速生成JSon實(shí)體類的實(shí)現(xiàn)

    GsonFormat主要用于使用Gson庫將JSONObject格式的String?解析成實(shí)體,本文主要介紹了GsonFormat快速生成JSon實(shí)體類的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • Spring?boot2.0?實(shí)現(xiàn)日志集成的方法(3)

    Spring?boot2.0?實(shí)現(xiàn)日志集成的方法(3)

    這篇文章主要介紹了Spring?boot2.0?實(shí)現(xiàn)日志集成的方法,基于上一篇將日志信息根據(jù)類別輸出到不同的文件中,這篇文章將通過日志來監(jiān)控用戶的操作行為、請(qǐng)求的耗時(shí)情況,針對(duì)耗時(shí)久的請(qǐng)求進(jìn)行性能分析,提升系統(tǒng)性能,需要的小伙伴可以參考一下
    2022-04-04
  • 基于SpringAI+DeepSeek實(shí)現(xiàn)流式對(duì)話功能

    基于SpringAI+DeepSeek實(shí)現(xiàn)流式對(duì)話功能

    一般來說大模型的響應(yīng)速度通常是很慢的,為了避免用戶用戶能夠耐心等待輸出的結(jié)果,我們通常會(huì)使用流式輸出一點(diǎn)點(diǎn)將結(jié)果輸出給用戶,那么問題來了,想要實(shí)現(xiàn)流式結(jié)果輸出,后端和前端要如何配合?下來本文給出具體的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2025-02-02
  • 示例解析java面向?qū)ο缶幊谭庋b與訪問控制

    示例解析java面向?qū)ο缶幊谭庋b與訪問控制

    這篇文章主要為大家介紹了java封裝與訪問控制的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案

    Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案

    這篇文章主要介紹了Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Spring Boot實(shí)現(xiàn)郵件服務(wù)(附:常見郵箱的配置)

    Spring Boot實(shí)現(xiàn)郵件服務(wù)(附:常見郵箱的配置)

    這篇文章主要給大家介紹了關(guān)于Spring Boot實(shí)現(xiàn)郵件服務(wù)的相關(guān)資料,文中還附上了常見郵箱的配置,通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • java理論基礎(chǔ)Stream元素的匹配與查找

    java理論基礎(chǔ)Stream元素的匹配與查找

    這篇文章主要為大家介紹了java理論基礎(chǔ)Stream元素的匹配與查找方法的示例說明解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Mybatis-Plus通過配置在控制臺(tái)打印執(zhí)行日志的實(shí)現(xiàn)

    Mybatis-Plus通過配置在控制臺(tái)打印執(zhí)行日志的實(shí)現(xiàn)

    本文主要介紹了Mybatis-Plus通過配置在控制臺(tái)打印執(zhí)行日志的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04

最新評(píng)論

台北县| 新沂市| 蓝田县| 上蔡县| 明水县| 贵德县| 泽普县| 龙山县| 兰考县| 宁陕县| 海伦市| 铜鼓县| 达日县| 柯坪县| 淮北市| 哈尔滨市| 哈尔滨市| 麻阳| 团风县| 贡觉县| 武隆县| 合川市| 文昌市| 西丰县| 永清县| 东台市| 安仁县| 扶余县| 武山县| 凌海市| 富平县| 临颍县| 巴彦县| 刚察县| 紫阳县| 霍山县| 盐源县| 罗江县| 手游| 蒲城县| 轮台县|