<RandomAccessFile>随机访问流
RandomAccessFile:随机访问流
随机是指能够控制指定文件内容的位置进行读写
存在偏移量(指针),可以用来控制读写文件内容的位置
注意!!! 指针从0开始计算
针对文件进行读写操作的时候,不会清空数据
在指针的位置进行读写操作,如果是写入操作会覆盖当前位置的内容
可以进行文件断点续传!!!!!!
<RandomAccessFile>随机访问流创建方法
创建随机访问流需要两个参数
1.file 路径地址
2.读写模式
读写模式有四种:
"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。
"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
"rwd" 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。
写法:
RandomAccessFile rw = new RandomAccessFile(new File("a.txt"), "rw");
或
RandomAccessFile rw = new RandomAccessFile("a.txt", "rw");
为了代码可读性,下面代码全部抛出错误,实际使用中要用try/catch捕获
1.写入文件
public class Demo01 {
public static void main(String[] args) throws Exception{
//不会清空文件内容
RandomAccessFile rw = new RandomAccessFile(new File("a.txt"), "rw");
//从文件的开始处写入内容并覆盖
//要求传入参数是字节数组,所以将字符串转换成字节数组
rw.write("aabbcc".getBytes());
//关流
rw.close();
}
}
a.txt 内容
aabbcc
2.读取文件,从第三位开始
public class Demo02 {
public static void main(String[] args) throws Exception{
RandomAccessFile rw = new RandomAccessFile(new File("a.txt"), "rw");
//设置指针位置,指针从0开始计算,所以想要从第三个字符开始读取,指针位置就是2 (0,1,2)
rw.seek(2);
//使用老代码来读取
byte[] bytes = new byte[1024];
int len;
while ((len = rw.read(bytes)) != -1){
System.out.println(new String(bytes,0,len));
}
//关流
rw.close();
}
}
输出结果
bbcc
3.拷贝文件,断点续传
public class Demo03 {
public static void main(String[] args) throws Exception{
//读取 我是懒狗,直接用 rw 模式
RandomAccessFile r = new RandomAccessFile(new File("D:\\a.mp4"), "rw");
//写入 我是懒狗,直接用 rw 模式
RandomAccessFile w = new RandomAccessFile(new File("D:\\b.mp4"), "rw");
byte[] bytes = new byte[1024];
int len;
//设置写入位置是已经写入完毕文件的末尾(追加新的数据)
w.seek(w.length());
//设置读取的位置是已经写入完毕文件的末尾
r.seek(w.length());
//上面两句话何在一起的意思就是,从上次传输结束的地方继续传输
while ((len = r.read(bytes)) != -1){
w.write(bytes,0,len);
}
r.close();
w.close();
}
}
1.在传输文件过程中关闭程序,打开b.mp4,无法播放
2.重新运行程序,中途关闭,b.mp4文件的大小变大了,有新数据写入成功,任然无法播放
3.再次运行,等待程序结束,b.mp4成功播放
4.断点续传成功