在前面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