Java Nio 简明教程

Java NIO - Channels

Description

顾名思义,管道用作从一端到另一端的数据流方式。此处在 Java NIO 中,管道在缓冲区和另一端的一个实体之间起着同样的作用,换句话说,管道用于将数据读入缓冲区并从缓冲区写入数据。

与在传统 Java IO 中使用的流不同,管道是双向的,即既可以读取又可以写入。Java NIO 管道既支持阻塞模式,也支持非阻塞模式下的异步数据流。

Implementations of Channel

Java NIO 管道主要在以下类中实现 −

  1. FileChannel − 为了从文件中读取数据,我们使用文件管道。文件管道的对象只能通过在文件对象上调用 getChannel() 方法创建,因为我们不能直接创建文件对象。

  2. DatagramChannel − 数据报管道可以通过 UDP(用户数据报协议)在网络上读取和写入数据。DataGramchannel 对象可以使用工厂方法创建。

  3. SocketChannel − SocketChannel 管道可以通过 TCP(传输控制协议)在网络上读取和写入数据。它还使用工厂方法创建新对象。

  4. ServerSocketChannel − ServerSocketChannel 读取和写入 TCP 连接上的数据,就像 Web 服务器一样。对于每个传入连接,都会创建一个 SocketChannel。

Example

以下示例从 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) {
         // flip the buffer to prepare for get operation
         byteBuffer.flip();
         while (byteBuffer.hasRemaining()) {
            System.out.print((char) byteBuffer.get());
         }
      }
      file.close();
   }
}

Output

Hello World!