一、什么是NIO?

Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。

二、Java NIO 与 IO 的主要区别

IO

NIO

面向流(Steam Oriented)

面向缓冲区(Buffer Oriented)

阻塞IO(Blocking IO)

非阻塞IO(Non Blocking IO)

(无)

选择器(Selector)

三、缓冲区(Buffer)和通道(Channel)

1、Buffer缓冲区:

Buffer 就像一个数组,可以保存多个相同类型的数据。根据数据类型不同(boolean 除外) ,有以下 Buffer 常用子类:

​ ByteBuffer

​ CharBuffer

​ ShortBuffer

​ IntBuffer

​ LongBuffer

​ FloatBuffer

​ DoubleBuffer

上述 Buffer 类 他们都采用相似的方法进行管理数据,只是各自管理的数据类型不同而已。都是通过如下方法获取一个 Buffer对象:static XxxBuffer allocate(int capacity) : 创建一个容量为 capacity 的 XxxBuffer 对象

缓冲区中的四个属性:

capacity:容量,表示缓冲区中最大存储数据的容量。一旦声明不能改变。

limit:界限,表示缓冲区中可以操作数据的大小。(limit 后数据不能进行读写)。

position:位置,下一个要读取或写入的数据的索引。缓冲区的位置不能为负,并且不能大于其限制表示缓冲区中正在操作数据的位置。

标记 (mark)与重置 (reset):标记是一个索引,指定 Buffer 中一个当前的 position位置,之后可以通过调用 reset() 方法恢复到这个 position位置.

0 <= mark <= position <= limit <= capacity

Buffer中的常用的properties:

put()

想缓冲区中写入数据

Buffer flip()

将缓冲区的界限设置为当前位置(position),并将当前位置(position)赋值为 0

Buffer get()

切换至读模式之后,获取数据

Buffer clear()

清空缓冲区并返回对缓冲区的引用,缓冲区中的数据依然存在只是处于”被遗忘“状态

Buffer mark()

对缓冲区设置标记

Buffer position(int n)

将设置缓冲区的当前位置为 n , 并返回修改后的 Buffer 对象

Buffer limit(int n)

将设置缓冲区界限为 n, 并返回一个具有新 limit 的缓冲区对象

boolean hasRemaining()

判断缓冲区中是否还有元素

int limit()

返回 Buffer 的界限(limit) 的位置

int capacity()

返回 Buffer 的 capacity 大小

int position()

返回缓冲区的当前位置 position

int remaining()

返回 position 和 limit 之间的元素个数

Buffer reset()

将位置 position 转到以前设置的 mark 所在的位置

Buffer rewind()

将位置设为为 0, 取消设置的 mark

Buffer中的数据操作,get()与put()方法:

获取 Buffer 中的数据:

get() :读取单个字节

get(byte[] dst):批量读取多个字节到 dst 中

get(int index):读取指定索引位置的字节(不会移动 position)

放入数据到 Buffer 中:

put(byte b):将给定单个字节写入缓冲区的当前位置

put(byte[] src):将 src 中的字节写入缓冲区的当前位置

put(int index, byte b):将指定字节写入缓冲区的索引位置(不会移动 position)

直接缓冲区与非直接缓冲区:

​ 直接缓冲区:通过allocate()方法分配缓冲区,将缓冲区建立在JVM 的内存中。

​ 非直接缓冲区:通过allocateDirect()方法分配直接缓冲区,将缓冲区建立在物理内存中,可以提高效率。

2、通道(Channel)

四、文件通道(FileChannel)

通道(Channel):由 java.nio.channels 包定义 的。Channel 表示 IO 源与目标打开的连接。 Channel 类似于传统的“流”。只不过 Channel 本身不能直接访问数据,Channel 只能与 Buffer 进行交互。

FileChannel

---- 用于读取、写入、映射和操作文件的通道

直接字节缓冲区可以通过调用此类的 allocateDirect() 工厂方法来创建。此方法返回的缓冲区进行分配和取消 分配所需成本通常高于非直接缓冲区。直接缓冲区的内容可以驻留在常规的垃圾回收堆之外,因此,它们对 应用程序的内存需求量造成的影响可能并不明显。所以,建议将直接缓冲区主要分配给那些易受基础系统的 本机 I/O 操作影响的大型、持久的缓冲区。一般情况下,最好仅在直接缓冲区能在程序性能方面带来明显好 处时分配它们。

直接字节缓冲区还可以通过 FileChannel 的 map() 方法 将文件区域直接映射到内存中来创建。该方法返回 MappedByteBuffer 。Java 平台的实现有助于通过 JNI 从本机代码创建直接字节缓冲区。如果以上这些缓冲区 中的某个缓冲区实例指的是不可访问的内存区域,则试图访问该区域不会更改该缓冲区的内容,并且将会在 访问期间或稍后的某个时间导致抛出不确定的异常。

SocketChannel

---- 通过 TCP 读写网络中的数据。

ServerSocketChannel

---- 可以监听新进来的 TCP 连接,对每一个新进来 的连接都会创建一个 SocketChannel。

DatagramChannel

---- 通过 UDP 读写网络中的数据通道

五、NIO 的非阻塞式网络通信

1、选择器(Selector)

2、SocketChannel、ServerSocketChannel、DatagramChannel

六、管道(Pipe)

七、Java NIO2 (Path、Paths 与 Files )

java8 nio_Java8之 NIO的学习相关推荐

  1. Java NIO、NIO.2学习笔记

    http://www.cnblogs.com/littlehann/p/3720396.html 相关学习资料   http://www.molotang.com/articles/903.html ...

  2. java8新特性-Stream入门学习

    上一篇介绍了Lambda的学习,如果对Lambda表达式还不清晰的同学可以戳一下这个链接:java8新特性-lambda表达式入门学习.java8除了提供了Lambda表达式,操作集合的Stream ...

  3. java BIO/NIO/AIO 学习

    参考地址 https://www.cnblogs.com/diegodu/p/6823855.html 一.了解Unix网络编程5种I/O模型 1.1.阻塞式I/O模型 阻塞I/O(blocking ...

  4. BIO NIO AIO 学习笔记

    BIO NIO AIO 1.同步阻塞的BIO 1.1 BIO介绍 1.2 BIO通信案例 2.同步非阻塞的NIO 2.1 NIO的介绍 2.2 NIO核心一Buffer缓冲区 2.3 NIO核心二Ch ...

  5. 【NIO】学习系列(二)ByteBuffer类

    文章目录 1.介绍 2.创建非直接缓冲区与直接缓冲区 3.直接缓冲区的垃圾释放 4.直接缓冲区与非直接缓冲区的运行效率比较 5.包装Wrap数据的处理 6.put(byte b)和get()方法的使用 ...

  6. java createchannel_【原创】java NIO FileChannel 学习笔记 新建一个FileChannel

    首先使用FileChannel 的open方法获取一个FileChannel对象.下面这段代码是FileChannel中open方法的代码. public static FileChannel ope ...

  7. Java基础学习总结(170)——Java8并发工具类CompletableFuture学习总结

    一.What's a CompletableFuture? 首先了解什么是CompletableFuture,它是用于Java中的异步编程.异步编程是一种编写非阻塞代码的方法,它通过在主应用程序线程独 ...

  8. java8学习_java8学习

    Java8 Lambda表达式和Stream学习 lambda表达式和Stream是Java8的新特性,这次分享一下我在学习lambda表达式和Stream的收获. 这是这次测试用的Entity: p ...

  9. NIO学习--缓冲区

    Buffer其实就是是一个容器对象,它包含一些要写入或者刚读出的数据.在NIO中加入Buffer对象,体现了新库与原I/O的一个重要区别.在面向流的I/O中,您将数据直接写入或者将数据直接读到Stre ...

最新文章

  1. 总监路上的第 1 年,犯了两个小错误 | 程序员有话说
  2. 大数据营销要学会做减法
  3. 3.4 改进集束搜索-深度学习第五课《序列模型》-Stanford吴恩达教授
  4. university of liverpool writing techniques
  5. 产品经理如何进行需求管理?
  6. linux/shell相关知识点
  7. 转载 漫谈机器学习中的距离和相似性度量方法
  8. 发那科机器人编程软件fanuc roboguide授权补丁_发那科Robot | Line Tracking功能
  9. info matlab,c – 在OpenCV中是否有类似MATLAB的’impixelinfo()’功能?
  10. java方法重载和重载方法_Java中的重载与重载
  11. 实验报告四 201521430002 张实
  12. 使用Mac系统来进行Java编程
  13. 单片机STM32低功耗
  14. bzoj3097 Hash Killer I
  15. IDEA新版UI申请方法+无测试资格使用方法及相关介绍
  16. 适合笔记本计算机玩的游戏,十款,笔记本电脑可以畅玩的单机游戏
  17. 使用Nodejs搭建一个简易的留言簿(完结)
  18. Sass快速入门笔记(将主要知识点截取出来,参考官方文档和一些网络教学视频)
  19. 毕业设计-基于微信小程序的实验室信息管理系统
  20. More than 100 items having missing data for more than 10 minutes

热门文章

  1. android socket 发送byte_如何正确地创建和销毁网络通讯程序中的Socket类的对象实例...
  2. iphone彻底删除照片如何恢复_手机删除的照片如何恢复?OPPO最新照片恢复
  3. jquery交换数组元素位置_跟我一起学jQuery——第一集
  4. 求合体电脑版_网红界宋祖儿找年轻版言承旭当男友,一张合照收割大量cp粉?!...
  5. java rpg项目代码_java rpg游戏代码(移动保存读取)
  6. python 局域网扫描_Python 简化版扫描局域网存活主机
  7. asterisk1.8 拨号方案 mysql存储(动态)
  8. 打开pjsip2.1版本的视频支持
  9. 突破select的FD_SETSIZE限制
  10. 【转】GPS从入门到放弃(一) --- GPS基础原理