RAF的相关操作及实例演示

首先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();
			
		}
		

	}

}
原创文章 46 获赞 7 访问量 2089

猜你喜欢

转载自blog.csdn.net/EdwardWH/article/details/105041228