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、用户基本描述类:
package zl_login_regist;
/**
* 这是用户的基本描述类
* @author LZL
*
*/
public class User { private String username;
private String password; public User() { } public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}
2、用户操作接口:
package zl_login_regist;
/**
* 这是用户注册、登陆的接口
* @author LZL
*
*/
public interface UserDao {
/**
* 用户进行登陆操作
* @param username 用户的登录名
* @param password 用户的密码
* @return 是否登陆成功
*/ public abstract boolean isLogin(String username,String password);
/**
* 用户进行注册操作
* @param user 用户注册时填写的信息
*/
public abstract void regist(User user);
}
3、用户操作的具体实现类(IO流)继承用户操作接口
package zl_login_regist; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; /**
* 这是用户进行登陆、注册操作的实现类(IO版)
*
* @author LZL
*/
public class UserDaoImpl implements UserDao { // 为了保证User.txt这个文件在程序运行后就存在,用静态定义该对象
private static File file = new File("User.txt"); // 创建文件,静态。依旧时为了程序运行后就能创建该文件
static {
try {
file.createNewFile();
} catch (IOException e) {
System.out.println("创建用户文件失败");
// e.printStackTrace();
}
} public boolean isLogin(String username, String password) {
boolean flag = false;
BufferedReader br = null;
// 从User.txt文件中读取数据,缓冲字符输入流,并拿用户输入的用户名和密码与之进行对比
try {
br = new BufferedReader(new FileReader(file));
String line = null;
try {
while ((line = br.readLine()) != null) {
// 把读取到的字符串“xxx,---,bbb”剪切成“xxx,bbb”
String[] result = line.split("-");
if (result[0].equals(username)
&& result[1].equals(password)) {
flag = true;// 用户密码都正确,则true
break;
}
}
} catch (IOException e) {
System.out.println("用户登录失败");
e.printStackTrace();
}
} catch (FileNotFoundException e) {
System.out.println("找不到用户的资料文件");
// e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
System.out.println("用户注册释放资源失败");
// e.printStackTrace();
}
}
}
return flag;
} public void regist(User user) {
// 写入字符,缓冲字符输出流,并且是可以追加数据的,不然前面的数据会被后面加入的数据给替代掉
// 在这里不能抛异常,因为如果抛了,那么用户操作类就得改
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(file, true));
// 写入用户的数据 用---隔开,是为了登陆操作更方便进行数据对比
bw.write(user.getUsername() + "-" + user.getPassword());
bw.newLine();
bw.flush();
} catch (IOException e) {
System.out.println("用户注册失败");
// e.printStackTrace();
} finally {
if (bw != null) {
try {
bw.close();
} catch (IOException e) { System.out.println("用户注册释放资源失败");
// e.printStackTrace();
}
}
}
} }
4、超级小游戏类。。这玩意算游戏么
package zl_login_regist; import java.util.Scanner; /**
* 这是猜数字小游戏
* @author LZL
*/
public class GuessNumber {
private GuessNumber() {
} public static void start() {
// 产生一个随机数
int number = (int) (Math.random() * 100) + 1; // 定义一个统计变量
int count = 0; while (true) {
// 键盘录入一个数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入数据(1-100):");
int guessNumber = sc.nextInt(); count++; // 判断
if (guessNumber > number) {
System.out.println("你猜的数据" + guessNumber + "大了");
} else if (guessNumber < number) {
System.out.println("你猜的数据" + guessNumber + "小了");
} else {
System.out.println("恭喜你," + count + "次就猜中了");
break;
}
}
}
}
5、用户的测试类
package zl_login_regist; import java.util.Scanner; /**
* 用户测试类
*
* @author LZL
*
*/
public class UserTest {
public static void main(String[] args) {
// 为了能够回来
while (true) {
// 欢迎界面,给出选择项
System.out.println("--------------欢迎光临--------------");
System.out.println("1 登录");
System.out.println("2 注册");
System.out.println("3 退出");
System.out.println("请输入你的选择:");
// 键盘录入选择,根据选择做不同的操作
Scanner sc = new Scanner(System.in);
// 为了后面的录入信息的方便,我所有的数据录入全部用字符接收
String choiceString = sc.nextLine(); // switch语句的多个地方要使用,我就定义到外面
UserDao ud = new UserDaoImpl(); // 经过简单的思考,我选择了switch
switch (choiceString) {
case "1":
// 登录界面,请输入用户名和密码
System.out.println("--------------登录界面--------------");
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine(); // 调用登录功能
// UserDao ud = new UserDaomImpl(); boolean flag = ud.isLogin(username, password);
if (flag) {
System.out.println("登录成功,可以开始玩游戏了"); System.out.println("你玩吗?y/n");
while (true) {
String resultString = sc.nextLine();
if (resultString.equalsIgnoreCase("y")) {
// 玩游戏
GuessNumber.start();
System.out.println("你还玩吗?y/n");
} else {
break;
}
}
System.out.println("谢谢使用,欢迎下次再来");
System.exit(0);
// break; //这里写break,结束的是switch
} else {
System.out.println("用户名或者密码有误,登录失败");
}
break;
case "2":
// 欢迎界面,请输入用户名和密码
System.out.println("--------------注册界面--------------");
System.out.println("请输入用户名:");
String newUsername = sc.nextLine();
System.out.println("请输入密码:");
String newPassword = sc.nextLine(); // 把用户名和密码封装到一个对象中
User user = new User();
user.setUsername(newUsername);
user.setPassword(newPassword); // 调用注册功能
// 多态
// UserDao ud = new UserDaoImpl();
// 具体类使用
// UserDaoImpl udi = new UserDaoImpl(); ud.regist(user);
System.out.println("注册成功");
break;
case "3":
default:
System.out.println("谢谢使用,欢迎下次再来");
System.exit(0);
break;
}
}
}
}
IO流的练习 —— 创建用户注册、登陆案例的更多相关文章
- IO流基础,创建File对象与方法是用
1.io流主要用途读取本地文件或服务器文件,进行本地或者服务器开呗工作 构造函数 绝对路径够构造方法: File f = new File("D:\\test\\a.txt&quo ...
- IO流实现GBK写入文件然后转换UTF-8
public static void main(String[] args) throws IOException { File file = new File("olol\\a.txt&q ...
- IO流 简介 总结 API 案例 MD
目录 IO 流 简介 关闭流的正确方式 关闭流的封装方法 InputStream 转 String 的方式 转换流 InputStreamReader OutputStreamWriter 测试代码 ...
- File类的特点?如何创建File类对象?Java中如何操作文件内容,什么是Io流Io流如何读取和写入文件?字节缓冲流使用原则?
重难点提示 学习目标 1.能够了解File类的特点(存在的意义,构造方法,常见方法) 2.能够了解什么是IO流以及分类(IO流的概述以及分类) 3.能够掌握字节输出流的使用(继承体系结构介绍以及常见的 ...
- Java(36)IO流案例与总结
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228455.html 博客主页:https://www.cnblogs.com/testero ...
- 二十一、Java基础--------IO流之综合案例分析
前三篇文章详细介绍了IO流体系所涉及的重点内容,为了帮助理解与学习,本片博客主要是分析一个与IO操作相关的题目. 例1:在我们观看视频时经常要关注的就是视频的时间长度,在学习了IO操作之后,就可以自己 ...
- java io流 创建文件、写入数据、设置输出位置
java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; ...
- 使用IO流创建文件并写入数据
/* 字符流和字节流: 字节流两个基类: InputStream OutputStream 字符流两个基类: Reader Writer 既然IO流是用于操作数据的, 那么数据的最常见体现形式是:文件 ...
- Java基础知识强化之IO流笔记22:FileInputStream / FileOutputStream 复制文本文件案例1
1. 使用字节流FileInputStream / FileOutputStream 复制文本文件案例: 分析: (1)数据源:从哪里来 a.txt -- 读取数据 -- FileInpu ...
随机推荐
- 「C语言」int main还是void main?
从大一入学刚接触C到现在已满7个月了,虽然刚开始就知道```int main```才是标准的写法,但一直没有深刻理解为什么不能用```void main```而必须使用```int main```. ...
- 关于IE处理margin和padding值超出父元素高度的问题
两个div,父div有padding值,子div有margin-top值,浏览器在解析实际父子位置关系时,他们之间的距离是父padding+子margin-top.现在把父div设置固定高度,并有意让 ...
- 浅谈ES6中的Proxy
Proxy是一个很有趣的对象,它能够修改某些操作的默认行为,等同于在语言层面做出修改,属于一种‘元编程’,即对编程语言进行编程. Proxy其实很好理解,就是在目标对象之前架设一层拦截,外界的访问都得 ...
- 关于sap的字段和对象修改记录的查找
sap的字段和对象的修改都会保存旧值,数据保存在CDHDR和CDPOS表中,对于提取旧值你可以采用两种方法 1)使用sap的标准函数CHANGEDOCUMENT_READ_HEADERS 和CHANG ...
- Android-AsyncTask异步任务(获取手机联系人)
本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.Android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有 ...
- 搭建Android 5.0开发环境
1.Android SDK的安装 下载地址:http://developer.android.com/index.html 访问网站的话请自备梯子 选择:adt-bundle-windows-x86_ ...
- 【读书笔记】iOS-内存释放
一,有些编程人员喜欢将内存清理的代码集中组织到函数中的某个地方,而另一些编程人员则喜欢在创建点自动释放对象,以免以后忘记释放这些对象.两种方法都是有效的. 二,id类型表示一个可以指向任何类型的对象的 ...
- iOS 你将会遇到的
1.解释ARC原理,ARC引入之后,iOS增加了几个修饰符,分别是什么?并解释何时应该使用? 2.给你一个可变数组aMutableArray,请写出你认为较好的算法代码. 3.UITableView是 ...
- iOS学习笔记10-UIView动画
上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...
- OC语言-01-面向过程与面向对象思想
一.面向过程 1> 思想 面向过程是一种以过程为中心的最基础编程思想,不支持面向对象的特性. 面向过程是一种模块化程序设计方法 2> 开发方法 面向过程的开发方法是以过程(也可以说是模块) ...