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()方法,用于将字符串两边的空格删除