序言:学Netty之前,对流的概念应该深刻一些,所以先理解一下流的使用!
1、IO、NIO、AIO 含义区别
1.1 同步阻塞I/O(BIO block io)
jdk1.4之前就一个io流,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制来改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务端资源要求比较高,并发局限于应用中。
1.2 同步非阻塞I/O(NIO)
Java NIO(New IO)是从Java 1.4版本开始引入的 一个新的IO API,可以替代标准的Java IO API。 NIO与原来的IO有同样的作用和目的,但是使用 的方式完全不同,NIO支持面向缓冲区的、基于 通道的IO操作。NIO将以更加高效的方式进行文 件的读写操作。
1.3 异步非阻塞I/O(AIO)
异步非阻塞I/O,服务器实现模式为一个有效请求一个线程,客户端的IO请求都是由操作系统先完成了再通知服务器用其启动线程进行处理。AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,jdk1.7开始支持。
1.4 同步与异步的区别
同步:一个人只能先上完小学才能上初中,上完初中才能上高中,最后才可以大学,一步一步来,这是同步。
异步:一个人可以一边听歌,也可以一边玩游戏,两种动作可以同时进行
1.5 NIO与IO的区别
2、NIO的核心
client(客户端)和server(服务端),把数据client传送到server,或者server传送到client,就相当于怎么上海火车站的人群运输到北京火车站,或者北京车站运输到上海火车站。
channel相当于:北京上海之间的铁轨
buffer相当于:火车(可以有多个型号的火车)
2.1 Buffer(缓冲区)
在Java NIO中负责数据的存取,缓冲区就是数组,用于存储不同数据类型的数据,根据数据类型不同,提供了响应类型的缓冲区:ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer,通过 allocate() 获取缓冲区。
2.2 Channel(通道)
Channel类似于传送的流,只不过Channel本身不能直接访问数据,Channel只能与Buffer进行交互
简而言之,Channel 负责传输, Buffer 负责存储
接下来的几片博客,将详细分别讲述Buffer、Channel的用法。
3、Path 与 Paths
3.1 Path
Pathjava.nio.file.Path 接口代表一个平台无关的平台路径,描述了目录结构中文件的位置。
Path常用方法:
booleanendsWith(Stringpath) | 判断是否以path路径结束 |
booleanstartsWith(Stringpath) | 判断是否以path路径开始 |
boolean isAbsolute() | 判断是否是绝对路径 |
PathgetFileName() | 返回与调用Path对象关联的文件名 |
Path getName(int idx) | 返回的指定索引位置 idx 的路径名称 |
intgetNameCount() | 返回Path根目录后面元素的数量 |
PathgetParent() | 返回Path对象包含整个路径,不包含Path对象指定的文件路径 |
PathgetRoot() | 返回调用Path对象的根路径 |
Path resolve(Path p) | 将相对路径解析为绝对路径 |
PathtoAbsolutePath() | 作为绝对路径返回调用Path对象 |
StringtoString() | 返回调用Path对象的字符串表示形式 |
3.2 Paths
java.nio.file.Files 用于操作文件或目录的工具类。
Files常用方法
方法 | 描述 |
---|---|
Path get(String first, String ... more) | Paths提供的get()方法用来获取Path对象,用于将多个字符串串连成路径 |
Path copy(Path src, Path dest, CopyOption ... how) | 文件的复制 |
Path createDirectory(Path path, FileAttribute<?> ... attr) | 创建一个目录 |
Path createFile(Path path, FileAttribute<?> ... arr) | 创建一个文件 |
void delete(Path path) | 删除一个文件 |
Path move(Path src, Path dest, CopyOption...how) | 将 src 移动到 dest 位置 long size(Path path) : 返回 path 指定文件的大小 |
boolean exists(Path path, LinkOption ... opts) | 判断文件是否存在 |
boolean isDirectory(Path path, LinkOption ... opts) | 判断是否是目录 |
boolean isExecutable(Path path) | 判断是否是可执行文件 |
boolean isHidden(Path path) | 判断是否是隐藏文件 |
boolean isReadable(Path path) | 判断文件是否可读 |
boolean isWritable(Path path) | 判断文件是否可写 |
boolean notExists(Path path, LinkOption ... opts) | 判断文件是否不存在 |
Files操作内容方法
SeekableByteChannel newByteChannel(Path path, OpenOption...how) | 获取与指定文件的连接,how 指定打开方式。 |
DirectoryStream newDirectoryStream(Path path) | 打开 path 指定的目录 |
InputStream newInputStream(Path path, OpenOption...how) | 获取 InputStream 对象 |
OutputStream newOutputStream(Path path, OpenOption...how) | 获取 OutputStream 对象 |