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

 

 

转载于:https://my.oschina.net/uwith/blog/3049130

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值