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 }
何事都只需坚持.. 难? 维熟尔。 LZL的自学历程...只需坚持
原文地址:https://www.cnblogs.com/LZL-student/p/5928265.html