Java NIO 通道类似于流,但有一些差异:
你可以对通道读写。流通常是单向(读或写)
异步读写通道
通道通常往缓冲区读,或从缓冲区写
如上所述,你从通道将数据读入缓冲区,从缓冲区将数据写入通道。以下是示意图:
以下是 Java NIO 中非常重要的通道实现:
FileChannel
从文件读或往文件写数据。
DatagramChannel
可以通过 UDP
在网络上读写数据。
SocketChannel
可以通过 TCP
在网络上读写数据。
ServerSocketChannel
允许你监听接入的 TCP 连接,像 web 服务器一样。每接入一个连接就创建一个 ServerSocketChannel
。
以下是使用 FileChannel
把一些数据读入缓冲区的基础示例:
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); FileChannel inChannel = aFile.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(48); int bytesRead = inChannel.read(buffer); while (bytesRead != -1) { log.info("Read -> {}", bytesRead); buffer.flip(); while (buffer.hasRemaining()) { log.info("Read -> {}", buffer.get()); } buffer.clear(); bytesRead = inChannel.read(buffer); } aFile.close(); 复制代码
注意调用 buf.flip()
。首先将数据写入缓冲区,然后切换模式,读出数据。关于缓冲区的更多详情见下文。