RandomAccessFile 类的使用——基本使用

该类继承的是Object类,而不是任何流类,该类支持读取和写入(读写一体)随机访问文件(这里随机指的是可以自定义位置读写)。

相关方法

//构造方法
/*mode模式,常用的有两种:rw打开以便读取和写入; r以只读方式打开*/
RandomAccessFile(File file, String mode);
RandomAccessFile(String name, String mode);

//成员方法,除了以下几个方法,可以在read和write加上基本类型的符号,表示针对某一类型进行读写
int read(); //读取一个数据字节
String readLine(); 
String readUTF(); //读取字符串
void readFully(byte[] b);
void readFully(byte[] b, int off, int len);

void write(int b);
void writeUTF(String str);

//返回文件长度,返回值是long
long length();

//自定义读取,根据16进制字节码设置指针 偏移【量】,默认是以十六进制字节码的开头位置位参照
void seek(long pos); 

//从当前位置跳过字节
int skipBytes(int n); 

注意事项

写入和读取的数据类型的顺序必须一一对应,顺序不可以变化

//写入封装方法
public static void write() throws Exception{
        //1创建对象
        RandomAccessFile raf=new RandomAccessFile("ran.txt", "rw");
        //2写入
        raf.writeUTF("张三"); ---------------------------------------|
        raf.writeInt(20);	----------------------------------------|			
        raf.writeDouble(170.5);  									|
        raf.writeBoolean(true);									    |
    																|
   		raf.writeUTF("李四");										  |
        raf.writeInt(22);											|
        raf.writeDouble(180.5);										|
        raf.writeBoolean(false);                                    |
        															|
        //3关闭													   |
        raf.close();												|
        System.out.println("写入完毕");								  |
}																	|
//读取封装方法														|
public static void read() throws Exception{							|
	//1创建对象														  |
	RandomAccessFile raf=new RandomAccessFile("ran.txt", "r");      |
     																|   
    //2读取														   |
    String name = raf.readUTF(); ------------------------------------|
    int age = raf.readInt(); ----------------------------------------|
    double height = raf.readDouble();
    boolean b = raf.readBoolean();
    System.out.println(name+" "+age+" "+height+" "+b);

    //3关闭
    raf.close();
}

//该方式读取的还是张三的信息,如果需要读取李四的信息,则需要使用seek()或者skipBytes()方法

seek()和skipBytes()方法的执行过程和区别

执行原理分析

//同样以上面的代码为例,将写入的文件使用 EditPlus 打开,并使用Hx十六进制查看文件信息,如下:
00 06 E5 BC A0 E4 B8 89  00 00 00 14 40 65 50 00
00 00 00 00 01 00 06 E6  9D 8E E5 9B 9B 00 00 00
16 40 66 90 00 00 00 00  00 00 
/*
* 【00 06】表示的是占位6个字节的字符串,说明其后的6个位置【E5 BC A0 E4 B8 89】表示“张三”
*  Int占4个字节,所以【00 00 00 14】表示的是年龄age,14的十六进制转十进制就是20
*  同理,double类型占位8个字节,【40 65 50 00 00 00 00 00】表示170.5,最后的【01】表示true
*  综上所述,seek要定位在李四位置,即【00 06】的位置,相当于开头的【00】位置,偏移【量】为21
*/
raf.seek(21);
raf.skipBytes(21);

两种方法的区别

/*
* seek()方法,是指针的偏移量,始终以开头位置为参照,所以如下的代码不会报错
*/
raf.seek(21);
raf.seek(21);

/**
* skipBytes()方法是跳过,始终以前一个位置为参照,所以会出现EOF Exception,读取到文件末尾的异常
*/
raf.skipBytes(21);
raf.skipBytes(21);

使用 readFully() 方法完成复制操作案例

public class TextDemo01 {
	public static void main(String[] args) throws Exception {
		RandomAccessFile file = new RandomAccessFile("file.txt", "rw");
		file.writeUTF("这是一个UTF字符串");
		file.writeBoolean(true);// 占1个字节
		file.writeShort(395);// 占2个字节
		file.writeLong(2325451l);// 占8个字节

		System.out.println("——————文件复制(从file到fileCopy)——————");
		file.seek(0);//从开头位置读取
		RandomAccessFile fileCopy = new RandomAccessFile("fileCopy.txt", "rw");
		int len = (int) file.length();// 取得文件长度,返回值是long,注意转型
		byte[] b = new byte[len];
		
        //全部读取
		file.readFully(b);
		fileCopy.write(b);
		System.out.println("复制完成!");
	}
}
上一篇:java _io_随机读取读入流RandomAccessFile


下一篇:Java IO2:RandomAccessFile