特殊RandomAccessFile

发布于:2023-01-20 ⋅ 阅读:(12) ⋅ 点赞:(0) ⋅ 评论:(0)

特殊RandomAccessFile

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()关闭流的时候儿才真正的写到文件
  • rwdrws类似,只是仅对文件的内容同步更新到磁盘,而不修改文件的元数据

RandomAccessFile写方法 

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

 RandomAccessFile读方法

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位。…writeDouble8种类型