文章目录

  • 一、JavaNIO读取文件
    • 1、使用缓冲区,非直接缓冲区读写文件
    • 2、使用直接缓冲区读写文件,速度快,不建议使用,占内存
    • 3、分散与读取,将通道中的内容分散到缓冲区中

一、JavaNIO读取文件

1、使用缓冲区,非直接缓冲区读写文件

 @Testpublic void test3() {FileInputStream fis = null;FileOutputStream fos = null;FileChannel fisChannel = null;FileChannel fosChannel = null;try {// ServerSocketChannel open = ServerSocketChannel.open();fis = new FileInputStream("1.jpg");fos = new FileOutputStream("2.jpg");fisChannel = fis.getChannel();fosChannel = fos.getChannel();// 分配指定大小的缓冲区ByteBuffer buf = ByteBuffer.allocateDirect(1024);// 将通道中的数据存取缓冲区while (fisChannel.read(buf) != -1) {// 读取信息buf.flip();fosChannel.write(buf);buf.clear();}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (fos != null) {try {fos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (fosChannel != null) {try {fosChannel.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (fisChannel != null) {try {fisChannel.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

2、使用直接缓冲区读写文件,速度快,不建议使用,占内存

@Testpublic void test4() throws IOException {// 读模式FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);// StandardOpenOption.CREATE没有就创建,有就覆盖,StandardOpenOption.CREATE_NEW有就报错FileChannel outChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.WRITE, StandardOpenOption.READ,StandardOpenOption.CREATE);// 内存映射文件和ByteBuffer.allocateDirect(1024);直接获取缓冲区一模一样// 缓存区目前在物理内存中,直接缓冲区只有ByteBuffer支持MappedByteBuffer map = inChannel.map(MapMode.READ_ONLY, 0, inChannel.size());MappedByteBuffer map2 = outChannel.map(MapMode.READ_WRITE, 0, inChannel.size());// 直接操作缓冲区byte[] bs = new byte[map.limit()];map.get(bs);map2.put(bs);}

3、分散与读取,将通道中的内容分散到缓冲区中

/*** 分散与读取,将通道中的内容分散到缓冲区中** @throws FileNotFoundException*/@Testpublic void test6() throws Exception {// 分散读取RandomAccessFile raf = new RandomAccessFile("1.txt", "rw");// 获取通道FileChannel channel = raf.getChannel();// 分配指定大小缓冲区ByteBuffer allocate = ByteBuffer.allocate(100);ByteBuffer allocate2 = ByteBuffer.allocate(1000);// 分散读取ByteBuffer[] bio = { allocate, allocate2 };channel.read(bio);for (ByteBuffer byteBuffer : bio) {// 改编读模式byteBuffer.flip();}// 将缓冲区转换为数组,从第0个转换到limitSystem.out.println(new String(bio[0].array(), 0, bio[0].limit()));System.out.println("======================");System.out.println(new String(bio[0].array(), 0, bio[1].limit()));// 聚集写入RandomAccessFile rsf = new RandomAccessFile("2.txt", "rw");FileChannel channel2 = rsf.getChannel();channel2.write(bio);}/*** 通道之间传输数据,直接缓冲区复制文件** @throws IOException*/@Testpublic void test5() throws IOException {// 读模式FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);// StandardOpenOption.CREATE没有就创建,有就覆盖,StandardOpenOption.CREATE_NEW有就报错FileChannel outChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.WRITE, StandardOpenOption.READ,StandardOpenOption.CREATE);// 从哪到哪去inChannel.transferTo(0, inChannel.size(), outChannel);outChannel.transferFrom(inChannel, 0, inChannel.size());inChannel.close();outChannel.close();}/*** 直接缓冲区进行文件费复制** @throws IOException*/@Testpublic void test4() throws IOException {// 读模式FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);// StandardOpenOption.CREATE没有就创建,有就覆盖,StandardOpenOption.CREATE_NEW有就报错FileChannel outChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.WRITE, StandardOpenOption.READ,StandardOpenOption.CREATE);// 内存映射文件和ByteBuffer.allocateDirect(1024);直接获取缓冲区一模一样// 缓存区目前在物理内存中,直接缓冲区只有ByteBuffer支持MappedByteBuffer map = inChannel.map(MapMode.READ_ONLY, 0, inChannel.size());MappedByteBuffer map2 = outChannel.map(MapMode.READ_WRITE, 0, inChannel.size());// 直接操作缓冲区byte[] bs = new byte[map.limit()];map.get(bs);map2.put(bs);}/*** 非直接缓冲区实现文件复制*/@Testpublic void test3() {FileInputStream fis = null;FileOutputStream fos = null;FileChannel fisChannel = null;FileChannel fosChannel = null;try {// ServerSocketChannel open = ServerSocketChannel.open();fis = new FileInputStream("1.jpg");fos = new FileOutputStream("2.jpg");fisChannel = fis.getChannel();fosChannel = fos.getChannel();// 分配指定大小的缓冲区ByteBuffer buf = ByteBuffer.allocateDirect(1024);// 将通道中的数据存取缓冲区while (fisChannel.read(buf) != -1) {// 读取信息buf.flip();fosChannel.write(buf);buf.clear();}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if (fos != null) {fos.close();}if (fis != null) {fis.close();}if (fosChannel != null) {fosChannel.close();}if (fisChannel != null) {fisChannel.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}@Testpublic void test1() {ByteBuffer buf = ByteBuffer.allocate(1024);// 可以操作数据的位置System.out.println(buf.position());// 可以操作数据的大小System.out.println(buf.limit());// 最大储存容量System.out.println(buf.capacity());String string = "asd";buf.put(string.getBytes());// 切换到读取数据模式buf.flip();// 可重复读数据buf.rewind();buf.clear();// 标记位置buf.mark();// 回复到标记位置buf.reset();// 判断缓冲区中是否还有缓冲数据,如果有if (buf.hasRemaining()) {// 获取缓冲区中可以操作的数量System.out.println(buf.remaining());}}

JavaNIO读取文件相关推荐

  1. TensorFlow csv读取文件数据(代码实现)

    TensorFlow csv读取文件数据(代码实现) 大多数人了解 Pandas 及其在处理大数据文件方面的实用性.TensorFlow 提供了读取这种文件的方法. 前面章节中,介绍了如何在 Tens ...

  2. python读取文件r_python read文件的r和rb的区别

    r,rb,w,wb 那么在读写文件时,有无b标识的的主要区别在哪里呢? 1.文件使用方式标识 'r':默认值,表示从文件读取数据. 'w':表示要向文件写入数据,并截断以前的内容 'a':表示要向文件 ...

  3. 如何有效的使用C#读取文件

    你平时是怎么读取文件的?使用流读取.是的没错,C#给我们提供了非常强大的类库(又一次吹捧了.NET一番),里面封装了几乎所有我们可以想到的和我们没有想到的类,流是读取文件的一般手段,那么你真的会用它读 ...

  4. C++ 简单读写文本文件、统计文件的行数、读取文件数据到数组

    转自:http://hi.baidu.com/ctralt/blog/item/cde79fec87f841302697911c.html fstream提供了三个类,用来实现c++对文件的操作.(文 ...

  5. 怎么读取java文件,Java怎么读取文件

    当前位置:我的异常网» J2SE » Java怎么读取文件 Java怎么读取文件 www.myexceptions.net  网友分享于:2013-12-20  浏览:60次 Java如何读取文件? ...

  6. python中读取文件过程中seek()函数的使用

    python中读取文件过程中seek()函数的使用 目录 概述: 语法: 参数: 返回值: 实例: 概述: seek() 方法用于移动文件读取指针到指定位置. 语法: seek() 方法语法如下: 文 ...

  7. mfc如何判断读到文件尾_C++ 判断读取文件尾

    主要在于eof()不只是读取文件的最后一个字符,它会接着往后读取,如果此函数返回ture时,则此时返回的文件结束符0xFF才是真正的结尾. 具体内容如下: 在使用C/C++读文件的时候,一定都使用过e ...

  8. python open方法下file模块_python-linecache模块读取文件用法

    python-linecache模块读取文件用法详解 linecache模块允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行. 1.linecache.getline ...

  9. python文件读取方法read(size)的含义是_在Python中可使用read([size])来读取文件中的数据,如果参数size省略,则读取文件中的()。...

    [单选题]李明在他所属的公司工作五年,每天都很认真地处理繁杂的事情,同事们都夸他认真,但是依然没有建树,这是因为: [多选题]品牌标志的作用表现在 [单选题]新产品开发的第一个阶段是_______. ...

  10. glob.glob 函数读取文件

    glob.glob(pathname) 返回所有匹配的文件路径列表.它只有一个参数 pathname,定义了文件路径匹配规则,这里可以是绝对路径,也可以是相对路径. 如当前路径下有文件如下: * 返回 ...

最新文章

  1. jQuery.width()和jQuery.css('width')的区别
  2. 盘点8月的手工作品!
  3. python apply_async数据量大不执行_apply_async里面的函数不执行
  4. NavMeshAgent 动态加载障碍物
  5. 面向对象一些概念简述
  6. AI能让全球车厂每年多赚2150亿美元 | 麦肯锡报告
  7. jQuery Validate 表单验证插件----Validate简介,官方文档,官方下载地址
  8. 【SSH网上商城项目实战13】Struts2实现文件上传功能
  9. 【world_to_pixel】【wcs_pix2world】世界坐标系和像素坐标系的两种转换方式
  10. Veritas Backup Exec 21配置存储
  11. construct2游戏设计与制作
  12. Redis源码分析之内存检测memtest
  13. Python Text Processing with NLTK 2.0 Cookbook代码笔记
  14. 关于思科无线网络无法连接解决
  15. 用ajax进行分页查询
  16. 从B树、B+树、B*树谈到R 树
  17. 笔记本键盘两个ctrl键同时失灵怎么解决?
  18. 心灵震撼《一个8岁女孩的遗书》
  19. 用pygame编写一个跑酷游戏
  20. 计算机科学期刊是a类还是b类,期刊发表a类期刊和b类期刊有什么区别?

热门文章

  1. java开发工程师面试自我介绍_java程序员面试自我介绍
  2. 田志刚:个人知识管理常用软件、工具介绍
  3. Insyde uefi 隐藏设置_使用u盘GPT+UEFI模式安装windows10系统步骤详细图解
  4. VBA代码宝工具箱(陈表达)
  5. 蔡学镛谈Java学习
  6. 嵌入式软件设计(freertos使用)
  7. yaml 变量引用_yaml语法简介
  8. wav转mp3,wav转换成mp3
  9. java生成树型思维导图_Java生成思维脑图
  10. 接口性能测试+调优+性能指标