1. RandomAccessFile类简介
前面一篇随笔《File类遍历目录及文件》中有说到,File类只能用于表示文件或目录的名称、大小等信息,而不能用于文件内容的访问。而当需要访问文件内容时,就可以用RandomAccessFile类了。
RandomAccessFile是Java提供用来访问一些保存数据记录的文件的类,可以进行读取操作,也可以进行写入操作,写入的数据则以byte的形式存储;支持随机访问,也就是可以访问文件的任意位置(通过文件指针实现)。
2. 构造函数
1
2
|
RandomAccessFile(String name, String mode) RandomAccessFile(File file, String mode) |
两个构造函数用法非常相似,name、file都是用于指定打开的文件路径和名称,mode则是指定打开文件的方式,常用的参数有两个"r"和"rw",也就是只读和读写。
文件打开后,文件指针指向文件最开始,也就是pointer=0,可通过RandomAccessFile了的getFilePointer()方法查看。
范例: 创建并打开一个数据文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//创建目录 File dir = new File( "demo" ); if (!dir.exists()) { dir.mkdir(); } //创建文件 File file = new File(dir, "test.dat" ); if (!file.exists()) { file.createNewFile(); } //实例化RandomAccessFile对象 RandomAccessFile raf = new RandomAccessFile(file, "rw" ); //打开文件时指针位置在最前,即0 System.out.println(raf.getFilePointer()); |
3. 写入操作
1
2
3
|
write( int i) write( byte [] b) write( byte [] b, int off, int len) |
第三个方法中的off为数组b中需要写入的数据的起始索引值,len则是要写入的长度。write方法每次写入一个字节,如果写入的数据超过一个字节,则写入后八位(如果这里不太理解,可看看:二进制运算基础)。
另外,每写入一个字节,文件指针指向下一个字节。
范例: 通过write()方法向文件中写入一个整型数。(沿用上面例子创建的对象)
1
2
3
4
5
6
|
//write()方法每次只插入一个字节,大于一个字节的则写入后八位,因此写入一个整型数需要写入四次 int num = 28 ; raf.write(num >>> 24 ); raf.write(num >>> 16 ); raf.write(num >>> 8 ); raf.write(num); |
当然,RandomAccessFile类也提供了更简便的方法writeXxx(),如果插入一个整型,可直接writeInt(i);,boolean的则为writeBoolean(),以此类推。但是要清楚的是,这些方法的还是通过上面的write()方法实现的。
范例: 以下为RandomAccessFile类中writeInt()方法的方法体。
1
2
3
4
5
6
7
|
public final void writeInt( int v) throws IOException { write((v >>> 24 ) & xFF); write((v >>> 16 ) & xFF); write((v >>> 8 ) & xFF); write((v >>> 0 ) & xFF); //written += 4; } |
4. 读取操作
1
2
3
|
read( int i) read( byte [] b) read( byte [] b, int off, int len) |
与写入操作类似,读取操作是通过read()方法实现的,每次读取一个字节,同时文件指针指向下一个位置(通过seek()方法将指针移到读取位置)。同时,RandomAccessFile类也封装了readXxx()系列方法用于简便读取,原理和使用方法可参考写入操作,基本类似。
范例: 将数据文件中的所有数据以整型形式读取出来。
1
2
3
4
5
|
//读取文件,在读取前需要通过seek()方法把文件指针移到最前 raf.seek( 0 ); for ( int i = 0 ; i* 4 < raf.length(); i++) { System.out.println(raf.readInt()); } |
5. 关闭文件
打开的文件一定要通过close()关闭,否则可能会出现不可预料的错误。
6. 完整例子
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
|
import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; public class MyRandomAccessFile { public static void main(String[] args) throws IOException { //创建目录 File dir = new File( "demo" ); if (!dir.exists()) { dir.mkdir(); } //创建文件 File file = new File(dir, "test.dat" ); if (!file.exists()) { file.createNewFile(); } //实例化RandomAccessFile对象 RandomAccessFile raf = new RandomAccessFile(file, "rw" ); //打开文件时指针位置在最前,即0 System.out.println(raf.getFilePointer()); //写入数据 int [] num = { 28 , 14 , 56 , 23 , 98 }; for ( int i : num) { raf.writeInt(i); } //读取文件,在读取前需要通过seek()方法把文件指针移到最前 raf.seek( 0 ); for ( int i = 0 ; i* 4 < raf.length(); i++) { System.out.println(raf.readInt()); } //操作结束后一定要关闭文件 raf.close(); } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/joahyau/p/6722708.html?utm_source=tuicool&utm_medium=referral