概念
- RandomAccessFile声明在
java.io
包下,但直接继承Object类。并实现了DataInput,DataOutput
这两个接口,意味着该类既可以读也可以写。
- RandomAccessFile类支持"随机访问"的方式,程序可直接跳到文件的任意位置来读,写文件。
- 支持只访问文件的部分内容
- 可以向已存在的文件后追加内容
- RandomAccessFile对象包含一个记录指针,用以标示当前读写的位置。RandomAccessFile类对象可以自由移动记录指针:
long getFilePointer()
:获取文件记录指针的当前位置
void seek(long pos)
:将文件记录指针定位到pos位置
构造器
- 构造器
public RandomAccessFile(File file, String mode)
public RandomAccessFile(String name, String mode)
- 创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指定 RandomAccessFile 的访问模式:
- r: 以只读方式打开
- rw :打开以读取和写入
- rwd: 打开以读取和 写入;同步文件内容的更新
- rws: 打开以便读取和 写入; 同步文件内容和元数据的更新
- 如果模式为只读r。则不会创建文件,而是会去读取一个已经存在的文件,如果读取的文件不存在则会出现异常。 如果模式为rw读写。如果文件不存在则会去创建文件,如果存在则不会创建。
应用
实现对图片的复制操作
RandomAccessFile raf = null;
RandomAccessFile raf2 = null;
try {
raf = new RandomAccessFile("爱情与友情.jpg", "r");
raf2 = new RandomAccessFile("爱情与友情raf.jpg", "rw");
byte[] buffer = new byte[1024];
int len;
while ( (len = raf.read(buffer)) !=-1){
raf2.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (raf != null) {
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (raf2 != null) {
try {
raf2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在原有内容某处进行数据插入操作
RandomAccessFile raf = null;
ByteArrayOutputStream baos = null;
try {
raf = new RandomAccessFile("hello.txt", "rw");
raf.seek(3);
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[10];
int len;
while((len = raf.read(buffer)) != -1){
baos.write(buffer, 0, len);
}
raf.seek(3);
raf.write("xyz".getBytes());
raf.write(baos.toString().getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (baos != null) {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (raf != null) {
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}