通道(Channel)
通道表示打开到 IO 设备(例如:文件、套接字)的连接。若需要使用 NIO 系统,需要获取用于连接 IO 设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理。
通道是由 java.nio.channels 包定义的
我们将通道可以看作火车轨道,本身并不会进行数据操作。缓冲区可以看作列车,负责装载数据,在通道中来回穿梭。
Java中所有已知 Channel 实现类:
- AbstractInterruptibleChannel
- AbstractSelectableChannel
- DatagramChannel
- FileChannel
- Pipe.SinkChannel
- Pipe.SourceChannel
- SelectableChannel
- ServerSocketChannel
- SocketChannel
常用的有以下几个:
- FileChannel:用于读取、写入、映射和操作文件的通道。
- DatagramChannel:通过 UDP 读写网络中的数据通道。
- SocketChannel:通过 TCP 读写网络中的数据。
- ServerSocketChannel:可以监听新进来的 TCP 连接,对每一个新进来的连接都会创建一个 SocketChannel。
获取通道
获取通道的一种方式是对支持通道的对象调用getChannel() 方法。支持通道的类如下:
- FileInputStream
- FileOutputStream
- RandomAccessFile
- DatagramSocket
- Socket
- ServerSocket
获取通道的其他方式是使用 Files 类的静态方法 newByteChannel() 获取字节通道。或者通过通道的静态方法 open() 打开并返回指定通道。
示例:FileChannel
- 为了更形象解释说明的Channel,下面准备以FileChannel的一些简单代码进行说明就容易懂了。
- 准备以FileOutputStream类为准,这两个类都是支持通道操作的。
import java.io.File;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class FileChannelDemo {
public static void main(String[] args) {
String info[] = { "欢迎", "来到", "喵星人", "的星球", "!!" };
File file = new File("d:" + File.separator + "testfilechannel.txt");
try(FileOutputStream output = new FileOutputStream(file);
FileChannel fout = output.getChannel();) {
ByteBuffer buf = ByteBuffer.allocate(1024);
for (int i = 0; i < info.length; i++) {
// 字符串变为字节数组放进缓冲区之中
buf.put(info[i].getBytes());
}
buf.flip();
// 输出缓冲区的内容
fout.write(buf);
} catch (Exception e) {
e.printStackTrace();
}
}
}