一、RandomAccessFile类
1.1概述
- 实现了DataInput、DataOutput两个接口,意味着这个类既可以读也可以写。
- 支持“随机访问”的方式。程序可以直接跳到文件的任意地方来读、写文件。
- 支持只访问文件的部分内容
- 可以向已存在的文件后追加内容
- RandomAccessFile类对象包含一个记录指针,用以标示当前读写处的位置。
- RandomAccessFile类对象可以自由移动记录指针:
-
long getFilePointer():获取文件记录指针的当前位置
-
void seek(long pos):将文件记录指针定位到pos位置
-
- RandomAccessFile类对象可以自由移动记录指针:
1.2构造器
- 2个构造器
- RandomAccessFile(String name, String mode)
- RandomAccessFile(File file, String mode)
- 创建实例需要制定一个mode参数,该参数指定RandomAccessFile的访问模式:
- r:只读方式打开
- rw:打开支持读写
- rwd:打开支持读写;同步文件内容的更新
- rws:打开支持读写;同步文件内容、元数据的更新
- 若模式为r,则不会创建文件,而是去读一个已经存在的文件,若文件不存在则异常。
- 若模式为rw,则会创建文件。
1.3实现文件的读写
@Test
public void test1() {
RandomAccessFile raf1 = null;
RandomAccessFile raf2 = null;
try {
raf1 = new RandomAccessFile(new File("photomode.png"), "r");
raf2 = new RandomAccessFile(new File("photomode2.png"), "rw");
byte[] buffer = new byte[1024];
int len;
while ((len = raf1.read(buffer)) != -1) {
raf2.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (raf2 != null)
raf2.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (raf1 != null)
raf1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.4实现文件的覆盖
- RandomAccessFile(String name, "rw")
- 如果写出的文件存在,则会对文件内容进行覆盖,默认从头覆盖。
@Test
public void test2() {
RandomAccessFile raf1 = null;
try {
raf1 = new RandomAccessFile("testRandomAccessFile.txt", "rw");
raf1.write("xyz".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (raf1 != null)
raf1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
执行前:
执行后:
1.5指定位置覆盖
- void seek(long pos)
@Test
public void test3() {
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile("testRandomAccessFile.txt", "rw");
raf.seek(3);//将指针调整到角标为3的位置
raf.write("abc".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (raf != null)
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
执行前:
执行后:
1.6实现数据的插入
- 将指针后面的数据存入StringBuilder;
- 调回指针;
- 将待插入的数据和StringBuilder依次写入
@Test
public void test4() {
RandomAccessFile raf = null;
try {
String filename = "testRandomAccessFile.txt";
raf = new RandomAccessFile(filename, "rw");
raf.seek(3);//将指针调整到角标为3的位置
//保存指针3后面的所有数据到StringBuilder中
StringBuilder stringBuilder = new StringBuilder((int) new File(filename).length());
byte[] buffer = new byte[20];
int len;
while ((len = raf.read(buffer)) != -1) {
stringBuilder.append(new String(buffer, 0, len));
}
//调回指针,写入数据
raf.seek(3);
raf.write("abc".getBytes());
raf.write(new String(stringBuilder).getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
执行前:
执行后: