zoukankan      html  css  js  c++  java
  • 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的自学历程...只需坚持
  • 相关阅读:
    对象拷贝-深拷贝
    eclipse安装桌面快捷方式
    ajax 分页
    单例模式
    过滤器
    ajax参数详解
    json
    反射
    jdbc02
    jdbc --例子7
  • 原文地址:https://www.cnblogs.com/LZL-student/p/5928265.html
Copyright © 2011-2022 走看看