Channel叫做通道,用于I/O操作的连接。与Stream不同,可以双向的进行数据通信。
Channel相关的的类和接口都存放于以下两个包中:
获取通道有以下6种方式。
Java针对支持通道的类提供了getChannel()方法:
在JDK1.7中的NIO.2针对各个通道提供了静态方法open()
在JKD1.7中的NIO.2的Files工具类的newByteChannel()
通道之间的数据传输:
分散(Scatter)与聚集(Gather):
字符集:Charset
Channel是一个接口,以下为其实现类和子类继承结构。
Channel
|-AbstractInterruptibleChannel
| |- FileChannel
| |- FileChannelImpl
|- ReadableByteChannelImpl
| |- SelectableChannel
| |- AbstractSelectableChannel
| |- ServerSocketChannel
| |- SocketChannel
| |- DatagramChannel
此接口只有两个方法,分别如下:
关闭此通道。
判断此通道是否处于打开状态。
主要用于文件的读写,可以从磁盘上读取文件,也可以向磁盘上写入文件。
这是一个抽象类,此类继承AbstractInterruptibleChannel,实现了SeekableByteChannel、GatheringByteChannel、ScatteringByteChannel三个接口。
创建FileChannel对象,底层调用的是FileChannelImpl的构造函数。
RandomAccessFile的模式有四种:r、rw、rws、rwd。
此方法通过文件系统创建一个FileChannel。
此方法有两个重载如下:
读取缓冲区中的内容,重载的方法大部分都是抽象方法,等待子类进行实现。
重载方法如下:
将缓冲区中的内容写出,重载的方法大部分都是抽象方法,等待子类进行实现。
重载方法如下:
返回这个通道中文件的当前位置。
设置一个通道中文件的当前位置。
返回当前通道中,文件的大小。
将此通道中的文件截断为指定的大小。
将通道内的更新内容强制写入存储设备中。
将文件中的内容传送到写通道中。
将通道中的内容传送到读通道中。
获取此通道给定的锁。有两个重载的方法。
尝试获取此通道给定的锁,有两个重载方法。
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.StandardCharsets;
public static void fctest(String file, String mod) throws Exception {
// 打开文件
RandomAccessFile raf = new RandomAccessFile(file, mod);
// 获取一个通道
FileChannel fc = raf.getChannel();
// 创建缓冲区
ByteBuffer buffer = ByteBuffer.allocate(16);
// 存入缓冲区数据
buffer.put("FileChannelTest".getBytes(StandardCharsets.UTF_8));
// 将缓冲区切换成读模式
buffer.flip();
// 将缓冲区中的数据通过通道写出
fc.write(buffer);
// 清空缓冲区
buffer.clear();
// 读取缓冲区数据
fc.read(buffer);
fc.close();
raf.close();
}