Java NIO 的Channel与stream有些相似,但略有不同:
- 你既可以读也可以往channel里写。stream一般是单向的(读或者写)
- channel读写是异步的
- channel总是从buffer里读,或向buffer里写
如上面提到的,你读数据是channel向buffer,而写数据则是buffer写入到channel,下面是相关的示意图:
Channel的实现
下面是Java NIO中最重要的channel实现:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
FileChannel可以读或写文件。
DatagramChannel可以使用UDP在网络上读写数据。
SocketChannel可以使用TCP在网络上读写数据。
ServerSocketChannel可以让你监听即将到来的TCP连接,就像web服务做得一样。为每个到来的连接创建ServerSocketChannel。
channel的基础示例
下面是一个基础示例,使用了FileChannel去读数据至buffer中:
RandomAccessFile aFile = new RandomAccessFile("C:\\Users\\DELL\\Desktop\\channel.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。然后你反转(flip)buffer。然后从中读取数据。这些具体的细节,会在下一节给出详细说明。
想要查看此教程的目录请点击:Java NIO教程目录贴地址