系列文章:
Android NIO 系列教程(一) NIO概述
Android NIO 系列教程(二) – Channel
Android NIO 系列教程(三) – Buffer
Android NIO 系列教程(四) – Selector
Android NIO 系列教程(五) – FileChannel
Android NIO 系列教程(六) – SocketChannel
Android NIO 系列教程(七) – ServerSocketChannel
Android NIO 系列教程(八) --NIO简易聊天室
根据 英语原文 翻译过来,添加自己一些理解,英语好的,也可以直接阅读原文。
Channel
NIO中的 channel 类似流,然而也有些不同:
- Channel 可以同时进行读写操作,而流只能单向 (read 或者 write)
- Channel 可以异步读写
- Channel 总是从 Buffer 读或者写数据
如上所述,你可以通过 buffer 读数据到 channel ,也可以通过 buffer 写数据到 channel,如下:
Channel 的种类有以下几种,包含了 TCP+UDP,网络和文件类型:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
一个简单例子:
FileInputStream fis = new FileInputStream("data.txt");
//通过 getChannel 获取Channel 实例
FileChannel channel = fis.getChannel();
ByteBuffer buf = ByteBuffer.allocate(48); // 创建 48 个字节的buffer
int bytesRead = channel.read(buf); // channel 写数据到 buffer
while (bytesRead != -1) {
System.out.println("Read " + bytesRead);
// 从写模式切换到读模式
buf.flip();
while(buf.hasRemaining()){
System.out.print((char) buf.get());
}
buf.clear(); // 清除 buffer 的数据,这样才能继续被写入
bytesRead = channel.read(buf);
System.out.println("\n");
}
fis.close();
打印如下:
注意 buf.flip() 的调用,首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据;下面我们来介绍buffer 的使用;而关于 channel ,我们将在学习了 buffer 和 selector 之后,再继续学习。