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