java 提供了 randomaccessfile 类,允许在文件的任意位置读取和写入数据。到目前为止,您使用过的所有流都称为 只读 或 只写 流。这些流称为顺序流。使用顺序流打开的文件称为顺序访问文件。顺序存取文件的内容无法更新。然而,经常需要修改文件。 java 提供了 randomaccessfile 类来允许在文件中的任何位置读取和写入数据。使用 randomaccessfile 类打开的文件称为 随机访问文件.
RandomAccessFile类实现了DataInput和DataOutput接口,如下图所示。 DataInput 接口定义了读取原始类型值和字符串的方法(例如,readInt、readDouble、readChar、readBoolean、readUTF),DataOutput接口定义了写入方法原始类型值和字符串(例如,writeInt、writeDouble、writeChar、writeBoolean、writeUTF)。
创建 RandomAccessFile 时,您可以指定两种模式之一:r 或 rw。模式r表示流是只读的,模式rw表示流允许读和写。例如,以下语句创建一个新流raf,它允许程序读取和写入文件test.dat:
RandomAccessFile raf = new RandomAccessFile("test.dat", "rw");
如果test.dat已经存在,则创建raf来访问它;如果 test.dat 不存在,则会创建一个名为 test.dat 的新文件,并创建 raf 来访问新文件。方法 raf.length() 返回任意给定时间 test.dat 中的字节数。如果将新数据追加到文件中,raf.length() 会增加。
如果不想修改文件,请使用r模式打开它。这可以防止无意中修改文件。
随机访问文件由字节序列组成。一个称为文件指针的特殊标记位于这些字节之一。读或写操作发生在文件指针的位置。打开文件时,文件指针设置在文件的开头。当您向文件读取或写入数据时,文件指针向前移动到下一个数据项。例如,如果使用readInt()读取int值,JVM会从文件指针读取4字节,现在文件指针比之前的位置提前4字节,如图所示下面.
对于RandomAccessFile raf,可以使用raf.seek(position)方法将文件指针移动到指定位置。 raf.seek(0) 将其移动到文件的开头,raf.seek(raf.length()) 将其移动到文件的末尾。下面的代码演示了RandomAccessFile
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
打包演示;
导入java.io.;
公共类测试随机访问文件{
公共静态无效主(字符串[] args)抛出IOException {
try( // 创建一个随机访问文件
RandomAccessFile inout = new RandomAccessFile("inout.dat", "rw");
){
// 清除文件以销毁旧内容(如果存在)
inout.setLength(0);
// 将新整数写入文件
for(int i = 0; i
<p>当前文件长度为800<br>
第一个数字是0<br>
第二个数字是1<br>
第十个数字是9<br>
新的长度是804<br>
第11个数字是555</p>
<p>为名为<strong>inout.dat</strong>的文件创建<strong>RandomAccessFile</strong>,模式为<strong>rw</strong>,以允许第8行中的读取和写入操作。</p>
<p><strong>inout.setLength(0)</strong> 在第 11 行将长度设置为<strong>0</strong>。这实际上会破坏文件的旧内容。</p>
<p>for<strong>循环将</strong>0<strong>到</strong>199<strong>的</strong>200个int<strong>值写入第14行和第15行的文件中。由于每个</strong>int<strong>值占用</strong>4<strong>字节,因此从</strong>返回的文件的总长度inout.length()<strong> 现在是 </strong>800<strong>(第 18 行),如示例输出所示。</strong>
</p>第 21 行调用 <p>inout.seek(0)<strong> 将文件指针设置到文件的开头。 </strong>inout.readInt()<strong> 读取第 22 行中的第一个值并将文件指针移动到下一个数字。第二个数字在第 26 行读取。</strong>
</p><p>inout.seek(9 4)<strong>(第29行)将文件指针移动到第十个数字。 </strong>inout.readInt()<strong> 读取第十个数字,并将文件指针移动到第 30 行的第十一个数字。 </strong>inout.write(555)<strong> 在当前位置写入新的第十一个数字(第 33 行)。之前的第十一个号码被销毁了。</strong>
</p><p>inout.seek(inout.length())<strong> 将文件指针移动到文件末尾(第 36 行)。 </strong>inout.writeInt(999)<strong> 将 </strong>999<strong> 写入文件(第 37 行)。现在文件的长度增加了</strong>4<strong>,因此</strong>inout.length()<strong>返回</strong>804<strong>(第40行)。</strong>
</p><p>inout.seek(10 4)<strong> 将文件指针移动到第 43 行的第十一个数字。新的第十一个数字</strong>555<strong>显示在第 44 行。</strong>
</p>
以上就是随机访问文件的详细内容,更多请关注其它相关文章!