Java NIO 通道(Channel)讲解和实战demo

Java NIO(New IO)中的通道(Channel)是用于在源节点和目标节点之间进行传输数据的双向数据传输通道。在 Java NIO 中,Channel 是与 IO 操作对等的,即数据都是从通道读取到缓冲区中,或者从缓冲区写入到通道中。

Java NIO 中的通道可以分为以下几种类型:

FileChannel:用于从文件中读取数据或将数据写入到文件中。
DatagramChannel:用于通过 UDP 协议来进行网络数据的传输。
SocketChannel:用于通过 TCP 协议来进行网络数据的传输。
ServerSocketChannel:用于监听 TCP 连接请求,每个连接会生成一个 SocketChannel 与之对应。

下面是一个基本的 FileChannel 的示例:

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class FileChannelDemo {
    public static void main(String[] args) throws IOException {
        RandomAccessFile file = new RandomAccessFile("test.txt", "rw");
        FileChannel channel = file.getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(48);
        int bytesRead = channel.read(buffer);
        while (bytesRead != -1) {
            buffer.flip();
            while (buffer.hasRemaining()) {
                System.out.print((char) buffer.get());
            }
            buffer.clear();
            bytesRead = channel.read(buffer);
        }
        file.close();
    }
}

该示例首先使用 RandomAccessFile 打开了一个文件,并获得了该文件的 FileChannel。然后,创建了一个 ByteBuffer 用于存储从文件中读取的数据。接着,调用 FileChannel 的 read() 方法将数据从文件中读取到 ByteBuffer 中。最后,使用 while 循环逐个读取 ByteBuffer 中的数据,并将其打印出来。

注意,由于 FileChannel 是双向的,因此它也可以用于将数据写入文件中。具体的操作方式与上面的示例类似,只需要使用 FileChannel 的 write() 方法将数据写入到 ByteBuffer 中,然后将 ByteBuffer 中的数据写入到文件中即可。