注册用户
利用RandomAccessFile类完成一个用户的注册功能,该用户信息占100字节,其中姓名,昵称,密码等占32个字节,年龄占4字节。
package com.tedu.raf;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;
import java.util.Scanner;
/**
* 完成用户注册功能
* 将一个用户信息保存到一个文件中
* 这个文件可以保存多个用户信息
* 程序运行一次保存一次
* 用户名(String) 密码(String) 昵称(String) 年龄(int)
* 每个用户信息占用100字节
* 其中每个字符串信息占32字节,int型占4字节
* @author Wildmess
*
*/
public class RegDemo {
public static void main(String[] args) throws IOException {
Scanner scan = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = scan.nextLine();
System.out.println("请输入密码:");
String pwd = scan.nextLine();
System.out.println("请输入昵称:");
String nick = scan.nextLine();
System.out.println("请输入年龄:");
int age = scan.nextInt();
System.out.println("this user's name:" + name +
"pwd:" + pwd +
"nick:" + nick +
"age:" + age);
RandomAccessFile raf = new RandomAccessFile("user.txt", "rw");
//将指针移动到最后
raf.seek(raf.length());
//写用户名
//将用户名转换成字节数组
byte[] arrayName = name.getBytes("utf-8");
//将写入的用户名字符串字节数限定
//短的扩容,长的缩容,便于后期管理
arrayName = Arrays.copyOf(arrayName, 32);
raf.write(arrayName);
System.out.println(raf.getFilePointer());//32
//写密码
byte[] arrayPwd = pwd.getBytes("utf-8");
arrayPwd = Arrays.copyOf(arrayPwd, 32);
raf.write(arrayPwd);
System.out.println(raf.getFilePointer());//64
//写昵称
byte[] arrayNick = nick.getBytes("utf-8");
arrayNick = Arrays.copyOf(arrayNick, 32);
raf.write(arrayNick);
System.out.println(raf.getFilePointer());//96
//写年龄
raf.writeInt(age);
System.out.println(raf.getFilePointer());//100
System.out.println("程序结束!");
raf.close();
}
}
运行两次,在文件user.txt中录入俩个数据:
查询用户信息
在已经录入好数据的user.txt文件中查询出所有的用户信息:
package com.tedu.raf;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 显示在user.txt文件中已录入的所有的用户信息
*
* @author Wildmess
*
*/
public class ShowAllUserDemo {
public static void main(String[] args) throws IOException {
RandomAccessFile raf = new RandomAccessFile("user.txt", "r");
for(int i=0; i<raf.length()/100; i++) {
byte[] data = new byte[32];
//一次读取32个字节
raf.read(data);
String name = new String(data,"utf-8");
System.out.println(raf.getFilePointer());//看看RAF的指针所到位置:32
raf.read(data);
String pwd = new String(data,"utf-8");
System.out.println(raf.getFilePointer());//64
raf.read(data);
String nick = new String(data,"utf-8");
System.out.println(raf.getFilePointer());//96
int age = raf.readInt();
System.out.println(raf.getFilePointer());//100
System.out.println("this user's name:" + name.trim() +
"pwd:" + pwd.trim() +
"nick:" + nick.trim() +
"age:" + age); //trim去掉字符串中的空格
}
System.out.println("程序结束!");
raf.close();
}
}
运行结果:
修改用户信息
在已经录入好数据的user.txt文件中修改用户信息:
package com.tedu.raf;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;
import java.util.Scanner;
/**
* 修改用户昵称
* 在程序运行后输入用户名和新昵称
* 在user.txt中查找对应用户
* 如果存在修改昵称为新昵称
* 如果不存在输出:查无此人
* @author Wildmess
*
*/
public class UpateDemo {
public static void main(String[] args) throws IOException {
Scanner scan = new Scanner(System.in);
System.out.println("请输入用户名:");
String name = scan.nextLine();
System.out.println("请输入用户密码:");
String pwd = scan.nextLine();
System.out.println("请输入新昵称:");
String newNick = scan.nextLine();
RandomAccessFile raf = new RandomAccessFile("user.txt", "rw");
boolean isUpdated = false;//标记是否为要修改的信息,默认为不修改
for(int i=0; i<raf.length()/100; i++) {
//将RandomAccessFile的指针移动到当前循环的用户起始位置
raf.seek(i*100);
//读取
byte[] data = new byte[32];
raf.read(data);
String checkName = new String(data, "utf-8").trim();//trim去空格
raf.read(data);
String checkPwd = new String(data, "utf-8").trim();
//对比当前取出的用户名和密码与用户输入的用户名和密码是否相同
if(checkName.equals(name) || checkPwd.equals(pwd)) {
data = newNick.getBytes("utf-8");
data = Arrays.copyOf(data, 32);
raf.write(data);
isUpdated = true;//确定修改
System.out.println("修改成功!");
break;//终止循环
}
}
//判断是否修改过
if(!isUpdated) {
System.out.println("查无此人!");
}
System.out.println("程序结束!");
raf.close();
}
}
运行结果:
可在上一个写好的查询中查看修改结果:
修改成功。
总结
自此RandomAccessFile类的学习就算是告一段落了,但是其具体的使用却显得很繁琐,针对一个简单的读写,却要使用多行代码去表示,因此,接下来我们将学习对用复杂的文件读写操作如何进行。