文章目录
  1. 1. 1. IO和NIO
  2. 2. 2. NIO工作原理
  3. 3. 3. Channel
    1. 3.1. 4. Buffer

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
    24
    public 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
6
public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}

  • limit:写模式 == capacity;读模式时 == 写模式下的position, 总之都是限制的意思,读模式限制能读的个数,
    写模式限制能写的个数
    
  • position 相当于指针的位置,写模式时是当前写入数据所在位置,读模式时是当前读数据的位置读的时候,
    position++ <= limit
    
  • 主要用法
    写数据到buffer中 -> flip() -> 从buffer中读取数据 -> clear()删除已读取的数据或者compact()删除所有

参考
CSDN
Jakob Jenkov

文章目录
  1. 1. 1. IO和NIO
  2. 2. 2. NIO工作原理
  3. 3. 3. Channel
    1. 3.1. 4. Buffer