跟我学IO(RandomAccessFile类)

在前面普通的IO操作中是读/写分开进行的,且写数据到文件中只能选择从头覆盖或者追加到文件尾部两种方式,这也是由于普通I/O流功能上的限制。在实际应用中,确实可能出现需要交替读/写文件、或定点读/写的情况,比如,我们使用文件来存储用户的成绩,如果用户存在,则修改用户的成绩。

在前面Java普通的IO中是读/写分开进行的,且写数据到文件中只能选择从头覆盖或者追加到文件尾部两种方式,这也是由于Java普通I/O流功能上的限制。在实际应用中,确实可能出现需要交替读/写文件、或定点读/写的情况,比如,我们使用文件来存储用户的成绩,如果用户存在,则修改用户的成绩。

在构造RandomAccessFile类时需要制定其操作文件的方式,常用的两种方式为:

1、“r”:以只读的方式打开文件,不允许进行文件写操作。这种方式可以避免对文件误修改,而且其运行效率会高一些。

2、“rw”:以读/写方式打开文件,允许同时对文件进行读/写操作。如果目标文件尚不存在,则尝试创建该文件。

package io.stream;

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

public class RandomAccessFileTest {
	private File file = null;
	
	public static void main(String[] args) {
		RandomAccessFileTest rand = new RandomAccessFileTest();
		rand.init();
		// 写入信息到文件中
		rand.record("zhangsan", 56);
		rand.record("wangwu", 56);
		// 打印文件信息
		System.out.println("用户信息如下:");
		rand.print();
		// 修改zhangsan的成绩
		rand.record("zhangsan", 87);
		// 打印文件信息
		System.out.println("\n修改后用户信息如下:");
		rand.print();
	}
	
	/**
	 * 初始化文件对象
	 */
	public void init() {
		if ( null == file ) {
			file = new File("document/record.txt");
			try {
				file.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 将用户和成绩写入到文件中
	 * @param name 用户名
	 * @param score 成绩
	 */
	public void record(String name, int score) {
		RandomAccessFile rand = null;
		try {
			rand = new RandomAccessFile(file, "rw");
			
			// 用户是否存在,true-存在,false-不存在
			boolean flag = false;
			
			while ( rand.getFilePointer() < rand.length() ) {
				String tempName = rand.readUTF();
				
				if ( name.equals(tempName) ) {
					// 如果用户存在,则更新用户的成绩
					rand.writeInt(score);
					flag = true;
					break;
				} else {
					// 如果用户不存在,则跳过用户的成绩进入下一个用户
					rand.skipBytes( Integer.SIZE / 8 );
				}
			}
			
			// 如果用户不存在则新增
			if ( !flag ) {
				rand.writeUTF(name);
				rand.writeInt(score);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if ( null != rand ) {
				try {
					rand.close();
					rand = null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 输出文件信息
	 */
	public void print() {
		RandomAccessFile rand = null;
		try {
			rand = new RandomAccessFile(file, "r");
			while ( rand.getFilePointer() < rand.length() ) {
				String name = rand.readUTF();
				int score = rand.readInt();
				System.out.println("name:" + name + " score:" + score);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if ( null != rand ) {
				try {
					rand.close();
					rand = null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
}

输出结果:

用户信息如下:
name:zhangsan score:56
name:wangwu score:56

修改后用户信息如下:
name:zhangsan score:87
name:wangwu score:56
天赋如同自然花木,要用学习来修剪。 —— 培根
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号