首先RAF,RandomAccessFile只专门用于文件读写的API。
特点:可读可写,指针操作,灵活可变。
应用实例如下:
1、设置一个注册表并写入信息。
- 用户注册信息需要:用户名,密码,昵称,年龄
- 其中年龄为int值,其余都是字符串
- 每个用户信息都写入user.dat文件中。并且每个用户信息都占用100字节。
- 其中用户名、密码、昵称各占32字节,年龄占4字节
- 字符串故意留白好处在于便于后续修改。格式固定便于读取
public class RegDemo {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
System.out.println("欢迎注册!");
System.out.println("请输入用户名:");
String username = scanner.nextLine();
System.out.println("请输入密码:");
String password = scanner.nextLine();
System.out.println("请输入昵称:");
String nickname = scanner.nextLine();
System.out.println("请输入年龄:");
int age = scanner.nextInt();
RandomAccessFile raf = new RandomAccessFile("user.dat", "rw");
//先将指针移到文件末尾,这样才可以累加书写信息
raf.seek(raf.length());
System.out.println("pos:"+raf.getFilePointer());
//写用户名
byte[]data=username.getBytes();
data = Arrays.copyOf(data, 32); //扩容到32位
raf.write(data);
//写密码
data = password.getBytes();
data = Arrays.copyOf(data, 32);
raf.write(data);
//写昵称
data = nickname.getBytes();
data = Arrays.copyOf(data, 32);
raf.write(data);
//写年龄
raf.writeInt(age);
System.out.println("pos:"+raf.getFilePointer());
System.out.println("注册完毕!");
raf.close();
}
2、
-
:将user.dat文件中所有用户记录输出到控制台
/**
*
* <p>Title: ShowAllUserDemo.java</p>
* <p>Description:将user.dat文件中所有用户记录输出到控制台 </p>
* @author EP
* @date 2020年3月21日
* @version 1.0
*/
public class ShowAllUserDemo {
public static void main(String[] args) throws IOException {
RandomAccessFile raf = new RandomAccessFile("user.dat", "r");
byte[]data=new byte[32];
for (int i = 0; i < raf.length()/100; i++) {
//读取用户名
raf.read(data);
String username = new String(data,"GBK").trim();
//密码
raf.read(data);
String password = new String(data, "GBK").trim();
//昵称
raf.read(data);
String nickname = new String(data, "GBK").trim();
//年龄
int age = raf.readInt();
System.out.println(username+","+password+","+nickname+","+age);
}
raf.close();
}
3、修改昵称功能:
/**
* 修改昵称功能加强版
* @author EP
* @date 2020年3月23日
* @version 1.0
*/
public class UpdateDemoOptimized {
public static void main(String[] args) throws IOException {
System.out.println("欢迎使用修改昵称功能!");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的用户名:");
String inputname = scanner.nextLine();
A:
while(true) {
RandomAccessFile raf = new RandomAccessFile("user.dat", "rw");
byte[]data=new byte[32];
for (int i = 0; i < raf.length()/100; i++) {
raf.seek(i*100); //放在这里更清晰,即将指针放好
raf.read(data);
String username = new String(data, "GBK").trim();
if (username.equals(inputname)) {
System.out.println("请输入你的新昵称:");
String nickname = scanner.nextLine();
raf.seek(64+i*100);
byte[]arr=nickname.getBytes("GBK");
arr=Arrays.copyOf(arr, 32);
raf.write(arr);
System.out.println("昵称修改完毕!");
break A;
}
}
System.out.println("查无此人,请重新输入用户名:");
inputname = scanner.nextLine();
}
}
}