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(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()
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");
raf.write(writeData);
System.out.println(raf.getFilePointer());
raf.seek(0);
byte[] readData = new byte[(int)raf.length()];
raf.read(readData);
String str1 = new String(readData,"utf-8");
System.out.println(str1);
raf.close();
}
}