基本概念:

1. 非直接缓冲区:  指的是通过jvm来缓存数据的,应用程序要读取本地数据要经历从本地磁盘到物理内存,然后copy到jvm中,然后再通过流的方式读取到应用程序中,写的操作正好与之相反。

2. 直接缓冲区:指不通过应用程序读取磁盘的文件时不用经过jvm,而是直接由本地磁盘到物理内存,然后到应用程序。

对比:直接缓冲方式会比非直接缓冲方式快,不过在保存文件到本地过程中,文件先保存到物理内存,途中如果用清理内存工具来进行清理的话,数据就会丢失。因此非直接缓冲区的方式比较安全。

我们来看一下直接缓冲IO操作的代码:

long statTime=System.currentTimeMillis();

//创建管道

FileChannel inChannel=FileChannel.open(Paths.get("D://test001.mp4"), StandardOpenOption.READ);

FileChannel outChannel=FileChannel.open(Paths.get("D://test002.mp4"), StandardOpenOption.READ,StandardOpenOption.WRITE, StandardOpenOption.CREATE);

//定义映射文件

MappedByteBuffer inMappedByte = inChannel.map(MapMode.READ_ONLY,0, inChannel.size());

MappedByteBuffer outMappedByte = outChannel.map(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));

再来对比一下非直接缓冲区IO操作的代码:

long statTime=System.currentTimeMillis();//读入流

FileInputStream fst = new FileInputStream("D://test001.mp4");//写入流

FileOutputStream fos = new FileOutputStream("D://test002.mp4");//创建通道

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));

java 文件缓冲区_基于直接缓冲区和非直接缓冲区的javaIO文件操作相关推荐

  1. java zip追加_基于Java向zip压缩包追加文件

    这篇文章主要介绍了基于Java向zip压缩包追加文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 有个需求,从某个接口下载的一个zip压缩包,往里 ...

  2. java p2p文件传输_基于java的p2p实现文件共享和传输

    展开全部 C++ Socket网络编程大全 1.简单服务器 //#include //#pragma comment(lib,"WS2_32.lib") WSADATA sServ ...

  3. java path类_基于java Files类和Paths类的用法(详解)

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem ...

  4. java 快递项目_基于SpringBoot开发的Java快递代拿系统

    该项目基于 [基于SSM开发的Java快递代拿系统] 项目全面升级,使用当前最为流行的 SpringBoot 框架,相关技术栈全面更新!是您深入学习 SpringBoot 开发的最佳实践! 相关技术栈 ...

  5. java 打印 发票_基于Excel和Java自动化:发票生成器

    对于销售人员,使用Excel创建发票是很常见的.但是该过程通常涉及许多容易出错的手动操作,例如输入数据,复制/粘贴等.如何实现一个可以将数据从数据库自动填充到发票Excel模板中,而无需再辛苦手动输入 ...

  6. java opencv 环境_基于java的OpenCV环境搭建

    一.OpenCV下载安装 选择相应的版本下载保存就好(不过官网下载有时候真滴慢还会连不上.....)网盘链接有windows ios Android 版本安装包可提取 链接:https://pan.b ...

  7. java 异常国际化_基于springboot实现http响应异常信息国际化

    背景 国际化是指在设计软件,将软件与特定语言及地区脱钩的过程.当软件被移植到不同的语言及地区时,软件本身不用做内部工程上的改变或修正. 本文提到的异常响应信息国际化是指:前端向后台发起请求,后台在处理 ...

  8. java校园导航_基于Android平台的校园导航系统

    摘要:随着移动网络通讯技术的迅速发展和基于安卓技术的手持终端设备的日益普及,Android手机在学生群体中普遍使用,各类高校内部一般都具有良好的校园网络环境.虽然现在出现了各式各样的地图导航软件,但在 ...

  9. lin通信ldf文件解析_基于LIN协议的代码自动生成系统及方法_2014108531085_说明书_专利查询_专利网_钻瓜专利网...

    技术领域 本发明属于汽车电子LIN网络通讯领域,公开了一种利用LDF文件自动生成LIN通讯软件代码的方法. 背景技术 目前汽车电子产品的软件开发逐渐向模块化.标准化.集成化.自动化发展.LIN通讯模块 ...

最新文章

  1. openstack页面自定义插件使用详解(django、ajax、post)(zTree为例)
  2. 经典分类:线性判别分析模型!
  3. 移动终端三分天下 何与争峰
  4. android+ip+rule+策略路由,策略路由以及使用 ip route , ip rule , iptables 配置策略路由实例...
  5. CPU性能监控之一------CPU架构
  6. To Java程序员:切勿用普通for循环遍历LinkedList
  7. SimpleDateFormat 格式图
  8. 使用DiskFileItemFactory 实现文件上传 ,设定缓冲区大小和存放临时文件目录。
  9. 小米答题题库_拼多多果园答题题库74(每日更新)
  10. C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能...
  11. windows10查看本机IP脚本
  12. 电音制作宿主软件-Ableton Live Suite v10.1.30 WIN-MAC 中文版下载
  13. 智能音箱调研报告|语音交互功能详析
  14. 微信群控云控客服开发SDK
  15. SIP协议详解(中文)-6
  16. 电影《名侦探柯南:万圣节的新娘》观后感
  17. 不要在该约炮的年纪谈佛系
  18. SNMP TRAP报文解析
  19. 数据库测试的重要性——永远不要忘记数据库测试
  20. 前端JS表格打印和导出

热门文章

  1. Kotlin学习笔记12——数据类和密封类
  2. 20.3. texi2html
  3. 前端项目 - 论坛信息管理系统(纯页面)
  4. MTI姿态传感器学习笔记
  5. matlab应用最简差分格式,泊松方程有限差分格式的构造以及MATLAB实现.docx
  6. 基础算法-生兔子(JAVA)
  7. 无敌python爬虫教程学习笔记(一)
  8. 前端项目怎样合理使用模块化和闭包?
  9. PHP 获取手机号运营商
  10. 【Pytorch】Tensor.contiguous()使用与理解