Java NIO - Channels(通道)

  • 描述

    顾名思义,通道(channel)被用作数据从一端流向另一端的平均值。在java中,NIO通道在缓冲区和实体之间的行为相同,换句话说,通道用于读取数据以缓冲并从缓冲区写入数据。
    与传统Java中使用的流不同,IO通道是双向的,即可以读取和写入。Java NIO 通道支持阻塞和非阻塞模式下的异步数据流。
  • 通道的实现

    Java NIO 通道主要在以下类中实现 -
    • FileChannel − 为了从文件中读取数据,我们使用FileChannel。FileChannel的对象只能通过在文件对象上调用 getChannel() 方法来创建,因为我们不能直接创建文件对象。
    • DatagramChannel − DatagramChannel 可以通过UDP(用户数据报协议)通过网络读取和写入数据。可以使用工厂方法创建数据语法通道的对象。
    • 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) {
             // flip the buffer to prepare for get operation
             byteBuffer.flip();
             while (byteBuffer.hasRemaining()) {
                System.out.print((char) byteBuffer.get());
             }
          }
          file.close();
       }
    }
    
  • 输出

    
    Hello World!