RandomAccessFile 特点
RandomAccessFile 是 java Io 体系中功能最丰富的文件内容访问类。
即可以读取文件内容,也可以向文件中写入内容。但是和其他输入/输入流不同的是,程序可以直接跳到文件的任意位置来读写数据。
因为RandomAccessFile 可以自由访问文件的任意位置,所以如果我们希望只访问文件的部分内容,那就可以使用RandomAccessFile类。
与OutputStearm,Writer 等输出流不同的是,RandomAccessFile类允许自由定位文件记录指针。
所以RandomAccessFile可以不从文件开始的地方进行输出,所以RandomAccessFile可以向已存在的文件后追加内容。
优缺点
RandomAccessFile 的方法虽然多,但它有一个最大的局限,就是只能读写文件,不能读写其他IO节点。
RandomAccessFile 的一个重要使用场景就是网络请求中的多线程下载及断点续传。
RandomAccessFile的整体介绍
RandomAccessFile类包含了一个记录指针,用以标识当前读写处的位置,当程序新创建一个RandomAccessFile对象时,该对象的文件记录指针位于文件头(也就是0处),当读/写了n个字节后,文件记录指针将会向后移动n个字节。
除此之外,RandomAccessFile可以自由的移动记录指针,即可以向前移动,也可以向后移动。
指针方法
RandomAccessFile包含了以下两个方法来操作文件的记录指针.
long getFilePointer(); //返回文件记录指针的当前位置
void seek(long pos); //将文件记录指针定位到pos位置
RandomAccessFile即可以读文件,也可以写,所以它即包含了完全类似于InputStream的3个read()方法,其用法和InputStream的3个read()方法完全一样;
也包含了完全类似于OutputStream的3个write()方法,其用法和OutputStream的3个Writer()方法完全一样。
除此之外,RandomAccessFile还包含了一系类的readXXX()和writeXXX()方法来完成输入和输出。
创建方法
RandomAccessFile有两个构造器,其实这两个构造器基本相同,只是指定文件的形式不同而已,一个使用String参数来指定文件名,一个使用File参数来指定文件本身。除此之外,创建RandomAccessFile对象还需要指定一个mode参数。
该参数指定RandomAccessFile的访问模式,有以下4个值:
“r” 以只读方式来打开指定文件夹。如果试图对该RandomAccessFile执行写入方法,都将抛出IOException异常。
“rw” 以读,写方式打开指定文件。如果该文件尚不存在,则试图创建该文件。
“rws” 以读,写方式打开指定文件。相对于”rw” 模式,还要求对文件内容或元数据的每个更新都同步写入到底层设备。
“rwd” 以读,写方式打开指定文件。相对于”rw” 模式,还要求对文件内容每个更新都同步写入到底层设备。
方法封装实践
常量
对于 mode 封装
接口标准定义
- 读取
默认从开始到结束。
可以指定:startIndex endIndex
- 写入
默认从末尾
如果不是末尾,则进行后面内容的保留。
多线程
比起文件加锁。
可以将文件划分为不同的区域,每一个区域使用多线程去操作。
拓展阅读
场景:读取一个 2G 的文件,使用 RandomAccessFile 可以很轻松的达成。那么,要么想要复制一个 2G 的文件,应该怎么做?
IO: 传统做法:FILE 加载到 内存,内存在复制到文件。这个消耗是巨大的。所以我们需要改良的实现:
NIO:
参考资料
https://www.jb51.net/article/86041.htm