Java之路:RandomAccessFile类

Java提供了专门处理文件的类,即RandomAccessFile(随机访问文件)类。该类是Java语言中功能最为丰富的文件访问类

RandomAccessFile类支持“随机访问”方式,“随机”是指可以跳转到文件的任意位置处读写数据

在访问一个文件的时候,不必把文件从头读到尾,而是希望像访问一个数据库一样“随心所欲”地访问一个文件的某个部分,这时使用RandomAccessFile类就是最佳选择。

RandomAccessFile对象类有个位置指示器,指向当前读写处的位置,当读写n个字节后,文件指示器将指向这n个字节后面的下一个字节处。刚打开文件时,文件指示器指向文件的开头处,可以移动文件指示器到新的位置,随后的读写操作将从新的位置开始。

RandomAccessFile类在数据等长记录格式文件的随机(相对顺序而言)读取时有很大的优势,但该类仅限于操作文件,不能访问其他的IO设备,如网络、内存映像等。

RandomAccessFile类的构造方法如下所示:

//创建随机存储文件流,文件属性由参数File对象指定
RandomAccessFile(File file, String mode) 

//创建随机存储文件流,文件名由参数name指定
RandomAccessFile(String name, String mode) 

这两个构造方法均涉及到一个String类型的参数mode,它决定随机存储文件流的操作模式,下表列出了mode的值及对应的含义:

在这里插入图片描述

下 面 是 一 个 使 用 RandomAccessFile 的 例子,往文件中写入3名员工的信息,然后按照第2名员工、第1名员工、第3名员工的先后顺序读出。RandomAccessFile可以以只读或读写方式打开文件,具体使用哪种方式取决于用户创建RandomAccessFile类对象的构造方法:

new RandomAccessFile(f,"rw");  //读写方式
new RandomAccessFile(f,"r");  //只读方式

提示:当程序需要以读写的方式打开一个文件时,如果这个文件不存在,程序会自动创建此文件。

这里还需要设计一个类来封装员工信息。一个员工信息就是文件中的一条记录,而且必须保证每条记录在文件中的大小相同,也就是每个员工的姓名字段在文件中的长度是一样的,这样才能够准确定位每条记录在文件中的具体位置。

假设name中有8个字符,少于8个则补空格(这里用"\u0000"),多于8个则去掉后面多余的部分。由于年龄是整型数,所以不管这个数有多大,只要它不超过整型数的范围,在内存中都是占4个字节大小。

【示例】

package com.xy.io;

import java.io.RandomAccessFile;

public class RandomFileDemo {
	public static void main(String[] args) throws Exception {
		Employee e1 = new Employee("zhangsan", 23);
		Employee e2 = new Employee("lisi", 24);
		Employee e3 = new Employee("wangwu", 25);
		RandomAccessFile ra = new RandomAccessFile("C:\\Users\\XY\\Desktop\\employee.txt", "rw");

		
		ra.write(e1.name.getBytes());
		ra.writeInt(e1.age);
		ra.write(e2.name.getBytes());
		ra.writeInt(e2.age);
		ra.write(e3.name.getBytes());
		ra.writeInt(e3.age);
		ra.close();
		
		RandomAccessFile raf = new RandomAccessFile("C:\\Users\\XY\\Desktop\\employee.txt", "r");
		int len = 8;
		raf.skipBytes(12);	// 跳过第一个员工的信息,姓名8字节,年龄4字节
		System.out.println("第2个员工的信息:");
		String str = "";
		for(int i = 0; i < len; i++) {
			str += (char)raf.readByte();
		}
		System.out.println("name:" + str);
		System.out.println("age:" + raf.readInt());
		System.out.println("第1个员工的信息:");
		raf.seek(0);	// 将文件指针移动到文件开始位置
		str = "";
		for(int i = 0; i < len; i++) {
			str += (char)raf.readByte();
		}
		System.out.println("name:" + str);
		System.out.println("age:" + raf.readInt());
		System.out.println("第3个员工的信息:");
		raf.skipBytes(12);	// 跳过第二个员工的信息,姓名8字节,年龄4字节
		str = "";
		for(int i = 0; i < len; i++) {
			str += (char)raf.readByte();
		}
		System.out.println("name:" + str);
		System.out.println("age:" + raf.readInt());
		raf.close();
	}
}

class Employee {
	String name;
	int age;
	final static int LEN = 8;
	public Employee(String name, int age) {
		if(name.length() > LEN) {
			name = name.substring(0, 8);
		}
		else {
			while(name.length() < LEN) {
				name = name + "\u0000";
			}
		}
		this.name = name;
		this.age = age;
	}
}

【结果】
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43555323/article/details/84974417