RandomAcccessFile类
1.直接继承余java.lang.Object,实现了DataInput 和 DataOutput接口
2.既可以作为一个输入流,又可以作为一个输出流
3.作为输出流时,写出的文件不存在自动创建、如果写出到的文件存在则会对原有文件内容进行从头覆盖
RandomAccessFile初始化特点
- rw:读写操作
- r:只读操作
- rws:每当进行写操作,同步的刷新到磁盘,刷新内容和元数据
- rwd:每当进行写操作,同步的刷新到磁盘,刷新内容
r | rw | rws | rwd |
---|---|---|---|
只读操作 | 读写操作 | 每当进行写操作,同步的刷新到磁盘,刷新内容和元数据 | 每当进行写操作,同步的刷新到磁盘,刷新内容 |
RandomAccessFile fileIn = new RandomAccessFile(new File("hello.txt"),"rw");
常用方法
int seek(int a);指针定位到a的位置
write(bytes[]);从头写入覆盖之前的内容(只覆盖对应位置)
使用案例:
@Test
public void test2() {
RandomAccessFile raf1 = null;
try {
raf1 = new RandomAccessFile(new File("hello.txt"),"rw");
//指针调到3的位置
File file = new File("hello.txt");
long len = file.length();
raf1.seek(len);
raf1.write("xyz".getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (raf1 != null) {
raf1.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
如何实现添加不覆盖操作
在文件顺数第三的位置插入"xyz"操作:
@Test
public void test() {
RandomAccessFile fileIn = null;
try {
fileIn = new RandomAccessFile(new File("hello.txt"),"rw");
StringBuilder builder = new StringBuilder((int) new File("hello.txt").length());
byte[] buffer = new byte[1024];
int len;
fileIn.seek(3);
while ((len = fileIn.read(buffer)) != -1) {
builder.append(builder,0,len);
}
fileIn.seek(3);
fileIn.write("xyz".getBytes());
fileIn.write(buffer.toString().getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fileIn != null) {
fileIn.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}