【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 位置 long
构造器
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()是指在文件中跳过给定数量的字节,其是相对定位。