java 直接緩衝區和非直接緩衝區簡單操作
阿新 • • 發佈:2019-05-13
直接上程式碼,有兩個簡單的方法,直接緩衝區操作比非直接操作快出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