天天看点

Java NIO

IO流学习总结

(1) 按操作方式分类结构图:

Java NIO

(2)按操作对象分类结构图

Java NIO

IO流的分类:

按照流的流向分,可以分为输入流和输出流;

按照操作单元划分,可以划分为字节流和字符流;

按照流的角色划分为节点流和处理流。

流的原理浅析:

java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java Io流的40多个类都是从如下4个抽象类基类中派生出来的。

InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。

OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

常用的io流的用法

NIO学习总结

NIO简介:

Java NIO 是 java 1.4, 之后新出的一套IO接口NIO中的N可以理解为Non-blocking,不单纯是New。

NIO的特性/NIO与IO区别:

1)IO是面向流的,NIO是面向缓冲区的;

2)IO流是阻塞的,NIO流是不阻塞的;

3)NIO有选择器,而IO没有。

读数据和写数据方式:

从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。

从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。

NIO核心组件简单介绍

Channels

Buffers

Selectors

Buffer(缓冲区)介绍:

Java NIO Buffers用于和NIO Channel交互。 我们从Channel中读取数据到buffers里,从Buffer把数据写入到Channels;

Buffer本质上就是一块内存区;

一个Buffer有三个属性是必须掌握的,分别是:capacity容量、position位置、limit限制。

Buffer的常见方法

Buffer clear()

Buffer flip()

Buffer rewind()

Buffer position(int newPosition)

Buffer的使用方式/方法介绍:

分配缓冲区(Allocating a Buffer):

写入数据到缓冲区(Writing Data to a Buffer)

写数据到Buffer有两种方法:

1.从Channel中写数据到Buffer

2.通过put写数据:

Buffer常用方法测试

说实话,NIO编程真的难,通过后面这个测试例子,你可能才能勉强理解前面说的Buffer方法的作用。

Channel(通道)介绍

通常来说NIO中的所有IO都是从 Channel(通道) 开始的。

NIO Channel通道和流的区别:

FileChannel的使用

SocketChannel和ServerSocketChannel的使用

️DatagramChannel的使用

Scatter / Gather

Scatter: 从一个Channel读取的信息分散到N个缓冲区中(Buufer).

Gather: 将N个Buffer里面内容按照顺序发送到一个Channel.

通道之间的数据传输

在Java NIO中如果一个channel是FileChannel类型的,那么他可以直接把数据传输到另一个channel。

transferFrom() :transferFrom方法把数据从通道源传输到FileChannel

transferTo() :transferTo方法把FileChannel数据传输到另一个channel

Selector(选择器)介绍

Selector 一般称 为选择器 ,当然你也可以翻译为 多路复用器 。它是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写。如此可以实现单线程管理多个channels,也就是可以管理多个网络链接。

使用Selector的好处在于: 使用更少的线程来就可以来处理通道了, 相比使用多个线程,避免了线程上下文切换带来的开销。

Selector(选择器)的使用方法介绍

Selector的创建

注册Channel到Selector(Channel必须是非阻塞的)

SelectionKey介绍

一个SelectionKey键表示了一个特定的通道对象和一个特定的选择器对象之间的注册关系。

从Selector中选择channel(Selecting Channels via a Selector)

选择器维护注册过的通道的集合,并且这种注册关系都被封装在SelectionKey当中.

停止选择的方法

wakeup()方法 和close()方法。

模板代码

有了模板代码我们在编写程序时,大多数时间都是在模板代码中添加相应的业务代码。

客户端与服务端简单交互实例

一 文件I/O基石:Path:

创建一个Path

File和Path之间的转换,File和URI之间的转换

获取Path的相关信息

移除Path中的冗余项

二 拥抱Files类:

Files.exists() 检测文件路径是否存在

Files.createFile() 创建文件

Files.createDirectories()和Files.createDirectory()创建文件夹

Files.delete()方法 可以删除一个文件或目录

Files.copy()方法可以吧一个文件从一个地址复制到另一个位置

获取文件属性

遍历一个文件夹

Files.walkFileTree()遍历整个目录