三、Java NIO 通道(Channel)

所有文章

https://www.cnblogs.com/lay2017/p/12901123.html

 

正文

Java NIO中的通道(Channel)和我们熟悉的流(Stream)很相似,区别点在于:

1.Stream只能读或者写,但是Channel可以同时读写

2.Stream的读写是同步的,而Channel的读写是异步的

3.Channel总是和缓冲区(Buffer)打交道,从Channel读取数据到Buffer或者从Buffer写入数据到Channel,如图:

 

Channel的实现

以下包含了几个在java Nio软件包中比较重要的Channel实现:

1.FileChannel:从文件中读取数据的通道

2.DatagramChannel:通过UDP读取数据

3.SocketChannel:通过TCP读取数据

4.ServerSocketChannel:不直接读取数据,而是监听TCP连接的建立。当有TCP链接建立的时候,那么创建一个SocketChannel,从而通过TCP读取数据

Channel的示例代码

以下是一个很基础的示例代码,使用FileChannel从文件中读取数据到Buffer里

// 构建随机访问可读写的文件对象
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
// 获取文件通道
FileChannel inChannel = aFile.getChannel();
// 分配缓冲区
ByteBuffer buf = ByteBuffer.allocate(48);
// 将通道数据读入到缓冲区
int bytesRead = inChannel.read(buf);
// 当数据不为空
while (bytesRead != -1) {
  // 翻转缓冲区,先limit=position,再position=0
  buf.flip();
  // 如果缓冲区还有剩余数据
  while(buf.hasRemaining()){
      // 获取并打印
      System.out.print((char) buf.get());
  }
  // 将position=0,limit=capacity
  buf.clear();
  // 再次读入数据到缓冲区,进入下一个循环
  bytesRead = inChannel.read(buf);
}
// 关闭文件对象
aFile.close();

代码比较简单,就是通道从文件读取数据,读入buffer再打印。但是这里涉及了一些buffer的操作,比如flip、clear,可能会让读者产生疑惑。后续文章会涉及

 

posted @ 2020-05-17 15:13  __lay  阅读(351)  评论(0编辑  收藏  举报