Java NIO - 通道
描述
顾名思义,Channels(通道)是用作从一端到另一端的数据流的手段。在 Java NIO 中,通道在缓冲区和另一端的实体之间起着相同的作用,换句话说,通道用于将数据读取到缓冲区,也用于从缓冲区写入数据。
与传统 Java IO 中使用的流不同,通道是双向的,即可以读取也可以写入。Java NIO 通道支持阻塞和非阻塞模式下的异步数据流。
通道的实现
Java NIO 通道主要在以下类中实现 −
FileChannel − 为了从文件读取数据,我们使用文件通道。因为我们无法直接创建文件对象,所以只能通过调用文件对象上的 getChannel() 方法来创建文件通道的对象。
DatagramChannel − 数据报通道可以通过 UDP(用户数据报协议)在网络上读取和写入数据。可以使用工厂方法创建 DataGramchannel 的对象。
SocketChannel − SocketChannel 通道可以通过 TCP(传输控制协议)在网络上读取和写入数据。它还使用工厂方法来创建新对象。
ServerSocketChannel − ServerSocketChannel 通过 TCP 连接读取和写入数据,与 Web 服务器相同。对于每个传入连接,都会创建一个 SocketChannel。
示例
以下示例从 C:/Test/temp.txt 中的文本文件读取并将内容打印到控制台。
temp.txt
Hello World!
ChannelDemo.java
import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class ChannelDemo { public static void main(String args[]) throws IOException { RandomAccessFile file = new RandomAccessFile("C:/Test/temp.txt", "r"); FileChannel fileChannel = file.getChannel(); ByteBuffer byteBuffer = ByteBuffer.allocate(512); while (fileChannel.read(byteBuffer) > 0) { // 翻转缓冲区以准备获取操作 byteBuffer.flip(); while (byteBuffer.hasRemaining()) { System.out.print((char) byteBuffer.get()); } } file.close(); } }
输出
Hello World!