任意存取文件流(RandomAccessFile)
概述
RandomAccessFile既可以作为输入流,也可以作为输出流
异同
相较其他输入输出流的异同
同
如果RandomAccessFile作为输出流出现,如果文件不存在,则会自动创建
异
1.RadomAccessFile不像其他流继承于四个流的抽象基类,其直接继承于Object类
2.RandomAccessFile既可以作为输入流,也可以作为输出流
3.如果RandomAccessFile作为输出流出现,若文件存在,覆盖不是全部覆盖,而是一个个覆盖,从前往后
4.可以在构造器中设置其读取写入模式
r只读 如果只读则不能设置为写入的输出流
rw读取和写入
rwd读取写入和文件的更新
rws读取写入和文件的元数据的修改
使用
注意,当RadomAccessFile的一个对象已经充当为输入流之后,就不能成为输出流,只能充当一个流
public static void main(String[] args) {
RandomAccessFile raf1 = null;
RandomAccessFile raf2 = null;
try {
//创建流对象
raf1 = new RandomAccessFile("Test","r");
raf2 = new RandomAccessFile("Test","rw");
//设置读取 写入
int len;
byte[] b = new byte[1024];
while ((len = raf1.read(b)) != -1){
System.out.print(new String(b,0,len));
}
//写入 步骤相同
raf2.writeUTF("i wish");
} catch (IOException e) {
e.printStackTrace();
} finally {
//流的关闭
try {
raf1.close();
} catch (IOException e) {
e.printStackTrace();
}
if (raf2 != null) {
try {
raf2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
插入操作
因为一个个从前往后覆盖的机制,所以使用RandomAccessFile可以进行插入操作,可以使用seek()方法,设置其指针位置,并对指针之后的数据进行复制,插入后再重新填入
public static void main(String[] args) {
RandomAccessFile raf1 = null;
RandomAccessFile raf2 = null;
try {
//创建流
raf1 = new RandomAccessFile("Test", "r");
raf2 = new RandomAccessFile("Test", "rw");
//假设需要在第12个字符后插入,seek设置指针位置
raf1.seek(12);
int len;
byte[] b = new byte[1024];
//读取插入位置之后的文字
while ((len = raf1.read(b)) != -1){}
//再设置指针进行插入
raf2.seek(12);
raf2.writeChars("will ");
raf2.write(b);
} catch (IOException e) {
e.printStackTrace();
} finally {
//资源的关闭
if (raf1 != null) {
try {
raf1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (raf2 != null){
try {
raf2.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}