Java流系列(六):RandomAccessFile(随机读写)

7 篇文章 0 订阅
1、RandomAccessFile(随机访问文件):

可以对文件进行随机的读取和写出,这是到目前为止,我学习的唯一一个可以同时进行读和写操作的类。因为这个类同时实现了DataOutput, DataInput这两个接口.

完成文件指针的跳跃有两种方式:

  • randomAccessFile.seek(绝对位置(永远从文件的开头开始计算)); 可以向前移动指针,也可以向后移动指针.
  • randomAccessFile.skipBytes(相对位置(相对文件指针当前的位置开始计算新的位置));只能向后移动指针.
2、元数据:用来描述其它数据的数据.

实例化随机访问文件对象,同时指定要操作的文件名和文件的操作模式.

文件的操作模式包括:

  • r:只读,如果执行任何写出操作都会报IOException
  • rw:读写,这种模式下可以同时对象指定的文件进行读写操作.
  • rws:打开以便读取和写入,对于 “rw”,还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备
  • rwd:打开以便读取和写入,对于 “rw”,还要求对文件内容的每个更新都同步写入到底层存储设备
3、操作示例
RandomAccessFile randomAccessFile=new RandomAccessFile("zf.bak","rw");
//写出第一个人的信息
randomAccessFile.writeBytes("zhangsan");//gbk编码表。一个字母占一个字节,一个汉字占两个字节
randomAccessFile.writeInt(20);
//写出第二个人的信息
randomAccessFile.writeBytes("lisi");//只能写出字母,不能写汉字,否则然后通过read(byte[] data)读取数据会发生错误
randomAccessFile.writeInt(18);
//写出第三个人的信息
randomAccessFile.write("小梅".getBytes());//如果想写汉字,则必须使用write(byte[] data);
randomAccessFile.writeInt(18);
//得到文件指针的当前位置
long filePointer=randomAccessFile.getFilePointer();
System.out.println("filePointer="+filePointer);
//将文件指针定位到初始位置
randomAccessFile.seek(0);
//读取第一个人的信息
byte[] buffer=new byte[8];
int len=0;
//读取姓名
len=randomAccessFile.read(buffer);
String name=new String(buffer,0,len);
//读取年龄
int age=randomAccessFile.readInt();
System.out.println("name="+name+",age="+age);
//得到当前文件指针的位置
filePointer=randomAccessFile.getFilePointer();
System.out.println("filePointer="+filePointer);
/*
//读取第二个人的信息
buffer=new byte[4];
len=randomAccessFile.read(buffer);
name=new String(buffer,0,len);
age=randomAccessFile.readInt();
System.out.println("name="+name+",age="+age);*/
//如果想直接读取第三个人的信息,则务必要跳过第二个人的信息.
randomAccessFile.skipBytes(8);
filePointer=randomAccessFile.getFilePointer();
System.out.println("filePointer="+filePointer);
//读取第三个人的信息
buffer=new byte[4];
len=randomAccessFile.read(buffer);
name=new String(buffer,0,len);
age=randomAccessFile.readInt();
System.out.println("name="+name+",age="+age);
//从文件开始位置向后跳12个字节
randomAccessFile.seek(12);
//读取第二个人的信息
buffer=new byte[4];
len=randomAccessFile.read(buffer);
name=new String(buffer,0,len);
age=randomAccessFile.readInt();
System.out.println("name="+name+",age="+age);

在UTF-8修订编码中计算占用的字节数时需要注意:
一个字母占一个字节,一个汉字占3个字节.在每一次读取数据前都会首先读取一个表示整个字节长度的unshort类型的数据,占2个字节。因此算法如下:
张三=2+3*2=8 ,int=4

//1.实例化随机访问文件对象
RandomAccessFile randomAccessFile=new RandomAccessFile("wcf.bak","rw");
//2.使用UNICODE编码完成数据的写出和读入
randomAccessFile.writeUTF("张三");//张三=2+3*2=8
randomAccessFile.writeInt(20);//int=4
randomAccessFile.writeUTF("lisi");//lisi=2+4=6
randomAccessFile.writeInt(18);//int=4
randomAccessFile.writeUTF("小丽");//小丽=2+3*2=8
randomAccessFile.writeInt(20);//int=4
//将文件指针定位到文件的初始位置
randomAccessFile.seek(0);
//读取第一个人的数据
String name=randomAccessFile.readUTF();
int age=randomAccessFile.readInt();
System.out.println("name="+name+",age="+age);
long filePinter=randomAccessFile.getFilePointer();
System.out.println("filePointer="+filePinter);
/*//读取第二个人的数据
name=randomAccessFile.readUTF();
age=randomAccessFile.readInt();
System.out.println("name="+name+",age="+age);
filePinter=randomAccessFile.getFilePointer();
System.out.println("filePointer="+filePinter);*/
//跳过第二个人的信息
randomAccessFile.skipBytes(10);
//读取第三个人的数据
name=randomAccessFile.readUTF();
age=randomAccessFile.readInt();
System.out.println("name="+name+",age="+age);
filePinter=randomAccessFile.getFilePointer();
System.out.println("filePointer="+filePinter);
//读取第二个人的信息
randomAccessFile.seek(12);
name=randomAccessFile.readUTF();
age=randomAccessFile.readInt();
System.out.println("name="+name+",age="+age);
filePinter=randomAccessFile.getFilePointer();
System.out.println("filePointer="+filePinter);
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值