古老的RandomAccessFile

本文通过两个Java示例程序展示了如何使用RandomAccessFile类进行文件的随机读写操作。首先,介绍了如何将字符串和整数写入文件,并确保文件中每个记录长度一致;接着,演示了如何从文件中逐条读取这些记录,并正确解析姓名和年龄信息。
package edu.fjut.file;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

//RandomAccessFile类的主要功能是完成随机读取功能
//可以读取指定位置的内容
public class RandomAccessFileDemo {

	public static void main(String[] args) throws IOException {
		
		//指定要操作的文件
		File file=new File("d:"+File.separator+"javase"+File.separator+"stu.txt");
		//rw为文件的打开方式(r,w,rw),如果文件不存在,会自动创建 
		RandomAccessFile rdf=new RandomAccessFile(file,"rw");
		String name=null;
		int age=0;
		
		//在文件中,所有的内容都是按照字节存放的,都有固定的保存位置.
		name="zhangsan";        //字符串的长度为8
		age=30;                 //数字的长度为4
		rdf.writeBytes(name);   //将姓名写入文件中
		rdf.writeInt(age);      //将年龄写入文件中
		 
		name="lisi    ";        //不够8个字符,用空格补全
		age=32;
		rdf.writeBytes(name);
		rdf.writeInt(age);
		
		name="wangwu  ";
		age=36;
		rdf.writeBytes(name);
		rdf.writeInt(age);
		
		rdf.close();//注意要关闭通道
	
	}

}
 
package edu.fjut.file;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

//读取文件中的内容
public class RandomAccessFileDemo2 {

	public static void main(String[] args)throws IOException {
       
		File file=new File("d:"+File.separator+"javase"+File.separator+"stu.txt");
		//以只读的方式打开文件
		RandomAccessFile rdf=new RandomAccessFile(file,"r");
		
		String name=null;
		int age;
		
		byte []bytes=new byte[8];
		//跳过一个人的信息
		rdf.skipBytes(12);
		//读取字符串需要一个一个字节的读取
		for(int i=0;i<bytes.length;i++){
			bytes[i]=rdf.readByte();
		}
		name=new String(bytes); //把byte数组转换成字符串对象
		age=rdf.readInt();
		System.out.println("第二个人的信息是: 姓名-->"+name.trim()+",年龄-->"+age);
		
		rdf.seek(0);//指针回到文件的开头
		for(int i=0;i<bytes.length;i++){
			bytes[i]=rdf.readByte();
		}
		name=new String(bytes);
		age=rdf.readInt();
		System.out.println("第一个人的信息是: 姓名-->"+name.trim()+",年龄-->"+age);
        	
		rdf.skipBytes(12);//空出第二个人的信息
		for(int i=0;i<bytes.length;i++){
			bytes[i]=rdf.readByte();
		}
		name=new String(bytes);
		age=rdf.readInt();
		System.out.println("第三个人的信息是: 姓名-->"+name.trim()+",年龄-->"+age);
		
		rdf.close();//注意关闭通道
	}
	/*
		第二个人的信息是: 姓名-->lisi,年龄-->32
		第一个人的信息是: 姓名-->zhangsan,年龄-->30
		第三个人的信息是: 姓名-->wangwu,年龄-->36
	*/
}
 
### 使用方法 创建 `RandomAccessFile` 对象时,需指定文件和操作模式。模式有 "r"(只读)、"rw"(读写)、"rws"(读写,同步文件内容和元数据更新)和 "rwd"(读写,同步文件内容更新)。 ```java import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; public class RandomAccessFileExample { public static void main(String[] args) { try { // 创建只读的 RandomAccessFile 对象 RandomAccessFile readOnlyFile = new RandomAccessFile(new File("test.txt"), "r"); // 创建读写的 RandomAccessFile 对象 RandomAccessFile readWriteFile = new RandomAccessFile(new File("test2.txt"), "rw"); // 读取文件内容 byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = readOnlyFile.read(buffer)) != -1) { // 将读取的内容写入另一个文件 readWriteFile.write(buffer, 0, bytesRead); } // 关闭文件 readOnlyFile.close(); readWriteFile.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` `RandomAccessFile` 还提供了 `seek` 方法,用于移动文件指针到指定位置: ```java import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; public class SeekExample { public static void main(String[] args) { try { RandomAccessFile file = new RandomAccessFile(new File("test.txt"), "rw"); // 将文件指针移动到第 10 个字节的位置 file.seek(10); // 从该位置开始写入数据 file.writeBytes("Inserted text"); file.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` ### 功能特性 - **随机访问**:能在文件的任意位置进行读写操作,通过 `seek` 方法移动文件指针到指定位置,实现随机访问,这是与其他流(如 `FileInputStream`)的重要区别,`FileInputStream` 适合顺序读取,而 `RandomAccessFile` 更适合随机访问(如频繁跳转偏移量) [^3]。 - **可作为输入输出流**:直接继承了 `Object` 类,实现了 `DataInput` 和 `DataOutput` 接口,既可以作为输入流又可以作为输出流 [^2]。 - **文件创建特性**:指定路径时,若文件不存在,则会自动创建。但反复向该文件中添加数据,会覆盖原有的数据(从前往后覆盖),而不是追加数据 [^2]。 ### 应用场景 - **断点续传**:在下载或上传大文件时,可暂停并在后续恢复,每次暂停时保存上一次的文件指针位置,断点下载时继续从上一次的位置开始下载,例如迅雷的下载功能就利用了此特性 [^2]。 - **大文件随机访问**:对于大文件,若需随机访问其中的数据,使用 `RandomAccessFile` 能有效提升数据处理的性能,如对用户行为日志的分析,可通过随机访问功能更高效地获取所需数据 [^1]。 - **文件插入操作**:`RandomAccessFile` 提供了 `seek()` 方法调用指针,可实现文件的插入操作,而其他流要么使用 `append()` 方法在文件末尾进行追加,要么直接覆盖 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值