【1】RandomAccessFile基本概念
RandomAccessFile主要完成随机读取的功能,可以读取指定位置的内容。不属于InputStream和OutputStream类系的。
实际上,除了实现DataInput和DataOutput接口之外(DataInputStream和DataOutputStream也实现了这两个接口),它和这两个类系毫不相干,甚至不使用InputStream和OutputStream类中已经存在的任何功能。
它是一个完全独立的类,所有方法(绝大多数都只属于它自己)都是从零开始写的。这可能是因为RandomAccessFile能在文件里面前后移动,所以它的行为与其它的I/O类有些根本性的不同。

RandomAccessFile的工作方式
把DataInputStream和DataOutputStream结合起来,再加上它自己的一些方法。
比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )、skipBytes()跳过多少字节数。
此外,它的构造函数还要一个表示以只读方式(“r”),还是以读写方式(“rw”)打开文件的参数 (和C的fopen( )一模一样)。
需要注意的是,它不支持只写文件。
只有RandomAccessFile才有seek搜寻方法,而这个方法也只适用于文件。
BufferedInputStream有一个mark( )方法,你可以用它来设定标记(把结果保存在一个内部变量里),然后再调用reset( )返回这个位置,但是它的功能太弱了,而且也不怎么实用。
public class RandomAccessFile implements DataOutput, DataInput, Closeable {
//...
}
RandomAccessFile 类支持 “随机访问” 的方式,程序可以直接跳到文件的任意地方来读、写文件。
- 支持只访问文件的部分内容;
- 可以向已存在的文件后追加内容;
记录指针
RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。RandomAccessFile 类对象可以自由移动记录指针:
long getFilePointer():获取文件记录指针的当前位置
void seek(long pos):将文件记录指针定位到 pos 位置
构造器
public RandomAccessFile(File file, String mode)
public RandomAccessFile(String name, String mode)
创建 RandomAccessFile 类实例需要指定一个 mode 参数,该参数指定 。
RandomAccessFile 的访问模式(mode):
r: 以只读方式打开
rw:打开以便读取和写入
rwd:打开以便读取和写入;同步文件内容的更新
rws:打开以便读取和写入;同步文件内容和元数据的更新
【2】文件的读写与复制
实例代码如下:
@Test
public void testRandomAccessFile(){
RandomAccessFile rFile1 = null;
RandomAccessFile rFile2 = null;
try {
/*相对于项目路径--contextPath路径*/
File file1 = new File("test1.txt");
File file2 = new File("test3.txt");
/* rw 读写模式*/
rFile1 = new RandomAccessFile(file1, "rw");
rFile2 = new RandomAccessFile(file2, "rw");
int len = 0;
byte[] b = new byte[1024];
/*--读入到byte数组并进行输出--*/
while ((len = rFile1.read(b)) !=-1) {
System.out.println("ASCII :"+len+"value :"+new String(b,0,len));//new String() turn to be String
/*写入到另一个文件*/
rFile2.write(b, 0, len);
}
}catch (IOException e) {
e.printStackTrace();
}
}
【3】输出文件的大小
test1.txt文件内容:123456我们要有梦想
System.out.println(rFile1.length());
24bytes—24个字节
【4】跳到指定位置读取文件
seek(long a)是定位文件指针在文件中的位置。
参数a确定读写位置距离文件开头的字节个数,比如seek(0)就是定位文件指针在开始位置,其是绝对定位。
rFile1.seek(1);//从第二个字节开始
实例代码如下:
RandomAccessFile raf = new RandomAccessFile(“test.txt”, “rw”);
raf.seek(5);
byte [] b = new byte[1024];
int off = 0;
int len = 5;
raf.read(b, off, len);
String str = new String(b, 0, len);
System.out.println(str);
raf.close();
【5】跳过指定字节
skipBytes()是指在文件中跳过给定数量的字节,其是相对定位。

本文深入介绍了Java中的RandomAccessFile类,探讨了其基本概念、工作原理及如何进行文件的读写与复制。同时,还详细解释了如何通过定位和跳过字节来实现随机访问。
495

被折叠的 条评论
为什么被折叠?



