首页 > 代码库 > IO流的练习 —— 创建用户注册、登陆案例
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 LZL15 */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;// 用户密码都正确,则true45 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 // 经过简单的思考,我选择了switch30 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,结束的是switch60 } 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 }
IO流的练习 —— 创建用户注册、登陆案例