RandomAccessFile

【创建对象】

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();

}

}

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180308G0G77100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券