RandomAccessFile
RandomAccessFile
RandomAccessFile 类是JAVA IO流体系中功能最丰富的文件内容访问类。
可以读取文件内容,也可以写入,支持随机访问, 跳转到任意位置读写数据。
与 OutputStream , Writer 输出流不通,允许自由定位文件记录指针。
RandomAccessFile 只能读写文件,不能读写其他IO设备。
public class RandomAccessFile implements DataOutput, DataInput, Closeable {
}
方法
RandomAccessFile 对象包含一个记录指针,用以标识当前读写处的位置。
下面方法记录指针:
- getFilePointer(): 返回指针当前位置
- seek(long pos): 将指针定位到 pos位置
RandomAccessFile 包含了类似于 InputStream 的三个 read()方法,
也包含类似于OutputStream的三个write() 方法。
还包含一系列 readXxx() 和 writeXxx() 方法
两个构造器, 一个用 String 作参数, 一个是 File参数。
访问模式:
- r : 只读
- rw : 读写
- rws : 读写, 对文件内容或元数据的每个更新同步写入到底层存储设备
- rwd: 读写, 对文件内容的每个更新都同步写入到底层存储设备
移动指针从中间读取和末尾追加:
try (
RandomAccessFile ram = new RandomAccessFile("abc.txt", "rw");
){
//初始指针
System.out.println(ram.getFilePointer());
//移动指针, 从10开始读取
ram.seek(10);
byte[] bytes = new byte[1024];
int hasRead = 0;
while ((hasRead = ram.read(bytes)) > 0){
System.out.println(new String(bytes, 0, hasRead));
}
//移动指针到末尾
ram.seek(ram.length());
ram.write("添加一部分\r\n".getBytes());
}
catch (IOException e){
}
如果指针移到某位置后开始写入,则新输入内容会覆盖原有内容。
如果要中间插入, 需要把插入点后面的内容写入缓冲区, 插入写完后再追加。
//临时文件
File tmp = File.createTempFile("tmp", null);
tmp.deleteOnExit();
long pos = 18;
try(
RandomAccessFile raf = new RandomAccessFile("abc.txt", "rw");
FileOutputStream fos = new FileOutputStream(tmp);
FileInputStream fis = new FileInputStream(tmp)
){
raf.seek(pos);
//插入点开始内容写入到临时文件
byte[] bbuf = new byte[64];
int hasRead = 0;
while ((hasRead = raf.read(bbuf)) > 0){
fos.write(bbuf, 0, hasRead);
}
//写入内容
raf.seek(pos);
raf.write("插入字符".getBytes());
while ((hasRead = fis.read(bbuf)) > 0){
raf.write(bbuf, 0, hasRead);
}
}
catch (IOException e){
}