RandomAccessFile(以下简称RAF)是专门设计用来读写文件数据的API,其基于指针对文件的任意位置进行读写操作

RAF的常用构造器如下

  RandomAccessFile(String path, String mode)

  RandomAccessFile(File file, String mode)

第一个参数可以为字符串表示要操作文件的路径,也可以是一个File对象。

第二个参数是操作的权限,有“r” 只读模式,“rw” 读写模式。

 

在使用RAF的过程中,如果遇到FileNotFoundException异常,一般是由于文件路径中有不存在的目录,或者是在操作权限为"r"的前提下,文件

本身并不存在,还可以是路径或者文件名拼写错误。

 

RAF的读写操作是基于指针的,获取RAF当前指针的位置的方法如下

  long getFilePointer()

移动指针到指定位置的方法如下

  void seek(long pos) 

该方法中,参数pos为文件中的位置(单位字节),一般情况下RAF每次读写一个字节

注意:RAF总是在指针指向的位置进行读或写的操作,并且读写完成后,指针会自动移动到下一个位置。

RandomAccessFile raf = new RandomAccessFile("user.txt","rw");

RAF提供了直接写入基本类型的方法

raf.writeInt(66); 

直接写入4个字节的整型数据,类似的还有raf.writeDouble(3.14)等等 。

 

 

RAF关于文件的读写操作

  为了提高读写的效率,我们应提高每次读写的数据量,减少读写的次数。

一组字节一组字节的读写称为块读写,单个字节单个字节的读写称为随机读写。

  int read()

  每次读写一个字节,返回值为读取到的一个字节内容,用整型数据表示

  int read(byte[ ] data)

  一次性读取给定字节数组总长度的字节量,并将数据转入到该数组中。返回的int值表示实际读取到的字节数量,

如果返回值为-1则表示读到了文件末尾

  void write(int d)

  每次写入一个字节

  void write(byte[ ] data)

  一次性将给定字节数组中的所有数据写入文件

  void write(byte[ ] data, int offset, int len)

  一次性将给定的字节数组从下表offset处开始写,连续写len个数量的字节 

 

  使用RAF的块读写操作复制文件

RandomAccessFile src = new RandomAccessFile("jdk.exe","r");
		RandomAccessFile desc = new RandomAccessFile("jdk_cp5.exe","rw");int len; //记录每次实际读取到的字节量
byte[] data = new byte[1024];//数组容量为10KB
while((len = src.read(data)) != -1){
  desc.write(data,0,len);
}
src.close();
desc.close();
 
/*****************************************************/
/***************向文件中写入文本数据************/
/*****************************************************/
String str = "月光守望的木屋,天使停落的窗台。";
byte[ ] data = str.getBytes("utf-8");
raf.write(data);
raf.close();
System.out.println("文本写入完毕!")
/********************************************************************************************************/
/*********读取文本中的内容,存入数组中,将数组中的内容转换为字符串***********************/
/********************************************************************************************************/
byte[ ] data = new byte[32]; //定义长度为32字节的数组
raf.read(data); //一次性读取32个字节长度的内容,并存入数组中
String username = new String(data,"utf-8").trim();
raf.close();
/*************************************************************************/
补充: String的构造方法
String(byte[ ] data, String charsetName)
将给定的字节数组中所有的字节按照指定的字符集还原为字符串
trim()方法,用于将字符串两边的空格删除