什么是RandomAccessFile?
RandomAccessFile创建的对象既可以作为源也可以作为目的地。
该类的实例支持读取和写入随机访问文件。 随机访问文件的行为类似于存储在文件系统中的大量字节。 有一种游标,或索引到隐含的数组,称为文件指针 ; 输入操作读取从文件指针开始的字节,并使文件指针超过读取的字节。 如果在读/写模式下创建随机访问文件,则输出操作也可用; 输出操作从文件指针开始写入字节,并将文件指针提前到写入的字节。 写入隐式数组的当前端的输出操作会导致扩展数组。 文件指针可以通过读取getFilePointer方法和由设置seek方法。
通俗来讲:我们以前讲的 IO 字节流,包装流等都是按照文件内容的顺序来读取和写入的。而这个随机访问文件流我们可以在文件的任意地方写入数据,也可以读取任意地方的字节。
构造方法
这里面第二个参数:String mode 有以下几种形式:
第一种:用 随机流顺序读取数据
第二种:随机读取,那么我们先介绍这两个方法 :
这里所说的偏移量,也就是字节数。一个文件是有N个字节数组成,那么我们可以通过设置读取或者写入的偏移量,来达到随机读取或写入的目的。
这是Java里各个数据类型的字节数:
下面是 随机读取数据例子:
随机流复制文件:
注意:
RandomAccessFile流的readline()方法在读取含有非ASCII码字符的文件时(比如含有汉字)会出现乱码,因此,需要把readline()读取的字符串用ISO-8859-1重新编码存放到byte数组中,然后用计算机的默认编码将该数组转化为字符串, 操作如下:
RandomAccessFile inAndout2 = new RandomAccessFile( file2, "rw" );
String str = inAndout2.readLine();
byte b[] = str.getBytes("ISO-8859-1");
String transformResult = new String(b,"GBK");
System.out.println( transformResult );