1. 程式人生 > >java 直接緩衝區和非直接緩衝區簡單操作

java 直接緩衝區和非直接緩衝區簡單操作

直接上程式碼,有兩個簡單的方法,直接緩衝區操作比非直接操作快出6倍把,可以自己找個大檔案測試下。不過兩種方法操作完成後,直接操作會出現檔案被佔用的情況,非直接操作不存在此情況。

 

package com.example.test;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

@RestController
public class HomeController {
    @RequestMapping("/home")
    public String home() throws Exception {
        //呼叫相關測試方法
        test2();
        return "請求成功";
    }

    //直接緩衝區
    public void test1() throws Exception {
        long statTime = System.currentTimeMillis();
        //建立管道
        FileChannel inChannel = FileChannel.open(Paths.get("D:\\1.zip"), StandardOpenOption.READ);
        FileChannel outChannel = FileChannel.open(Paths.get("D:\\2.zip"), StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE);
        //定義對映檔案
        MappedByteBuffer inMappedByte = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
        MappedByteBuffer outMappedByte = outChannel.map(FileChannel.MapMode.READ_WRITE, 0, inChannel.size());
        //直接對緩衝區操作
        byte[] dsf = new byte[inMappedByte.limit()];
        inMappedByte.get(dsf);
        outMappedByte.put(dsf);
        inChannel.close();
        outChannel.close();
        long endTime = System.currentTimeMillis();
        System.out.println("操作直接緩衝區耗時時間:" + (endTime - statTime));
    }

    // 非直接緩衝區 讀寫操作
    public void test2() throws Exception {
        long statTime = System.currentTimeMillis();
        // 讀入流
        FileInputStream fst = new FileInputStream("D:\\1.zip");
        // 寫入流
        FileOutputStream fos = new FileOutputStream("D:\\2.zip");
        // 建立通道
        FileChannel inChannel = fst.getChannel();
        FileChannel outChannel = fos.getChannel();
        // 分配指定大小緩衝區
        ByteBuffer buf = ByteBuffer.allocate(1024);
        while (inChannel.read(buf) != -1) {
            // 開啟讀取模式
            buf.flip();
            // 將資料寫入到通道中
            outChannel.write(buf);
            buf.clear();
        }
        // 關閉通道 、關閉連線
        inChannel.close();
        outChannel.close();
        fos.close();
        fst.close();
        long endTime = System.currentTimeMillis();
        System.out.println("操作非直接緩衝區耗時時間:" + (endTime - statTime));
    }
}

 

參考連結:https://www.cnblogs.com/yy3b2007com/archive/2017/07/31/7262453.html