public RandomAccessFile(File file,
                        String mode)
                 throws FileNotFoundException
创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File 参数指定。将创建一个新的 FileDescriptor 对象来表示此文件的连接。
mode 参数指定用以打开文件的访问模式。允许的值及其含意为:
含意
"r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException
"rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。
"rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
"rwd" 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。
"rws""rwd" 模式的工作方式极其类似
FileChannel 类的 force(boolean) 方法,分别传递 truefalse 参数,除非它们始终应用于每个 I/O 操作,并因此通常更为高效。如果该文件位于本地存储设备上,那么当返回此类的一个方法的调用时,可以保证由该调用对此文件所做的所有更改均被写入该设备。这对确保在系统崩溃时不会丢失重要信息特别有用。如果该文件不在本地设备上,则无法提供这样的保证。
"rwd" 模式可用于减少执行的 I/O 操作数量。使用 "rwd" 仅要求更新要写入存储的文件的内容;使用 "rws" 要求更新要写入的文件内容及其元数据,这通常要求至少一个以上的低级别 I/O 操作。
如果存在安全管理器,则使用 file 参数的路径名作为其参数调用它的 checkRead 方法,以查看是否允许对该文件进行读取访问。如果该模式允许写入,那么还使用该路径参数调用该安全管理器的 checkWrite 方法,以查看是否允许对该文件进行写入访问。
代码1----写操作
import java.io.File ;
import java.io.RandomAccessFile ;
public class RandomAccessFileDemo01{
  // 所有的异常直接抛出,程序中不再进行处理
  public static void main(String args[]) throws Exception{
    File f = new File("d:" + File.separator + "test.txt") ;  // 指定要操作的文件
    RandomAccessFile rdf = null ;    // 声明RandomAccessFile类的对象
    rdf = new RandomAccessFile(f,"rw") ;// 读写模式,如果文件不存在,会自动创建
    String name = null ;
    int age = 0 ;
    name = "zhangsan" ;      // 字符串长度为8
    age = 30 ;          // 数字的长度为4
    rdf.writeBytes(name) ;    // 将姓名写入文件之中
    rdf.writeInt(age) ;      // 将年龄写入文件之中
    name = "lisi        " ;      // 字符串长度为8
    age = 31 ;          // 数字的长度为4
    rdf.writeBytes(name) ;    // 将姓名写入文件之中
    rdf.writeInt(age) ;      // 将年龄写入文件之中
    name = "wangwu    " ;      // 字符串长度为8
    age = 32 ;          // 数字的长度为4
    rdf.writeBytes(name) ;    // 将姓名写入文件之中
    rdf.writeInt(age) ;      // 将年龄写入文件之中
    rdf.close() ;        // 关闭
  }
};
代码2------读操作
 
import java.io.File ;
import java.io.RandomAccessFile ;
public class RandomAccessFileDemo02{
  // 所有的异常直接抛出,程序中不再进行处理
  public static void main(String args[]) throws Exception{
    File f = new File("d:" + File.separator + "test.txt") ;  // 指定要操作的文件
    RandomAccessFile rdf = null ;    // 声明RandomAccessFile类的对象
    rdf = new RandomAccessFile(f,"r") ;// 以只读的方式打开文件
    String name = null ;
    int age = 0 ;
    byte b[] = new byte[8] ;  // 开辟byte数组
    // 读取第二个人的信息,意味着要空出第一个人的信息
    rdf.skipBytes(12) ;    // 跳过第一个人的信息
    for(int i=0;i<b.length;i++){
      b[i] = rdf.readByte() ;  // 读取一个字节
    }
    name = new String(b) ;  // 将读取出来的byte数组变为字符串
    age = rdf.readInt() ;  // 读取数字
    System.out.println("第二个人的信息 --> 姓名:" + name + ";年龄:" + age) ;
    // 读取第一个人的信息
    rdf.seek(0) ;  // 指针回到文件的开头
    for(int i=0;i<b.length;i++){
      b[i] = rdf.readByte() ;  // 读取一个字节
    }
    name = new String(b) ;  // 将读取出来的byte数组变为字符串
    age = rdf.readInt() ;  // 读取数字
    System.out.println("第一个人的信息 --> 姓名:" + name + ";年龄:" + age) ;
    rdf.skipBytes(12) ;  // 空出第二个人的信息
    for(int i=0;i<b.length;i++){
      b[i] = rdf.readByte() ;  // 读取一个字节
    }
    name = new String(b) ;  // 将读取出来的byte数组变为字符串
    age = rdf.readInt() ;  // 读取数字
    System.out.println("第三个人的信息 --> 姓名:" + name + ";年龄:" + age) ;
    rdf.close() ;        // 关闭
  }
};