RandomAccessFile
RandomAccessFile随机访问文件类提供了更加丰富的对文件的操作形式,相比较之前的流要么读要么写,当前类提供了读写操作。
public RandomAccessFile(String name, String mode)
public RandomAccessFile(File file, String mode)
第一个参数name/file:文件的路径
第二个参数mode:指定访问模式,有4种模式
r:以只读的模式打开,如果调用write方法将会抛出IO异常
rw:以读和写的模式打开
rws:以读和写的模式打开,要求对”文件的内容“和”元数据“的每个更新都同步到存储设备
rwd:以读和写的模式打开,要求对”文件的内容“的每个更新都同步到存储设备
新提供的方法:
long getFilePointer() //返回文件记录中指针的当前位置
void seek(long pos) //将文件记录移动到指定的pos文件
例题:完成数据插入功能
/**
* 完成数据内容的插入
* @param path 文件路径
* @param index 指定数据插入位置
* @param cont 插入的内容
*/
public static void insertContent(String path , int index, String cont) {
}
1、校验参数的合法性
2、将指针移动到插入的位置
3、通过流读取出来写到磁盘文件上(开辟读和写的流)
4、将指针重新指定到插入位置
5、将写入的内容write写入
6、将后续内存重新写入该文件
public static void insertContent(String path , int index, String cont) {
File file = new File(path);
if (!file.exists()) {
return;
}
if (index <0 ) {
return;
}
FileInputStream tmpis = null;
FileOutputStream tmpos = null;
RandomAccessFile randomAccessFile =null;
File tmpfile = new File(file.getParent() + File.separator + "tmp.txt");
try {
//写入零时文件
tmpos = new FileOutputStream(tmpfile);
//读取零时文件
tmpis = new FileInputStream(tmpfile);
//打开目标文件
randomAccessFile = new RandomAccessFile(file, "rw");
//指定要插入文件的位置
randomAccessFile.seek(index);
//将该位置的内容读取出来
byte[] bytes = new byte[100];
int len;
while ((len = randomAccessFile.read(bytes)) != -1) {
//写入零时文件
tmpos.write(bytes,0,len);
}
tmpos.flush();
//将指针移动到指定位置
randomAccessFile.seek(index);
//写入追加内容
randomAccessFile.write(cont.getBytes());
//将零时文件内容重新写入原文件
while ((len = tmpis.read(bytes)) != -1) {
randomAccessFile.write(bytes,0,len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (tmpis != null) {
tmpis.close();
}
if (tmpos != null) {
tmpos.close();
}
if (randomAccessFile != null) {
randomAccessFile.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}