Java NIO Channel(通道)与Java IO 的Stream(流)很相似但是有几点不同:
- 您可以读取和写入Channel。 Stream通常是单向的(读或写,如InputStream和OutputStream)。
- Channel可以被异步读取和写入。
- Channel面向Buffer,Channel读出数据到Buffer或者从Buffer获得数据写出。
如上所述,您将通道中的数据读入缓冲区,并将数据从缓冲区写入通道。 这是一个例子:
通道将数据读入缓冲区,缓冲区将数据写入通道
Channel 实现
以下是Java NIO中最重要的Channel实现:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
FileChannel负责文件数据的读入或者写出。
DatagramChannel能够读入或者写出基于UDP协议的数据。
SocketChannel能够读入或者写出基于TCP协议的数据。
ServerSocketChannel允许您监听传入的TCP连接,就像Web服务器一样。 为每个传入连接创建一个SocketChannel。
基本的Channel示例:
以下一个基本的例子,它使用FileChannel将一些数据读入缓冲区:
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* @author: gethin
* @create: 2018-06-05 20:52
* @description:
**/
public class BasicChannelExample {
public static void main(String[] args) throws IOException {
RandomAccessFile aFile = new RandomAccessFile("test.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的文章中详细介绍这方面的内容。上述代码结果示例如下:
Channel读入文件示例
Channel读入文件示例
上一节:Java NIO 概述
下一节:Java NIO Buffer