JDK 1.4 引入了 java.nio.* 新类库提升 I/O 读写速度, 效率的提升主要得益于 nio 类库中采用的数据结构更接近于操作系统执行 I/O 的方式:通道缓冲器

通道作为数据仓库,缓冲器作为搬运工,在通道内对数据进行读写操作,我们只操作缓冲器,不直接与通道产生联系。

目录

  • 1.创建通道
  • 2.快速复制
  • 3.编码解码
    • 3.1 编码
    • 3.2 解码
  • 4.获取基本类型

1.创建通道

下面先来看个简单的示例:

FileOutputStream、RandomAccessFile、FileInputStream 分别对应只写通道读写通道读通道的获取方式;

FileChannel 中只能写入字节,读取的时候也是如此,无法直接读取字符;

需要注意的是,调用 FileChannel 中的 read() 方法后,必须调用 flip() 方法将 ByteBuffer 中的指针移动至头部(read() 方法调用后,指针会移动至尾部),否则无法读取出数据;

allocate() 用于创建指定大小的缓冲区,单位为字节;

使用通道缓冲器进行读写的效率会显著高于普通的 I/O 类,感兴趣的朋友可以自行测试;

public class GetChannel {public static void main(String[] args) throws IOException {//获取通道FileChannel fc = new FileOutputStream("D:\\test\\a.txt").getChannel();//缓冲器写入fc.write(ByteBuffer.wrap("some txt ".getBytes()));fc.close();fc = new RandomAccessFile("D:\\test\\a.txt", "rw").getChannel();//指定写入起始位置fc.position(fc.size());fc.write(ByteBuffer.wrap("some more ".getBytes()));fc.close();fc = new FileInputStream("D:\\test\\a.txt").getChannel();//创建指定大小的缓冲器ByteBuffer buff = ByteBuffer.allocate(1024);fc.read(buff);//必须执行,将缓冲区的指针移动至头部buff.flip();//使用迭代器遍历,类似Iterator的hasNext()while (buff.hasRemaining()) System.out.print((char) buff.get());}}
some txt some more

2.快速复制

我们可以将一个通道与另外一个通道直接相连,从而达到快速复制的效果,具体操作如下:

    public static void main(String[] args) throws IOException {FileChannel in = new FileInputStream("D:\\test\\a.txt").getChannel(),out = new FileOutputStream("D:\\test\\b.txt").getChannel();in.transferTo(0,in.size(),out);//第二种方式//out.transferFrom(in, 0, in.size());}

in.transferTo() 的参数分别为:读取的起始位置、读取的长度、写入的通道;

也可以通过 out.transferFrom() 来实现相同的效果,其对应的参数为:读取的通道、读取的起始位置、读取的长度

3.编码解码

缓冲器内容纳的是普通字节,为了将它们转换成字符,需要在输入它们的时候进行编码,或者输出的时候进行解码,否则读取出来的字符会出现乱码现象;

3.1 编码

通过 ByteBuffer 写入的时候,指定字节数组的编码格式;

  • 示例:
    public static void main(String[] args) throws IOException {FileChannel out = new FileOutputStream("D:\\test\\a.txt").getChannel();//指定写入字节的编码格式out.write(ByteBuffer.wrap("富强 民主 文明 和谐 自由 平等 公正 法治 爱国 敬业 诚信 友善".getBytes("UTF-16BE")));out.close();FileChannel in = new FileInputStream("D:\\test\\a.txt").getChannel();ByteBuffer buff = ByteBuffer.allocate(1024);in.read(buff);buff.flip();System.out.println(buff.asCharBuffer());}
富强 民主 文明 和谐 自由 平等 公正 法治 爱国 敬业 诚信 友善

3.2 解码

ByteBuffer 读取完成后,通过 Charset 类提供的方法对其进行解码操作;

  • 示例:
    public static void main(String[] args) throws IOException {FileChannel out = new FileOutputStream("D:\\test\\a.txt").getChannel();out.write(ByteBuffer.wrap("富强 民主 文明 和谐 自由 平等 公正 法治 爱国 敬业 诚信 友善".getBytes()));out.close();FileChannel in = new FileInputStream("D:\\test\\a.txt").getChannel();ByteBuffer buff = ByteBuffer.allocate(1024);in.read(buff);buff.flip();//对缓冲器内的文本进行解码System.out.println(Charset.forName("UTF-8").decode(buff));}
富强 民主 文明 和谐 自由 平等 公正 法治 爱国 敬业 诚信 友善

4.获取基本类型

ByteBuffer 虽然只能保存字节类型的数据,但是它提供读取和写入各种基本类型的方法。

  • 示例:
    ByteBuffer 提供 asCharBuffer()、asShortBuffer()、asIntBuffer() 等获取对应基本类型的视图,然后使用视图的 put() 方法插入数据,值得一提的是:ShortBuffer 的 put() 方法放入超过 short 最大上限的数值时,会进行窄化转换,导致结果会变更。

ByteBuffer.allocate(int capacity) 创建指定大小的缓冲区,并为每个位置的值自动置零,故可以通过判断当前位置是否为零得出其位置上有没有分配内容;

    public static void main(String[] args) throws IOException {//分配ByteBuffer的大小ByteBuffer buffer = ByteBuffer.allocate(1024);//获取char类型的视图CharBuffer charBuffer = buffer.asCharBuffer();charBuffer.put("put char");char c;while ((c = buffer.getChar()) != 0) {System.out.print(c);}//重置读取位置,从0开始buffer.rewind();System.out.println();//获取short类型的视图ShortBuffer shortBuffer = buffer.asShortBuffer();short max = Short.MAX_VALUE;System.out.println("short max:" + max);shortBuffer.put((short) 471124);System.out.println(buffer.getShort());shortBuffer.put((short) 1234);System.out.println(buffer.getShort());buffer.rewind();//获取int类型的视图IntBuffer intBuffer = buffer.asIntBuffer();intBuffer.put(99471142);System.out.println(buffer.getInt());buffer.rewind();}
put char
short max:32767
12372
1234
99471142

本次分享至此结束,希望本文对你有所帮助,若能点亮下方的点赞按钮,在下感激不尽,谢谢您的【精神支持】。

若有任何疑问,也欢迎与我交流,若存在不足之处,也欢迎各位指正!

NIO 类的基本用法 --《JAVA编程思想》79相关推荐

  1. 类的包访问权限:《Java编程思想》中一段话的困惑

    类的包访问权限:<Java编程思想>中一段话的困惑 在<java编程思想第三版>(陈昊鹏 饶若楠等译)的第五章隐藏具体实现中,5.4节的最后一段话是: "正如前面所提 ...

  2. 33.JAVA编程思想——JAVA IO File类

    33.JAVA编程思想--JAVA IO File类 RandomAccessFile用于包括了已知长度记录的文件.以便我们能用 seek()从一条记录移至还有一条:然后读取或改动那些记录. 各记录的 ...

  3. 【java】《java编程思想》 读书笔记

    之前主要用的C++的比较多,之前花了快2个月的实际认真系统全面的学习了以下java的基础语法,<java编程思想>这本书翻译水平确实不是很好,很多话读着会比较拗口.推荐读之前,先去网上搜索 ...

  4. java编程思想--概述

    之前主要用的C++的比较多,之前花了快2个月的实际认真系统全面的学习了以下java的基础语法,<java编程思想>这本书翻译水平确实不是很好,很多话读着会比较拗口.推荐读之前,先去网上搜索 ...

  5. Java编程思想第四版学习总结

    Java编程思想第四版学习总结 文章目录 Java编程思想第四版学习总结 第 1 章 对象入门 1.1 抽象的进步 1.2 对象的接口 1.3 实现方案的隐藏 1.4 方案的重复使用 1.5 继承:重 ...

  6. java 四舍五入_《JAVA编程思想》5分钟速成:1-4章:概述

    前言: 1.面向对象的特征有哪些方面? 2.Math.round(11.5) 等于多少? Math.round(-11.5)等于多少? 3.float f=3.4;是否正确? 4.short s1 = ...

  7. Java编程思想学习笔记-第11章

    <?xml version="1.0" encoding="utf-8"?> Java编程思想学习笔记-第11章 Java编程思想学习笔记-第11章 ...

  8. Java编程思想第四版——第十五天

    2012-04-23 121-131/913 Java编程思想第四版--第十五天 5.5.3 终结条件 通常不能指望finalize(),必须创建其他的"清理"方法,并明确的调用它 ...

  9. 《Java编程思想》读书笔记

    前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十七章到第十八章的内容,这一次 ...

  10. 12.JAVA编程思想——集合的类型

    12.JAVA编程思想--集合的类型 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51100510 标准Java 1.0 和1 ...

最新文章

  1. 自动驾驶之多传感器融合-硬件篇(毫米波雷达)
  2. 基于特征的推荐算法【转】
  3. JQuery-学习笔记02【基础——JQuery选择器】
  4. 过桥问题——图论解法
  5. Interactive Report UI - IFrame
  6. 于数据交换格式XML和JSON的比较
  7. Bootstrap3 价格滑动块 price range bootstrap-slider
  8. 比较两个listString是否相等
  9. 抽象类及继承(本科生和研究生类)
  10. Bzoj4556 [Tjoi2016Heoi2016]字符串
  11. RedHat Enterprise Linux 5下安装firefox
  12. 《Python预测之美》送书活动,拿走不谢~
  13. 浅析h3c交换机端口模式access,trunk与hybrid之联系与区别
  14. 机器学习笔记(四)BP神经网络模型
  15. 如何修复Win10下的 flashplayer?
  16. Scan Reorder Formal
  17. 【图神经网络】图神经网络(GNN)学习笔记:图滤波器与图卷积神经网络
  18. 周期性的方波 matlab,[转载]matlab产生方波脉冲和周期性方波信号
  19. 金蝶软件系统管理与维护常见问题
  20. KBQA知识问答概述

热门文章

  1. 六种方法全面提升你的气质
  2. 设计模式(五)【Bridge模式】
  3. 计算机硬盘满了怎么解决,硬盘满了怎么办?
  4. BUG修改:java.lang.NoClassDefFoundError: org/springframework/boot/Bootstrapper
  5. MVC模式 三层架构
  6. Vue 通过url下载文件并修改文件名称
  7. rst 语法+简明教程
  8. 分布式调用跟踪与监控实战
  9. 统计字符串中26个英文字母的个数
  10. 用MDT 2012为企业部署windows 7(十二)--修改部署系统的任务序列