在多线程下载中遇到这个类,因为分开几个线程,每个线程负责自己的下载内容,所以写入的时候要控制起始点
此类的实例支持对随机访问文件的读取和写入。
通过seek这个函数来控制文件指针的偏移量,移动的单位是位,不是字节。
输出的时候也要注意seek
需要注意seek的位置
注意一点就是write函数写入不是插入,而是修改
<span style="white-space:pre"> </span>randomAccessFile.writeChars("a");
randomAccessFile.writeChars("b");
randomAccessFile.writeChars("c");
randomAccessFile.seek(2);
randomAccessFile.writeChars("x");
randomAccessFile.seek(0);
此时输出结果为axc,而不是axbc
read的时候,没有数据会抛异常,不会想流一样返回-1
seek函数的区别,注意移动的单位
public static void main(String[] args) throws IOException {
RandomAccessFile randomAccessFile = new RandomAccessFile(
"/Users/vie/Desktop/vjligi.txt", "rw");
for (int i = 0; i < 5; i++) {
randomAccessFile.writeDouble(i * 1.414);
}
//移到第三个deoble后面,写入会覆盖第四个元素
randomAccessFile.seek(3 * 8);
randomAccessFile.writeDouble(1.0);
randomAccessFile.close();
randomAccessFile = new RandomAccessFile(
"/Users/vie/Desktop/vjligi.txt", "r");
for (int i = 0; i < 5; i++) {
System.out.println(randomAccessFile.readDouble());
}
randomAccessFile.close();
}
RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了。这些记录的大小不必相同;但是其大小和位置必须是可知的。但是该类仅限于操作文件。
RandomAccessFile不属于InputStream和OutputStream类系的。实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能;它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。总而言之,它是一个直接继承Object的,独立的类。
基本上,RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。此外,它的构造函数还要一个表示以只读方式("r"),还是以读写方式("rw")打开文件的参数 (和C的fopen( )一模一样)。它不支持只写文件。
只有RandomAccessFile才有seek搜寻方法,而这个方法也只适用于文件。BufferedInputStream有一个mark( )方法,你可以用它来设定标记(把结果保存在一个内部变量里),然后再调用reset( )返回这个位置,但是它的功能太弱了,而且也不怎么实用。
RandomAccessFile的绝大多数功能,但不是全部,已经被JDK 1.4的nio的"内存映射文件(memory-mapped files)"给取代了,你该考虑一下是不是用"内存映射文件"来代替RandomAccessFile了。
public RandomAccessFile(File file, String mode) throws FileNotFoundException
-
创建从中读取和向其中写入(可选)的随机访问文件流,该文件由
File
参数指定。将创建一个新的FileDescriptor
对象来表示此文件的连接。mode 参数指定用以打开文件的访问模式。允许的值及其含意为:
值
含意
"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException
。"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。 "rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。 "rwd" 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。 FileChannel
类的force(boolean)
方法,分别传递 true 和 false 参数,除非它们始终应用于每个 I/O 操作,并因此通常更为高效。如果该文件位于本地存储设备上,那么当返回此类的一个方法的调用时,可以保证由该调用对此文件所做的所有更改均被写入该设备。这对确保在系统崩溃时不会丢失重要信息特别有用。如果该文件不在本地设备上,则无法提供这样的保证。"rwd" 模式可用于减少执行的 I/O 操作数量。使用 "rwd" 仅要求更新要写入存储的文件的内容;使用 "rws" 要求更新要写入的文件内容及其元数据,这通常要求至少一个以上的低级别 I/O 操作。
如果存在安全管理器,则使用
file
参数的路径名作为其参数调用它的checkRead
方法,以查看是否允许对该文件进行读取访问。如果该模式允许写入,那么还使用该路径参数调用该安全管理器的checkWrite
方法,以查看是否允许对该文件进行写入访问。