直接上代码,有两个简单的方法,直接缓冲区操作比非直接操作快出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