【创建对象】
1、简介
Java提供了一个可以对文件随机访问的操作,访问包括读和写操作。该类名为RandomAccessFile。该类的读写是基于指针的操作。
RandomAccessFile在对文件进行随机访问操作时有两个模式,分别为只读模式(只读取文件数据)和读写模式(对文件数据进行读写)。
2、只读模式
在创建RandomAccessFile时,其提供的构造方法要求我们传入访问模式:
RandomAccessFile(File file,String mode)
RandomAccessFile(String filename,String mode)
其中构造方法的第一个参数是需要访问的文件,而第二个参数则是访问模式。
“r”:字符串“r”表示对该文件的访问是只读的。
3、读写模式
创建一个基于文件访问的读写模式的RandomAccessFile我们只需要在第二个参数中传入“rw”即可。
RandomAccessFile raf=new RandomAccessFile(file,"rw");
那么这时在使用RandomAccessFile对该文件的访问就是有可读又可写的。
【字节数据读写操作】
1、write(int b)方法
RandomAccessFile提供了一个可以向文件中写出字节的方法:
void write(int d)
该方法会根据当前指针所在位置处写入一个字节,是将参数int的“低8位”写出。
//测试RandomAccess的write()方法
public void testWrite() throws Exception{
RandomAccessFile raf=new RandomAccessFile("raf.dat","rw");
//写出一个字节,写的是int值的低8位
raf.write(1);
raf.close();
}
2、read()方法
RandomAccessFile提供了一个可以从文件中读取字节的方法:
int read();
该方法会从文件中读取一个byte(8位)填充到int的低八位,高24位为0,返回值范围正数:0到255,如果返回-1表示读取到了文件末尾。每次读取后自动移动文件指针,准备下次读取。
//测试RandomAccess的read()方法
public void testRead() throws Exception{
RandomAccessFile raf=new RandomAccessFile("raf.dat","r");
//读取一个字节
int d=raf.read();
raf.close();
}
3、write(byte[] b)方法
RandomAccessFile提供了一个可以向文件写出一组字节的方法:
void write(byte[] d)
该方法会根据当前指针所在位置处连续写出给定数组中的所有字节。
与该方法相似的还有一个常用方法:
void write(byte[] d,int offset,int len)
该方法会根据当前指针所在位置处连续写出给定数组中的部分字节,这个部分是从数组的offset处开始,连续len个字节。
测试RandomAcacess的write(byte[])方法
public void testWriteByteArray() throws Exception{
RandomAccessFile raf=new RandomAccessFile("raf.dat","rw");
//将字符串按照默认编码转换为字节
byte[] buf="helloWorld".getBytes();
//将字节数组中所有字节一次性写出
raf.write(buf);
raf.close();
}
4、read(byte[] b)方法
RandomAccessFile提供了一个可以从文件中批量读取字节的方法:
int read(byte[] b)
该方法会从指针位置处尝试最多读取给定数组的总长度的字节量,并从给定的字节数组第一个位置开始,将读取到的字节顺序存放至数组中,返回值为实际读取到的字节量。
//测试RRandomAccess的read(byte[])方法
public void testReadByteArray() throws Exception{
RandomAccessFile raf=new RandomAccessFile("raf.dat","r");
//创建10字节数组
byte[] buf=new byte[10];
//尝试读取10个字节存入数组,返回值为读取的字节量
int len=raf.read(buf);
raf.close();
}
5、close()方法
RandomAccessFile在对文件访问的操作全部结束后,要调用close()方法来释放与其关联的所有系统资源。
-void close()
RandomAccessFile raf=new RandomAccessFile(file,"rw");
……//读写操作
raf.close();//访问完毕后要关闭以释放系统资源。
【文件指针操作】
1、getFilePointer()方法
RandomAccessFile的读写操作都是基于指针的,也就是说总是在指针当前所指向的位置进行读写操作。
方法:
-long getFilePointer()
该方法用于获取当前RandomAccessFile的指针位置。
RandomAccessFile raf=new RandomAccessFile(file,"rw");
System.out.println(raf.getFilePointer());//0
raf.write('A');
System.out.println(raf.getFilePointer());//1
raf.writeInt(3);
System.out.println(raf.getFilePointer());//5
raf.close();
2、seek()方法
RandomAccessFile提供了一个方法用于移动指针位置。
方法:
-void seek(long pos)
该方法用于移动当前RandomAccessFile的指针位置。
RandomAccessFile raf=new RandomAccessFile(file,"rw");
System.out.println(raf.getFilePointer());//0
raf.write('A');//指针位置1
raf.writeInt(3);//指针位置5
//将指针移动到文件开始处(第一个字节的位置)
raf.seek(0);
System.out.println(raf.getFilePointer());//0
raf.close();
3、skipBytes方法
RandomAccessFile提供了一个方法可以尝试跳过输入的n个字节以丢弃跳过的字节。
方法:
int skipBytes(int n)
该方法可能跳过一些较少数量的字节(可能包括零)。这可能由任意数量的条件引起;在跳过n个字节之前已到达文件的末尾只是其中的一种可能。
此方法不抛出EOFException。返回跳过的实际字节数。如果n为负数,则不跳过任何字节。
//测试文件指针的相关方法
public void testPointer() throws Exception{
RandomAccessFile raf=new RandomAccessFile("raf.dat","r");
//输出指针位置,默认从0开始(文件的第一个字节位置)
//读取world,需要将hello这5个字节跳
raf.skipBytes(5);
//读取world这5个字节
byte[] buf=new byte[5];
raf.read(buf);
//将游标移动到文件开始
raf.seek(0);
raf.close();
}
【演示】
一、以下是读写文件的代码
public class RandomAccessFileDemo1{
public static void main(String[] args) throws FileNotFoundException{
File file=new File("raf.dat");//默认当前目录(即src包所在的目录)
RandomAccessFile raf=new RandomAccessFile(file,"rw");//若这句代码改为RandomAccessFile raf=new RandomAccessFile("raf.dat","rw");,则上一句代码可以不写,实际应用中哪个方便就用那种。
raf.close();//若没有这句代码,删除文件时会提示这个文件正在被占用
}
}
二、以下是只读文件的代码
public class RandomAccessFileDemo2{
public static void main(String[] args)throws IOException{
RandomAccessFile raf=new RandomAccessFile("raf.dat","r");
System.out.println(d);//结果为1
raf.close();
}
}
三、下面是复制文件的代码
public class CopyDemo1{
public static void main(String[] args){
RandomAccessFile src=new RandomAccessFile("music.mp3","r");//原目录下有个music.map3的文件
RandomAccessFile desc=new RandomAccessFile("music_cp.mp3","rw");
//临时保存每次读取到的一个字节
int d=-1;
while((d=src.read())!=-1){//read()方法返回值范围正数:0到255,当读到文件末尾时返回“-1”
desc.write(d);//这种复制方式是非常慢的
}
src.close();
desc.close();
}
}
四、下面是快速复制文件的代码
public class CopyDemo1{
public static void main(String[] args){
RandomAccessFile src=new RandomAccessFile("movie.mp4");
RandomAccessFile desc=new RandomAccessFile("movie_cp.mp4");
byte[] data=new byte[1024*10];//10k
int len=-1;
while((len=src.read(data))!=-1){
desc.write(data,0,len);
}
src.close();
desc.close();
}
}
五、以下代码是将字符串转换为一组字节
public class RandomAccessFileDemo3{
public static void main(String[] args)throws IOException{
RandomAccessFile raf=new RandomAccessFile("raf.txt","rw");
String str="简单点,说话的方式简单点。";
byte[] data=str.getBytes("GBK");//getBytes()方法把当前字符串按照系统默认字符集(windows为GBK,linux为UTF-8)转换为一组字节
raf.write(data);
raf.close();
}
}
六、以下代码是读取字符串数据
public class RandomAccessFileDemo4{
public static void main(String[] args) throws IOException{
RandomAccessFile raf=new RandomAccessFile("raf.txt","r");
byte[] data=new byte[200];
int len=raf.read(data);//最多读取给定数组的总长度的字节量,返回值为实际读取到的字节量。
String str=new String(data,0,len,"GBK");//将0到len长度的字节量转换为字符串
raf.close();
}
}
七、以下代码是记事本程序代码
public class Note{
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
String fileName=scan.nextLine();
RandomAccessFile raf=new RandomAccessFile(fileName,"rw");
while(true){
String message=scan.nextLine();
if("exit".equals(message)){
break;
}
raf.write(message.getBytes("GBK"));
}
}
}
八、下列代码向文件中写入和读出数据
public class RandomAccessFileDemo5{
public static void main(String[] args) throws IOException{
RandomAccessFile raf=new RandomAccessFile("raf.dat","rw");
//向文件中写入最大值
int imax=Integer.MAX_VALUE;//最大值的二进制是“01111111 11111111 11111111 11111111”
raf.write(imax>>>24);
raf.write(imax>>>16);
raf.write(imax>>>8);
raf.write(imax);
raf.writeInt(imax);//这一句代码相当于上面4句代码,一次性将给定int值的4个字节全部写出
raf.writeLong(123L);
raf.writeDouble(123.123);
raf.seek(0);//移动指针到文件最开始
int d=raf.readInt();
System.out.println(d);//输出int的最大值
raf.seek(8);
long l=raf.readLong();
System.out.println(l);//123
Double dou=raf.readDouble();
System.out.println("指针位置:"+raf.getFilePointer());//24
raf.seek(0);
l=raf.readLong();
System.out.println(l);//9223372034707292159
raf.close();
}
}
领取专属 10元无门槛券
私享最新 技术干货