RandomAccessFile不属于IO流,支持对文件的读取和写入随机访问

public class RandomAccessFile implements DataOutput, DataInput, Closeable

  • DataInput接口中定义了基本数据类型的读操作,例如readInt/readDouble等
  • DataOutput接口定义了基本数据类型的写操作,例如writeInt/writeDouble等

        RandomAccessFile是Java输入/输出流体系中功能最丰富的文件内容访问类,既可以读取文件内容,也可以向文件输出数据。

RandomAccessFile构造器

          RandomAccessFile类在创建对象时,除了指定文件本身,还需要指定一个mode参数指定 RandomAccessFile的访问模式,该参数有如下四个值:

  • r以只读方式打开指定文件。如果试图对该RandomAccessFile指定的文件执行写入方法则会抛出 IOException;
  • rw以读取、写入方式打开指定文件。如果该文件不存在,则尝试创建文件;
  • rws以读取、写入方式打开指定文件。相对于rw模式,还要求对文件的内容或元数据的每个更新都 同步写入到底层存储设备,默认情形下(rw模式下),是使用buffer的,只有cache满的或者使用 RandomAccessFile.close()关闭流的时候儿才真正的写到文件;
  • rwd与rws类似,只是仅对文件的内容同步更新到磁盘,而不修改文件的元数据。

RandomAccessFile写方法

RandomAccessFile 图片 修改 randomaccessfile参数_java

RandomAccessFile raf=new RandomAccessFile("d:\\abc.data","rw");
    raf.writeInt(1);
    raf.writeChars("yanjun");
    raf.writeDouble(1234.0/567);
    raf.close();

RandomAccessFile读方法

RandomAccessFile 图片 修改 randomaccessfile参数_数据_02

 

RandomAccessFile raf=new RandomAccessFile("d:/abc.data","r");
    int id=raf.readInt();
    //String name=raf.readLine();
    //byte[] bb=new byte[4];
    //raf.readFully(bb);
    //String name=new String(bb);
    int len=raf.readInt();
    StringBuilder sb=new StringBuilder();
    for(int i=0;i<len;i++)
    sb.append(raf.readChar());
    String name=sb.toString();
    double salary=raf.readDouble();

         读取文件时如果到文件结尾是抛出异常EOFException,所以这里采用的是异常用于判断文件结束。

记录指针的特殊方法

        与普通的输入/输出流不同的是: RandomAccessFile支持跳到文件任意位置读写数据,RandomAccessFile对象包含一个记录指针,用以标识当前读写处的位置,当程序创建一个新的 RandomAccessFile对象时,该对象的文件记录指针对于文件头(也就是0处),当读写n个字后,文件记录指针将会向后移动n个字节。除此之外,RandomAccessFile可以自由移动该记录指针RandomAccessFile包含两个方法来操作文件记录指针:文件指针是按照字节数进行统计,取值范围为 [0,file.length()]

  • long getFilePointer():返回文件记录指针的当前位置
  • void seek(long pos):将文件记录指针定位到pos位置
  • skipByte(int step); 相对当前位置跳过step个字节

        如果文件中间的内容需要进行修改,注意新内容中的字串和原始文件内容的长度应该一致,否则可能会导致修改数据后面的内容无法正常读取。

常见方法

  • void close() 关闭操作;
  • int read(byte[] b)将内容读取到一个byte数组之中;
  • byte readByte()读取一个字节;
  • int readInt()从文件中读取整型数据… readDouble()等8种简单类型;
  • String readLine()读取一行数据;
  • void writeBytes(String s)将一个字符串写入到文件之中,按字节的方式处理;
  • writeChars void writeInt(int v)将一个 int 型数据写入文件,长度为4位。writeDouble等8种类型。