Java-->IO流模拟实现用户登录以及登录信息
--> Test 测试类
package com.dragon.java.hwlogin; import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set; /*
* 模拟用户登陆,并记录登陆日志。
a:根据用户的选择是注册用户还是登陆用户。
b:如果是用户注册把用户注册的用户名和密码保存在文件中,文件可以记录多组用户名和密码。
c:每个用户每登陆一次都生产一个登陆记录,把登陆记录保存在文件中,形成登陆日志。登陆记录格式(用户名, 密码, 登陆时间): ==zhangsan, xxxxx, 2016年8月16日 13:20:20==
d:如果是用Admin管理员的身份登陆的,可以查看所有的用户的登陆记录。否则其他用户只可以查看自己的登陆记录。
*/
public class Test {
static Set<User> set = new HashSet<>(); @SuppressWarnings("resource")
public static void main(String[] args) throws FileNotFoundException {
Scanner scanner = new Scanner(System.in);
AdminUser adminUser = new AdminUser();
User thisUser = null;
// 首先将曾经的用户信息存入集合中
adminUser.splitFile(AdminUser.filePath2, set);
while (true) {
System.out.println("-----欢迎使用xxx系统-----");
System.out.println("1.注册用户 2.登录用户");
System.out.println("3.管理员登录 4.退出");
System.out.println("请输入序号:");
String name = null, password = null;
switch (scanner.nextInt()) {
case 1:
System.out.println("-----用户注册:-----");
System.out.println("请输入用户名:");
name = scanner.next();
System.out.println("请输入密码:");
password = scanner.next();
System.out.println("请确认密码:");
if (!scanner.next().equals(password)) {
System.out.println("两次输入的密码不相同!");
continue;
}
if (set.size() != 0) {
if (adminUser.userExist(name, set) != null) {
System.out.println("该用户已存在!");
break;
} else {
adminUser.userRegister(name, password, set);
}
} else {
adminUser.userRegister(name, password, set);
}
break;
case 2:
System.out.println("-----用户登录:-----");
if (set.size() != 0) {
System.out.println("请输入用户名:");
name = scanner.next();
System.out.println("请输入密码:");
password = scanner.next();
if ((thisUser = adminUser.userExist(name, set)) == null) {
System.out.println("该用户不存在!");
} else if (!password.equals(thisUser.getPassword())) {
System.out.println("密码错误!");
} else {
System.out.println("亲爱的" + thisUser.getName()
+ ",您的登录记录为:");
// 得到所有的用户曾登录信息并与当前用户进行比较
Set<User> setTime = new HashSet<>();
adminUser.splitFile(AdminUser.filePath, setTime);
for (User user : setTime) {
if (thisUser.getName().equals(user.getName())) {
System.out.println(user);
}
}
System.out.println("您现于" + adminUser.loginTime()
+ "登录!");
adminUser.userLogin(name, password,
adminUser.loginTime(), set);
}
} else {
System.out.println("还没有用户注册!");
continue;
}
break;
case 3:
adminUser.readUser();
break;
case 4:
System.out.println("已退出!");
System.exit(0);
default:
System.out.println("输入有误!...");
continue;
}
}
}
}
--> AdminUser 类对用户登录进行控制以及录入信息
package com.dragon.java.hwlogin; import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Set; class AdminUser {
@SuppressWarnings("unused")
private static InputStream in = System.in;
private static PrintStream out = System.out;
private static PrintStream ps = null;
private static BufferedReader br = null;
static String filePath = "D:/workspace/08-16/src/com/dragon/java/hwlogin/login.txt";
static String filePath2 = "D:/workspace/08-16/src/com/dragon/java/hwlogin/users.txt"; /**
* 判断user 是否存在
*
* @param name
* @param set
* @return
*/
public User userExist(String name, Set<User> set) {
for (User user : set) {
if (name.equals(user.getName())) {
return user;
}
}
return null;
} /**
* 用户登录
*
* @param name
* @param password
* @param time
* @param set
*/
public void userLogin(String name, String password, String time,
Set<User> set) {
User user = new User(name, password, time);
writeUser(ps, user, filePath, set);
} /**
* 用户注册
*
* @param name
* @param password
* @param set
*/
public void userRegister(String name, String password, Set<User> set) {
User user = new User(name, password);
writeUser(ps, user, filePath2, set);
} /**
* 登录用的曾登录信息,通过读取当前的系统时间
*
* @return
*/
public String loginTime() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
"yyyy年MM月dd日 hh:mm:ss", Locale.CHINA);
Date date = new Date(System.currentTimeMillis());
String time = simpleDateFormat.format(date); // 当前系统时间
return time;
} /**
* 读取所有用户的登录信息
*/
public void readUser() {
try {
br = new BufferedReader(new FileReader(filePath));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println(e);
} finally {
try {
br.close();
} catch (IOException e) {
System.out.println(e);
}
}
} /**
* 将用户信息(或登录信息)写入到文件中
*
* @param ps
* @param user
* @param file
* @param set
*/
public void writeUser(PrintStream ps, User user, String file, Set<User> set) {
set.add(user);
try {
// FileOutputStream(file,true) --> true表示确认文件追加 --> 即不刷新文件
ps = new PrintStream(new FileOutputStream(file, true), true);
System.setOut(ps);
System.out.println(user);
} catch (FileNotFoundException e) {
System.out.println(e);
} finally {
// 重新设置"标准"输出流到控制台
System.setOut(out);
}
} /**
* 将存储信息的文件分割得到用户数据并存入集合
*
* @param file
* @param set
*/
public void splitFile(String file, Set<User> set) {
try {
br = new BufferedReader(new FileReader(file));
String line = null;
while ((line = br.readLine()) != null) {
String[] strings = line.split(",");
User user = new User(strings[0].substring(11,
strings[0].length()), strings[1].substring(10,
strings[1].length()), strings[2].substring(6,
strings[2].length()));
set.add(user);
}
} catch (IOException e) {
System.out.println(e);
} finally {
try {
br.close();
} catch (IOException e) {
System.out.println(e);
}
}
}
}
--> User 类存放用户的属性
package com.dragon.java.hwlogin;
class User {
private String name;
private String password;
private String time;
User() {
super();
}
User(String name, String password) {
super();
this.name = name;
this.password = password;
}
User(String name, String password, String time) {
this(name, password);
this.time = time;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
@Override
public String toString() {
return "User [name=" + name + ", password=" + password + ", time="
+ time + "]";
}
}
--> 重定向输入输出流之前要先保存系统默认的输入输出流(即System.in 和 System.out),以便恢复...
Java-->IO流模拟实现用户登录以及登录信息的更多相关文章
- JAVA IO流的简单总结+收集日志异常信息
1.字节流: IuputStream 所有字节输出流的超类 . 抽象类 ---- FileInputStream ---- BufferedInputStream:提供数据的读取效率,拓展方法(内部维 ...
- Java:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- Java IO流题库
一. 填空题 Java IO流可以分为 节点流 和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数 ...
- java io流 创建文件、写入数据、设置输出位置
java io流 创建文件 写入数据 改变system.out.print的输出位置 //创建文件 //写入数据 //改变system.out.print的输出位置 import java.io.*; ...
- JAVA.IO流学习笔记
一.java.io 的描述 通过数据流.序列化和文件系统提供系统输入和输出.IO流用来处理设备之间的数据传输 二.流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数 ...
- Java IO流学习总结八:Commons IO 2.5-IOUtils
Java IO流学习总结八:Commons IO 2.5-IOUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/550519 ...
- Java IO 流 -- 设计模式:装饰设计模式
在java IO 流中我们经常看到这样的写法: ObjectOutputStream oos = new ObjectOutputStream( new BufferedOutputStream(ne ...
- java IO流详解
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- Java IO流学习总结
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- 揭开Java IO流中的flush()的神秘面纱
大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...
随机推荐
- HDU 1166 单点更新,区间求和
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 判断数据库内容,在页面显示自定义数据case when
判断数据库内容,在页面显示自定义数据 case when...then ...else...end 比如:数据库内容是这样: 通过sql语句判断,数据库的name字段,内容是月桂的,显示嫦娥,其他的显 ...
- for update造成的Oracle锁表与解锁
我遇到的情况: 当使用select语句查询表时,后面跟着for update , select * from table for update 当修改表中数据,但是没有commit就关掉PL/SQL, ...
- ASP.NET MVC 4使用Bundle的打包压缩JS/CSS
打包(Bundling)及压缩(Minification)指的是将多个js文件或css文件打包成单一文件并压缩的做法,如此可减少浏览器需下载多个文件案才能完成网页显示的延迟感,同时通过移除JS/CSS ...
- (DFS)zoj1008-Gnome Tetravex
现在zoj暂时关了,实际上是在scuoj上做的. 题目地址 看起来题目比较复杂,实际上主要需要思维的是如何恰当的剪枝及合适的DFS角度. 问题等价于将n*n个可能相同的方块放到一个n*n的表中,使满足 ...
- 简易模仿手机拨号盘浮在ListView之上并且展开,折叠效果
2013-12-24 16:56:45 有时候可以看到很多手机会将Call log list和Dailer放在同一个页面中,同时Dialer是可以折叠.打开的,自己做了一个Demo,能实现这种效果,简 ...
- C-指针与引用的区别
1. 指针是一个变量,保存一个地址,指向内存中的一个单元.而引用是一个别名. int a = 1; int* p = &a; int b = 1; int& r = b; 2. 指针可 ...
- Problem C HDU 5224
Description There is a piece of paper in front of Tom, its length and width are integer. Tom knows t ...
- PowerShell工具脚本---按行数切割大文本文件
我编写的PowerShell工具脚本,[按行数切割大(文本)文件],生成n个小文件. 主要目的是为了能够让excel快速处理.或用脚本并发处理文本. 注意: 1 如果有必要,你可以先用其他工具,把大文 ...
- PDF创建及动态转换控件程序包ActivePDF Portfolio
ActivePDF Portfolio是将4个activePDF最优秀的服务器产品捆绑成一个价格适中的控件程序包.它提供了开发一个完整的服务器端的PDF解决方案所需的一切. 具体功能: activeP ...