Java NIO Channel
Java NIO通道类似于流,但有一些区别:
- 你可以从Channel中读取数据,也可以写数据到Channel。流通常是单向的(读或写)。
- Channel可以异步读写。
- Channel始终将数据读到Buffer或从Buffer写入。
如上所述,你将数据从Channel读取到Buffer中,然后将数据从Buffer写入Channel中:
2.Channel的实现
以下是Java NIO中最重要的Channel实现:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
FileChannel从文件读取数据或向文件写入数据。
DatagramChannel可以通过UDP通过网络读取和写入数据。
SocketChannel可以通过TCP通过网络读取和写入数据。
ServerSocketChannel允许你像Web服务器一样侦听传入的TCP连接。对于每个传入连接,都会创建一个SocketChannel。
3.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) {
System.out.println("Read " + bytesRead);
buf.flip();
while(buf.hasRemaining()){
System.out.print((char) buf.get());
}
buf.clear();
bytesRead = inChannel.read(buf);
}
aFile.close();
请注意buf.flip()调用。首先,将文件数据读入到Buffer。然后,转换读写模式,再从buf中读出所有数据。
原文地址: https://www.zhblog.net/go/java/tutorial/java-nio-channel?t=610