01 java中IO、NIO
IO与NIO的比较
IO是面向流的,NIO是面向缓冲区的;IO的各种流是阻塞的, NIO是非阻塞模式
IO |
NIO |
面向流 |
面向缓冲 |
阻塞IO |
非阻塞IO |
无 |
选择器 |
1 IO
IO流的分类:
按照流的流向分,可以分为输入流和输出流;
按照操作单元划分,可以划分为字节流和字符流;
按照流的角色划分为节点流和处理流。
流的原理浅析:
java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java Io流的40多个类都是从如下4个抽象类基类中派生出来的。
InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
2 NIO
2.1 NIO 之 Buffer(缓冲区)
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):
ByteBuffer buf = ByteBuffer.allocate(28);//以ByteBuffer为例子
写入数据到缓冲区(Writing Data to a Buffer)
写数据到Buffer有两种方法:
(1)从Channel中写数据到Buffer
int bytesRead = inChannel.read(buf); //read into buffer.
(2)通过put写数据:
buf.put(127);
2.2 NIO 之 Channel(通道)
在Java NIO中如果一个channel是FileChannel类型的,那么他可以直接把数据传输到另一个channel。
transferFrom() :transferFrom方法把数据从通道源传输到FileChannel
transferTo() :transferTo方法把FileChannel数据传输到另一个channel
2.3 NIO之Selector(选择器)
Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。
2.4 NIO之拥抱Path和Files
JDK中Paths工具类,Files工具类,对NIO中的功能进行了高度封装,大大简化了文件系统的IO编程。
(1)文件I/O基石:Path:
创建一个Path
File和Path之间的转换,File和URI之间的转换
获取Path的相关信息
移除Path中的冗余项
(2)拥抱Files类:
Files.exists() 检测文件路径是否存在
Files.createFile() 创建文件
Files.createDirectories()和Files.createDirectory()创建文件夹
Files.delete()方法 可以删除一个文件或目录
Files.copy()方法可以吧一个文件从一个地址复制到另一个位置
获取文件属性
遍历一个文件夹
Files.walkFileTree()遍历整个目录