RandomAccessFile类
基本知识
- RandomAccessFile 声明在java.io包下,但直接继承于java.lang.Object类。并 且它实现了DataInput、DataOutput这两个接口,也就意味着这个类既可以读也可以写。
RandomAccessFile 类支持 “随机访问” 的方式,程序可以直接跳到文件的任意地方来读、写文件
- 支持只访问文件的部分内容
- 可以向已存在的文件后追加内容
RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。
RandomAccessFile 类对象可以自由移动记录指针:
- long getFilePointer():获取文件记录指针的当前位置
- void seek(long pos):将文件记录指针定位到 pos 位置
- 如果RandomAccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建
- 如果RandomAccessFile作为输出流时,写出到的文件如果存在,则会对原有文件内容覆盖(默认情况下从头覆盖)
使用举例代码
@Test
public void test1() {
RandomAccessFile raf1 = null;
RandomAccessFile raf2 = null;
try {
raf1 = new RandomAccessFile("hello111.txt","r");
raf2 = new RandomAccessFile("hello77.txt","rw");
byte[] bytes = new byte[20];
int len;
while ((len=raf1.read(bytes))!=-1){
raf2.write(bytes,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (raf1!=null)
raf1.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (raf2!=null)
raf2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
记录指针使用举例(数据的插入)
- 原文件位txt内容:
abcdefg
- 目的:在c的后面插入数据ABC
- 代码:(过程看注释,tste3)
//test2是举例错误写法(覆盖)
@Test
public void test2() throws IOException{
RandomAccessFile raf = new RandomAccessFile("hello1.txt","rw");
raf.seek(2);
raf.write("ABC".getBytes());//覆盖数据
raf.close();
}
@Test
public void test3() throws IOException{
RandomAccessFile raf = new RandomAccessFile("hello1.txt","rw");
raf.seek(2);//指针指倒c的位置
//保存指针2后面的所有数据(指针已经到2的位置了)
StringBuilder sb = new StringBuilder((int)new File("hello1.txt").length());
byte[] bytes = new byte[20];
int len;
while ((len=raf.read(bytes))!=-1){
sb.append(new String(bytes,0,len));
}
raf.seek(2);//把指针调回原本的位置
raf.write("ABC".getBytes());
//将之前保存的数据又写入回来
raf.write(sb.toString().getBytes());
//关闭流
raf.close();
}