RandomAccessFile 类

通过 Java IO API 中的 Java RandomAccessFile 类,你可以浏览文件,并随意读取或写入文件。你还可以替换文件的现有部分。这在 FileInputStream 或 FileOutputStream 中是不可能实现的。

创建一个 RandomAccessFile

在使用 RandomAccessFile 类之前,必须将其实例化。下面就是实例化的过程:

RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");

请注意构造函数的第二个输入参数 “rw"。这是打开文件的模式。“rw "表示读/写模式。Java RandomAccessFile 支持的不同访问模式将在下一节中介绍。

访问模式

Java RandomAccessFile 支持以下访问模式:

模式

描述

r

读取模式。调用写入方法将导致 IOException。

rw

读写模式。

rwd

读写模式——同步。对文件内容的所有更新都同步写入磁盘。

rws

读和写模式——同步。对文件内容或元数据的所有更新都同步写入磁盘。

在 RandomAccessFile 中查找

要读取或写入 RandomAccessFile 中的特定位置,必须先将文件指针定位到(又称 seek)要读取或写入的位置。这是通过 seek() 方法完成的。下面是一个在 Java RandomAccessFile 中查找特定位置的示例:

RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");
file.seek(200);

获取文件位置

你可以使用 getFilePointer() 方法获取 Java RandomAccessFile 的当前位置。当前位置是 RandomAccessFile 当前所处字节的索引(偏移量)。下面是一个使用 getFilePointer() 方法获取 RandomAccessFile 当前位置的示例:

long position = file.getFilePointer();

从 RandomAccessFile 读取一个字节

从 Java RandomAccessFile 中读取字节可使用其 read() 方法完成。下面是一个从 RandomAccessFile 中读取数据的简单示例:

RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");
int aByte = file.read();

read() 方法读取 RandomAccessFile 实例中文件指针当前指向的文件位置上的字节。

这是 JavaDoc 忘记提及的一点: read() 方法会递增文件指针,使其指向刚刚读取的字节之后文件中的下一个字节!这意味着你可以继续调用 read(),而无需手动移动文件指针。

从 RandomAccessFile 读取字节数组

也可以从 Java RandomAccessFile 中读取字节数组。下面是一个从 RandomAccessFile 读取字节数组的示例:

RandomAccessFile randomAccessFile = new RandomAccessFile("data/data.txt", "r");
byte[] dest = new byte[1024];
int offset = 0;
int length = 1024;
int bytesRead = randomAccessFile.read(dest, offset, length);

此示例将字节序列读入作为参数传递给 read() 方法的 dest 字节数组。read() 方法将从 RandomAccessFile 的当前文件位置开始读入文件。read() 方法将从偏移参数提供的数组位置开始向字节数组写入数据,最多写入长度参数提供的字节数。该 read() 方法会返回实际读取的字节数。

将字节写入 RandomAccessFile

你可以使用以 int 为参数的 write() 方法向 RandomAccessFile 写入一个字节。字节将被写入 RandomAccessFile 的当前文件位置。该位置上的前一个字节将被覆盖。下面是一个向 Java RandomAccessFile 写入单字节的示例:

RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");
file.write(65); // ASCII code for A

请记住,调用此 write() 方法将使 RandomAccessFile 的文件位置前进 1。

将字节数组写入 RandomAccessFile

向 RandomAccessFile 中写入内容可以使用 RandomAccessFile 中的 write() 方法来完成。下面是一个简单的示例:

RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");
byte[] bytes = "Hello World".getBytes("UTF-8");
file.write(bytes);

此示例将字节数组写入 RandomAccessFile 的当前文件位置。当前位于该位置的字节将被新字节覆盖。

与 read() 方法一样,write() 方法在调用后也会向前推进文件指针。这样,你就不必不断移动文件指针,将数据写入文件中的新位置。

你也可以将字节数组的一部分写入 RandomAccessFile,而不是全部字节数组。下面是将部分字节数组写入 Java RandomAccessFile 的示例:

RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");
byte[] bytes = "Hello World".getBytes("UTF-8");
file.write(bytes, 2, 5);

此示例从字节数组的偏移量 2 开始向前写入 5 个字节到 RandomAccessFile。

close()

RandomAccessFile 有一个 close() 方法,使用完 RandomAccessFile 实例后必须调用该方法。你可以在上面的示例中看到调用 close() 的示例。下面是一个关闭 Java RandomAccessFile 的示例:

RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw");
file.close();

如果使用 Java Try With Resources 结构,还可以自动关闭 RandomAccessFile。下面是一个使用 Java try with-resources 结构自动关闭 RandomAccessFile 的示例:

try(RandomAccessFile file = new RandomAccessFile("c:\\data\\file.txt", "rw")){
    //read or write from the RandomAccessFile
}

一旦程序执行退出上述 try-with-resources 块,RandomAccessFile 将自动关闭,即使在 try-with-resources 块内抛出 IOException 也是如此。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号