RandomAccessFile工具类中有个位置指示器,指向当前读写处的位置,当读写n个字节后,文件指示器将指向这n个字节后的下一个字节处。刚打开文件时,文件指示器指向文件的开头处,可以移动文件指示器到新的位置,随后的读写将重新的位置开始。
RandomAccessFile类在文件随机(相对付顺序)读取时有很大的上风,但该类仅限于操作文件,不能访问其他得IO设备,如网络、内存映像等。
二、RandomAccessFile布局方法
RandomAccessFile类为用户供应了两种布局方法:

1、RandomAccessFile(File file, String mode)
2、RandomAccessFile(String name, String mode)
实在第二种布局方法也是new一个File出来再调用第一种布局方法,建议利用第一种布局方法,由于第一篇文章就说了File是IO的根本,有一个File不仅仅可以通过RandomAccessFile对文件进行操作,也可以通过File工具对文件进行操作。至于mode,Java给开拓者供应了四种mode:
把稳第二点\公众rw\公众模式,对rw模式的阐明意味着Java并不强求指定的路径下一定存在某个文件,如果文件不存在,会自动创建。
三、RandomAccessFile中的方法
RandomAccessFile中有如下一些常用方法:
四、RandomAccessFile利用实例
先定义一个实体类:
package com.demo.entity;public class Employee { private String name; private int age; private final static int LEN = 8; public Employee() { } public Employee(String name, int age) { if (name.length() > LEN) { name = name.substring(0, 8); } else { while (name.length() < LEN) { name = name + \"大众\u0000\"大众; } } this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}
第一部分,写文件,该文件在路径下并没有,以是Java会自动帮我们创建:
/ 写文件 /@Testpublic void writeFile() throws IOException{ Employee e1 = new Employee(\"大众zhangsan\公众, 23); Employee e2 = new Employee(\公众lisi\公众, 24); Employee e3 = new Employee(\公众wangwu\公众, 25); RandomAccessFile raf0 = new RandomAccessFile(\"大众D:/Files/employee.txt\"大众, \"大众rw\公众); raf0.writeBytes(e1.getName()); raf0.writeInt(e1.getAge()); raf0.writeBytes(e2.getName()); raf0.writeInt(e2.getAge()); raf0.writeBytes(e3.getName()); raf0.writeInt(e3.getAge()); raf0.close();}
文件创建好了,D盘下的Files文件夹也有该文件了,以是读取一下,这里利用了一些小技巧来演示seek方法和skipBytes方法:
/ 读文件 /@Testpublic void ReadFile() throws IOException{ RandomAccessFile raf1 = new RandomAccessFile(\"大众D:/Files/employee.txt\公众, \"大众r\"大众); int len = 8; raf1.skipBytes(12); // 跳过第一个员工的信息,其姓名8字节,年事4字节 System.out.println(\"大众第二个员工的信息:\公众); String str = \"大众\公众; for (int i = 0; i < len; i++) { str = str + (char)raf1.readByte(); } System.out.println(\公众name:\"大众 + str); System.out.println(\公众age:\"大众 + raf1.readInt()); System.out.println(\"大众第一个员工的信息:\公众); raf1.seek(0); str = \公众\"大众; for (int i = 0; i < len; i++) { str = str + (char)raf1.readByte(); } System.out.println(\公众name:\"大众 + str); System.out.println(\"大众age:\"大众 + raf1.readInt()); System.out.println(\"大众第三个员工的信息:\"大众); raf1.skipBytes(12); // 跳过第二个员工的信息 str = \"大众\公众; for (int i = 0; i < len; i++) { str = str + (char)raf1.readByte(); } System.out.println(\公众name:\"大众 + str.trim()); System.out.println(\"大众age:\"大众 + raf1.readInt()); raf1.close();}
看一下运行结果:
第二个员工的信息:name:lisiage:24第一个员工的信息:name:zhangsanage:23第三个员工的信息:name:wangwuage:25
可能有人奇怪,\公众zhangsan\"大众加上一个int跳过12个字节可以理解,但是\"大众lisi\"大众、\"大众wangwu\"大众为什么加上int要跳过12个字节呢?明明\"大众lisi\"大众只有4个字节,\公众wangwu\公众只有6个字节啊。这个就涉及到一个\"大众字节对齐\"大众的问题了,有兴趣的可以理解一下。其余,再说一下,RandomAccessFile利用完一定要及时close()。