IO流的练习 —— 创建用户注册、登陆案例
把上次用集合做的时候的分析拿出来
需求:
用户登录注册案例
按照如下操作,可以让我们更符合面向对象思想:
A:这个案例有哪些类
B:每个类中又有哪些东西
C:类与类之间的关系
分析:
A:这个案例有哪些类
用户类
测试类
B:每个类中又有哪些东西
用户类:
成员变量:用户名、密码
构造方法:无参构造
成员方法:getXxx()、setXxx()
登陆,注册
但,如果用户类的内容过多的时候,维护起来比较麻烦。
所以,为了以后维护起来比较容易,我们需要更清晰的分类:
用户类可以再分为2个类:
用户基本描述类:
成员变量:用户名、密码
构造方法:无参构造
成员方法:getXxx()、setXxx()
用户操作类:
登陆、注册
测试类:
main方法
C:类与类之间的关系是什么呢?
在测试类中创建用户操作类和用户描述类的对象,并使用它们的功能
分包:
A:按照功能划分
B:按照模块划分
C:先按照模块划分,再按照功能划分
这次先按照功能划分:
用户基本描述类:cn.lzl.pojo
用户操作接口:cn.lzl.dao
用户操作类包:cn.lzl.dao.impl
这次做的是集合实现,过几天是IO实现,再继续就是GUI实现,接着就是数据库实现
用户测试类:cn.lzl.test
另外添加了一个小游戏类
分析了一下,发现除了用户操作的具体实现类以外,其它类都无须改变
1、用户基本描述类:
1 package zl_login_regist; 2 /** 3 * 这是用户的基本描述类 4 * @author LZL 5 * 6 */ 7 public class User { 8 9 private String username; 10 private String password; 11 12 13 public User() { 14 15 } 16 17 public String getUsername() { 18 return username; 19 } 20 21 22 public void setUsername(String username) { 23 this.username = username; 24 } 25 26 27 public String getPassword() { 28 return password; 29 } 30 31 32 public void setPassword(String password) { 33 this.password = password; 34 } 35 }
2、用户操作接口:
1 package zl_login_regist; 2 /** 3 * 这是用户注册、登陆的接口 4 * @author LZL 5 * 6 */ 7 public interface UserDao { 8 /** 9 * 用户进行登陆操作 10 * @param username 用户的登录名 11 * @param password 用户的密码 12 * @return 是否登陆成功 13 */ 14 15 public abstract boolean isLogin(String username,String password); 16 /** 17 * 用户进行注册操作 18 * @param user 用户注册时填写的信息 19 */ 20 public abstract void regist(User user); 21 }
3、用户操作的具体实现类(IO流)继承用户操作接口
1 package zl_login_regist; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.File; 6 import java.io.FileNotFoundException; 7 import java.io.FileReader; 8 import java.io.FileWriter; 9 import java.io.IOException; 10 11 /** 12 * 这是用户进行登陆、注册操作的实现类(IO版) 13 * 14 * @author LZL 15 */ 16 public class UserDaoImpl implements UserDao { 17 18 // 为了保证User.txt这个文件在程序运行后就存在,用静态定义该对象 19 private static File file = new File("User.txt"); 20 21 // 创建文件,静态。依旧时为了程序运行后就能创建该文件 22 static { 23 try { 24 file.createNewFile(); 25 } catch (IOException e) { 26 System.out.println("创建用户文件失败"); 27 // e.printStackTrace(); 28 } 29 } 30 31 public boolean isLogin(String username, String password) { 32 boolean flag = false; 33 BufferedReader br = null; 34 // 从User.txt文件中读取数据,缓冲字符输入流,并拿用户输入的用户名和密码与之进行对比 35 try { 36 br = new BufferedReader(new FileReader(file)); 37 String line = null; 38 try { 39 while ((line = br.readLine()) != null) { 40 // 把读取到的字符串“xxx,---,bbb”剪切成“xxx,bbb” 41 String[] result = line.split("-"); 42 if (result[0].equals(username) 43 && result[1].equals(password)) { 44 flag = true;// 用户密码都正确,则true 45 break; 46 } 47 } 48 } catch (IOException e) { 49 System.out.println("用户登录失败"); 50 e.printStackTrace(); 51 } 52 } catch (FileNotFoundException e) { 53 System.out.println("找不到用户的资料文件"); 54 // e.printStackTrace(); 55 } finally { 56 if (br != null) { 57 try { 58 br.close(); 59 } catch (IOException e) { 60 System.out.println("用户注册释放资源失败"); 61 // e.printStackTrace(); 62 } 63 } 64 } 65 return flag; 66 } 67 68 public void regist(User user) { 69 // 写入字符,缓冲字符输出流,并且是可以追加数据的,不然前面的数据会被后面加入的数据给替代掉 70 // 在这里不能抛异常,因为如果抛了,那么用户操作类就得改 71 BufferedWriter bw = null; 72 try { 73 bw = new BufferedWriter(new FileWriter(file, true)); 74 // 写入用户的数据 用---隔开,是为了登陆操作更方便进行数据对比 75 bw.write(user.getUsername() + "-" + user.getPassword()); 76 bw.newLine(); 77 bw.flush(); 78 } catch (IOException e) { 79 System.out.println("用户注册失败"); 80 // e.printStackTrace(); 81 } finally { 82 if (bw != null) { 83 try { 84 bw.close(); 85 } catch (IOException e) { 86 87 System.out.println("用户注册释放资源失败"); 88 // e.printStackTrace(); 89 } 90 } 91 } 92 } 93 94 }
4、超级小游戏类。。这玩意算游戏么
1 package zl_login_regist; 2 3 import java.util.Scanner; 4 5 /** 6 * 这是猜数字小游戏 7 * @author LZL 8 */ 9 public class GuessNumber { 10 private GuessNumber() { 11 } 12 13 public static void start() { 14 // 产生一个随机数 15 int number = (int) (Math.random() * 100) + 1; 16 17 // 定义一个统计变量 18 int count = 0; 19 20 while (true) { 21 // 键盘录入一个数据 22 Scanner sc = new Scanner(System.in); 23 System.out.println("请输入数据(1-100):"); 24 int guessNumber = sc.nextInt(); 25 26 count++; 27 28 // 判断 29 if (guessNumber > number) { 30 System.out.println("你猜的数据" + guessNumber + "大了"); 31 } else if (guessNumber < number) { 32 System.out.println("你猜的数据" + guessNumber + "小了"); 33 } else { 34 System.out.println("恭喜你," + count + "次就猜中了"); 35 break; 36 } 37 } 38 } 39 }
5、用户的测试类
1 package zl_login_regist; 2 3 import java.util.Scanner; 4 5 /** 6 * 用户测试类 7 * 8 * @author LZL 9 * 10 */ 11 public class UserTest { 12 public static void main(String[] args) { 13 // 为了能够回来 14 while (true) { 15 // 欢迎界面,给出选择项 16 System.out.println("--------------欢迎光临--------------"); 17 System.out.println("1 登录"); 18 System.out.println("2 注册"); 19 System.out.println("3 退出"); 20 System.out.println("请输入你的选择:"); 21 // 键盘录入选择,根据选择做不同的操作 22 Scanner sc = new Scanner(System.in); 23 // 为了后面的录入信息的方便,我所有的数据录入全部用字符接收 24 String choiceString = sc.nextLine(); 25 26 // switch语句的多个地方要使用,我就定义到外面 27 UserDao ud = new UserDaoImpl(); 28 29 // 经过简单的思考,我选择了switch 30 switch (choiceString) { 31 case "1": 32 // 登录界面,请输入用户名和密码 33 System.out.println("--------------登录界面--------------"); 34 System.out.println("请输入用户名:"); 35 String username = sc.nextLine(); 36 System.out.println("请输入密码:"); 37 String password = sc.nextLine(); 38 39 // 调用登录功能 40 // UserDao ud = new UserDaomImpl(); 41 42 boolean flag = ud.isLogin(username, password); 43 if (flag) { 44 System.out.println("登录成功,可以开始玩游戏了"); 45 46 System.out.println("你玩吗?y/n"); 47 while (true) { 48 String resultString = sc.nextLine(); 49 if (resultString.equalsIgnoreCase("y")) { 50 // 玩游戏 51 GuessNumber.start(); 52 System.out.println("你还玩吗?y/n"); 53 } else { 54 break; 55 } 56 } 57 System.out.println("谢谢使用,欢迎下次再来"); 58 System.exit(0); 59 // break; //这里写break,结束的是switch 60 } else { 61 System.out.println("用户名或者密码有误,登录失败"); 62 } 63 break; 64 case "2": 65 // 欢迎界面,请输入用户名和密码 66 System.out.println("--------------注册界面--------------"); 67 System.out.println("请输入用户名:"); 68 String newUsername = sc.nextLine(); 69 System.out.println("请输入密码:"); 70 String newPassword = sc.nextLine(); 71 72 // 把用户名和密码封装到一个对象中 73 User user = new User(); 74 user.setUsername(newUsername); 75 user.setPassword(newPassword); 76 77 // 调用注册功能 78 // 多态 79 // UserDao ud = new UserDaoImpl(); 80 // 具体类使用 81 // UserDaoImpl udi = new UserDaoImpl(); 82 83 ud.regist(user); 84 System.out.println("注册成功"); 85 break; 86 case "3": 87 default: 88 System.out.println("谢谢使用,欢迎下次再来"); 89 System.exit(0); 90 break; 91 } 92 } 93 } 94 }