public class StreamTest07 {
//
/**
* RandomAccessFile的使用
* 1.RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口
* 2.RandomAccessFile既可以作为一个输入流,又可以作为一个输出流
* 3.如果RandomAccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建。
* 如果写出到的文件存在,则会对原有文件内容进行覆盖。(默认情况下,从头覆盖)
*/
@Test
public void testRandomAccessFile01(){
//RandomAccessFile 可以随时存取文件 有指针,记录指针用以标示当前读写处的位置
//虽然 RandomAccessFile 可以 存取,但是在存取时需要分别创建对象,不能在一个对象上存取
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile(new File("testRandomAccessFile02.txt"),"rw");
/*
指定mode格式
r: 以只读方式打开
rw:打开以便读取和写入
rwd:打开以便读取和写入;同步文件内容的更新
rws:打开以便读取和写入;同步文件内容和元数据的更新
*/
randomAccessFile.write("asdadasdasda".getBytes(StandardCharsets.UTF_8));
//存入字符串,这里需要把字符串转成字节数组存入,因为write方法参数格式需要为byte[],String类的getBytes()会返回字节数组
//getBytes()方法如果不指定字符集,则得到的是一个操作系统默认的编码格式的字节数组;如果指定字符集,则得到的是在指定字符集下的字节数组
} catch (IOException ioException) {
ioException.printStackTrace();
} finally {
if (randomAccessFile != null){
try {
randomAccessFile.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
}
//在索引为 3 的位置插入字符串
/*
策略:
先把索引 3 后面的字符串保存下来
然后将指针移动到 3 进行 write 操作(写入需要插入的字符)
此时指针在刚写完的位置
然后将之前保存的字符串在后面继续写入,因为 RandomAccessFile的特性,会从指针开始进行内容替换
*/
@Test
public void testRandomAccessFile02(){
RandomAccessFile randomAccessFile1 = null;
try {
randomAccessFile1 = new RandomAccessFile(new File("testRandomAccessFile02.txt"), "rw");
//在索引为 3 的位置插入字符串 xyz
randomAccessFile1.seek(3);
//创建 StringBuilder 指定容量为 字符串长度
StringBuilder stringBuilder = new StringBuilder("testRandomAccessFile.txt".length());
byte[] bytes = new byte[20];
int len;
//把 索引3 后面的字符串添加到 stringBuilder
while ((len = randomAccessFile1.read(bytes)) != -1){//添加完指针移动到末尾
//需要添加参数为 String 类型,new一个String对象来存入
stringBuilder.append(new String(bytes,0,len));
}
randomAccessFile1.seek(3);//因为上一步指针移动至末尾,需要重新定位
randomAccessFile1.write("xyz".getBytes(StandardCharsets.UTF_8));
randomAccessFile1.write(stringBuilder.toString().getBytes(StandardCharsets.UTF_8));
//执行结果 asdxyzadasdasda
} catch (IOException ioException) {
ioException.printStackTrace();
} finally {
if (randomAccessFile1 != null){
try {
randomAccessFile1.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
}
}