RandomAccessFile

RandomAccessFile(java.io.RandomAccessFile)

  • java提供了一个可以对文件随机访问的操作,访问包括读和写操作,类名为RandomAccessFile.该类的读写是基于指针的操作。
  • RandomAccessFile(File file,String mode)
  • RandomAccessFile(String filename,String mode)
  • 其中构造方法第一个参数是需要访问的文件,第二个参数是访问模式,访问模式有两种:只读(r)和读写(rw)
  • 写的时候是将int的后8位写入,读的时候是读取一个byte(8位)填充到int的低8位,高24位为0.
  • 注意读写结束后要用close()关闭访问。
RandomAccessFile raf = new RandomAccessFile(fileName ,"rw");
raf.write()
raf.read();
raf.close();

RAF提供了块读写数据的方法

  • 块读写是一组一组字节读写。单字节的读写方式称为随机读写 。块读写提高每次读写的数据量,减少实际读写的次数,效率会比随机读写高很多倍。
  • int read(byte[] data),参数是一个byte数组.一次性读取给定字节数总长度的字节量,返回值为实际读取到的字节量,若返回-1则表示本次没有读取到任何数据(文件末尾)
  • void write(byte[] data)一次性将给定的字节数组中所有字节写入到文件中
  • void write(byte[] data,int offset ,int len)将给定字节数组从下标offset处的连续len个字节一次性写入文件

RAF提供了方便写出和读取基本类型的方法

  • 因为写出和读取都是每次1个字节(也就是8个bit),而一个int有4个字节,所以肯定不能直接写的 raf.write(Integer.MAX_VALUE),需要借助于右移运算符>>>(无符号右移),如下
int imax = Integer.MAX_VALUE;
raf.write(imax>>>24);//raf.write默认从末尾读取8位,因为要先写高位在写低位,写完才正确,所以要先把要写的最高位移到最后
raf.write(imax>>>16);
raf.write(imax>>>8);
raf.write(imax>>>0)
raf.close();
  • 以上是实现原理,java中的方法writeInt封装了这一段代码,只要调用 raf.writeInt(imax)就会自动写4次,每次8个字节。其实并不止这个方法,所有基本数据类型都有相应的写入方法封装。
raf.writeInt()
raf.writeLong()
raf.writeShort()
raf.writeByte()
raf.writeFloat()
raf.writeDouble()
raf.writeChar()
raf.writeBoolean()

  • 同样read读取功能也提供了8中基本类型的封装。

RAF读取文本数据

  • 读取文本数据需要依赖字符集 转码方式把文字转化成二进制字节数组
  • byte[] getBytes() 按照系统默认字符集将当前字符串转换为一组字节:
    byte[] data = str.getBytes()
  • byte[] getBytes(String csn)按照指定的字符集将当前字符串转换为一组字节
    byte[] data = str.getBytes(UTF-8")
    常用字符集(大小写都一样):
    GBK: 中国国标编码,其中英文1字节,中文2字节
    UTF-8:unicode的一个字符集,英文1字节,中文3字节,支持所有国家文字,互联网最常用字符集
    ISO8859-1:欧洲的编码集,注意:不支持中文

文件指针操作

  • RandomAccessFile的读写操作都是基于指针的,也就是总是在指针当前所在的位值进行读写操作的
  • 每次读/写1个字节,指针都会向后移一个字节,这也是可以连续读取或写入的原因。当你要重复读取一段数据时,读完一次就要把指针移到数据开始位值,在来读取
  • getFilePoint()方法:
    long getFilePoint()用于获取当前指针的位置,返回值是long
  • seek()方法:
    void seek(long pos)把指针移动到pos位置

读写案例

package raf;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Test02 {

	public static void main(String[] args) throws IOException{
		//写出数据
		RandomAccessFile raf = new RandomAccessFile("fileName" ,"rw");
		String str = "你好";
		byte[] writeData = str.getBytes("utf-8");//把字符串按照utf-8编码集规则转化成字节数组
		raf.write(writeData);//写的是byte数组
		//读取数据
		System.out.println(raf.getFilePointer());//当写完时,指针位值在写入内容的最后位值
		raf.seek(0);//如果要读取数据,需要把指针移到开始处,否则是读不到内容的,会返回-1
		byte[] readData = new byte[(int)raf.length()];//用来存储读取内容的字节数组,长度位文件的内容长度,注意raf.length()是long类型,需要强转成int类型
		raf.read(readData);//读取数据,并存入readData字节数组
		String str1 = new String(readData,"utf-8");//把字节数组的内容按照utf-8编码集规则转换成字符串
		System.out.println(str1);
		raf.close();//读写完成要关闭
	}

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值