文档

Java™教程
隐藏目录
随机访问文件
导航:基本 Java 类
课程:基本 I/O
章节:文件 I/O(使用 NIO.2)

随机访问文件

随机访问文件允许对文件内容进行非连续或随机访问。要随机访问文件,您需要打开文件,寻找特定位置,并从该位置读取或写入文件。

这种功能可以通过SeekableByteChannel接口实现。 SeekableByteChannel接口通过当前位置的概念扩展了通道I/O。方法使您能够设置或查询位置,并从该位置读取数据或将数据写入该位置。该API由几个易于使用的方法组成:

使用通道I/O读写文件表明Path.newByteChannel方法返回一个SeekableByteChannel实例。在默认文件系统上,您可以直接使用该通道,或将其转换为FileChannel,以便访问更高级的功能,例如将文件的某个区域直接映射到内存中以实现更快的访问、锁定文件的某个区域,或在不影响通道当前位置的情况下从绝对位置读取和写入字节。

以下代码片段使用newByteChannel方法打开一个文件以供读取和写入。返回的SeekableByteChannel被转换为FileChannel。然后,从文件开头读取12个字节,并在该位置写入字符串"I was here!"。文件中的当前位置移到末尾,并将开头的12个字节追加。最后,追加字符串"I was here!",并关闭文件上的通道。

String s = "我在这里!\n";
byte data[] = s.getBytes();
ByteBuffer out = ByteBuffer.wrap(data);

ByteBuffer copy = ByteBuffer.allocate(12);

try (FileChannel fc = (FileChannel.open(file, READ, WRITE))) {
    // 读取文件的前12个字节。
    int nread;
    do {
        nread = fc.read(copy);
    } while (nread != -1 && copy.hasRemaining());

    // 将"I was here!"写入文件开头。
    fc.position(0);
    while (out.hasRemaining())
        fc.write(out);
    out.rewind();

    // 移动到文件末尾。将前12个字节复制到文件末尾。然后再次写入"I was here!"。
    long length = fc.size();
    fc.position(length-1);
    copy.flip();
    while (copy.hasRemaining())
        fc.write(copy);
    while (out.hasRemaining())
        fc.write(out);
} catch (IOException x) {
    System.out.println("I/O异常:" + x);
}

上一页:读取、写入和创建文件
下一页:创建和读取目录