Java RandomAccessFile

时间:2020-01-09 10:36:06  来源:igfitidea点击:

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读取模式。调用write方法将导致IOException。
rw读写模式。
rwd读写模式-同步。对文件内容的所有更新都被同步写入磁盘。
rws读写模式-同步。对文件内容或者元数据的所有更新都同步写入磁盘。

寻找一个RandomAccessFile

要在" RandomAccessFile"中的特定位置进行读取或者写入,我们必须首先将文件指针定位在(也就是寻求)要读取或者写入的位置。这是使用seek()方法完成的。这是在Java RandomAccessFile中寻找特定位置的示例:

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

file.seek(200);

获取文件位置

我们可以使用Java RandomAccessFile的getFilePointer()方法获取其当前位置。当前位置是RandomAccessFile当前所在的字节的索引(偏移)。这是一个使用其getFilePointer()方法获取RandomAccessFile当前位置的示例:

long position = file.getFilePointer();

从RandomAccessFile读取字节

使用它的read()方法可以从Java RandomAccessFile中读取一个字节。这是一个从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()"方法将开始从" offset"参数提供的数组位置开始写入数据到字节数组,并且最多" length"参数提供的字节数。这个read()方法返回读取的实际字节数。

写入字节到RandomAccessFile

我们可以使用它的write()方法将单个字节写入RandomAccessFile,该方法采用`int'作为参数。该字节将被写入RandomAccessFile的当前文件位置。该位置的前一个字节将被覆盖。这是将单个字节写入Java RandomAccessFile的示例:

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

file.write(65); // ASCII code for A

请记住,调用此write()方法会将RandomAccessFile的文件位置提高1.

将字节数组写入RandomAccessFile

可以使用它的许多write()方法之一来写入" RandomAccessFile"。这是一个简单的示例:

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块,即使从try-with-resources块内部抛出IOException,RandomAccessFile也将自动关闭。