nio
更新日期:
1. IO和NIO
- IO:分为字节IO,字符IO,网络IO,磁盘IO。每次读取或者写入只能以字节或者字符的方式进行操作。
效率低,可能会产生阻塞 - NIO:非阻塞IO, 关键类有Selector,Channel,Buffer,channel就像是一个管道流,
比喻:不论是从buffer读还是写到buffer中,都是通过channel,再通过channel读写的这个过程, 线程就可以去做一些其他的事情,当buffer缓冲完成之后,直接对buffer进行操作。 这样很大程度上加快了速度,减少了阻塞。
想要使用大量水,但是水龙头水量很小,所以先使用盆子(buffer)来接,此时人就可以干其他的事;
当满的时候,水龙头就可以被其他人使用
2. NIO工作原理
selector用来监听多个channel,一个线程处理一个selector,也就意味着一个线程可以同时处理多个channel中的
读取一个channel对应一个buffer
实战:
- 应用channel和buffer的读写文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24public class TestNIO {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("D:/极客网/作业/JAVA测试题.docx");
FileOutputStream fos = new FileOutputStream("D:/NIO.docx");
FileChannel readChannel = fis.getChannel();
FileChannel writeChannel = fos.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
while(true) {
buffer.clear();
if(readChannel.read(buffer) == -1) {
break;
}
//将buffer的模式从写模式切换成读模式
buffer.flip();
writeChannel.write(buffer);
}
readChannel.close();
writeChannel.close();
}
}
3. Channel
- FileChannel: 从文件读数据,或写到文件中去
- DatagramChannel:通过网络进行交互,读或者写,这个网络使用UDP(如:DNS,TFTP,DHCP)
- SocketChannel:通过网络进行数据交互,这个网络使用TCP(http)
- ServerSocketChannel:允许监听TCP连接,就像Web服务器那样,此channel监听的端口监听到有TCP请求则为此请求建立SocketChannel进行交互
4. Buffer
(1).类型
- ByteBuffer
- CharBuffer
- MappedByteBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
使用时依据要缓存的内容选择合适的buffer
(2).主要函数
flip():将写模式转换成读模式1
2
3
4
5
6public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}
- limit:写模式 == capacity;读模式时 == 写模式下的position, 总之都是限制的意思,读模式限制能读的个数,
写模式限制能写的个数 - position 相当于指针的位置,写模式时是当前写入数据所在位置,读模式时是当前读数据的位置读的时候,
position++ <= limit - 主要用法
写数据到buffer中 -> flip() -> 从buffer中读取数据 -> clear()删除已读取的数据或者compact()删除所有