获取FileChannel不能直接打开,必须通过 FileInputStream、FileOutputStream 或者 RandomAccessFile 来获取 FileChannel,它们都有 getChannel 方法。

通过FileInputStream获取的channel只能读

通过FileOutputStream获取的channel只能写

通过RandomAccessFile是否能读写根据构造RandomAccessFile 时的读写模式决定。

1.读取

会从channel读取数据填充ByteBuffer,返回值表示读到了多少字节,-1 表示到达了文件的末尾。

int readBytes = channel.read(buffer);

2.写入

写入的正确代码如下:

ByteBuffer buffer = ...;buffer.put(...); // 存入数据buffer.flip(); // 切换读模式while(buffer.hasRemaining()) {channel.write(buffer);}

在 while 中调用 channel.write 是因为 write 方法并不能保证一次将 buffer 中的内容全部写入 channel

3.关闭

channel 必须关闭,不过调用了 FileInputStream、FileOutputStream 或者 RandomAccessFile 的 close 方法会间接地调用 channel 的 close 方法。

4.位置

获取当前位置的示例代码如下:

long pos = channel.position();设置当前位置long newPos = ...;channel.position(newPos);

设置当前位置时,如果设置为文件的末尾会读取会返回 -1 。这时写入,会追加内容,但要注意如果 position 超过了文件末尾,再写入时在新内容和原末尾之间会有空洞(00)。

5.大小

使用 size 方法获取文件的大小

6.强制写入

操作系统出于性能的考虑,会将数据缓存,不是立刻写入磁盘。可以调用 force(true) 方法将文件内容和元数据(文件的权限等信息)立刻写入磁盘。