Java NIO 学习笔记三

选择器基础选择器提供选择执行已经就绪的任务的能力。就绪选择和多元执行使得单线程能够有效率的同时管理多个I/O通道。 选择器:选择器管理着一个被注册的通道集合的信息和他们的就绪状态。通道是和选择器一起被注册的,并且使用选择器来更新通道的就绪状态。 可选择通道:这个抽象类提供了实现通道的可选择性所需要的公共方法。它是所有支持就绪检查的通道类的父类。 选择键:选择键封装了特定的通道与特定的选择器的注册关系。 调用可选择通道的register()方法会将它注册到一个选择器上,但是这个通道必须是开启的并且处于非阻塞状态的。一个给定的通道可以注册到多于一个的选择器上。选择器是提供选择功能的对象,选择器对象对注册到它之上的通道进行就绪选择,并管理选择键。

Java NIO 学习笔记二

通道基础Channel表示IO源与目标打开的连接。在NIO中所有的IO都是从通道开始的。从通道进行数据的读取或者从通道进行数据写入。通道的顶层接口只Channel接口。其中定义了两个方法。 12public boolean isOpen()public void close() throws IOException; 由Channel引申的实现类都是面向ByteBuffer的。将IO从广义上分类,可以分为File I/O和Stream I/O。相应的也有两种不同类型的通道,分别是文件通道,和套接字通道。分别是FileChannel和SocketChannel、ServerSocketChannel、DatagramChannel. 通道可以是单向的也可以是双向的,这取决于它们对ReadableByteChannel接口和WritableByteChannel接口的实现情况。而ByteChannel做的工作仅仅是聚集接口。实现ByteChannel接口的通道可以是双向的。但它不一定就是双向的,比如从FileInputStream对象使用getChannel方法获取的FileChannel对象是只读的,这和权限有关。

Java NIO 学习笔记一

缓冲区操作进程执行I/O操作,归结起来就是向操作系统发出请求,它要么把缓存区例的数据排干(写),要么用数据把数据区填满(读)。进程使用这一机制处理所有数据进出操作。进程使用read()系统调用,要求其缓存区被填满。内核随即向磁盘控制器发出命令,要求其从磁盘读取数据。通过DMA技术直接将磁盘中的数据写入内核内存缓存区,一旦磁盘控制器把缓存区填满,内存立即把数据从内核空间的里你是缓冲区拷贝到进程执行read()调用时指定的缓冲区。 发散/汇聚根据发散/汇聚的概念,进程只需要一个系统调用,就能把一连串的缓冲区地址传递给操作系统。然后,内核就能顺序填充或排干多个缓冲区,读的时候将数据发散到多个用户空间缓冲区,写的时候再从多个缓冲区把数据汇聚起来。 利用虚拟内存避免一些拷贝前面提到设备控制器不能使用DMA直接存储到用户空间,需要从内核空间拷贝到用户空间。但在使用内存多重映射技术可以避免这种拷贝。现代操作系统都使用虚拟内存,它有极大优点: 多个虚拟地址可以映射到同一个物理地址。 虚拟内存空间可能大于实际可用的硬件内存。