Java 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 | 读取模式。调用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也将自动关闭。