Java NIO Channel

Java NIO Channel(通道)与Java IO 的Stream(流)很相似但是有几点不同:

  • 您可以读取和写入Channel。 Stream通常是单向的(读或写,如InputStream和OutputStream)。
  • Channel可以被异步读取和写入。
  • Channel面向Buffer,Channel读出数据到Buffer或者从Buffer获得数据写出。

如上所述,您将通道中的数据读入缓冲区,并将数据从缓冲区写入通道。 这是一个例子:

Java NIO Channel_第1张图片
通道将数据读入缓冲区,缓冲区将数据写入通道

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的文章中详细介绍这方面的内容。上述代码结果示例如下:

Java NIO Channel_第2张图片
Channel读入文件示例

上一节:Java NIO 概述
下一节:Java NIO Buffer


你可能感兴趣的:(Java NIO Channel)