面向对象,接口,Java序列化,HashMap,IO流,最重要的是锻炼自顶向下逐步细化的思想。
package cn.jixiang.front.menu;
public class BootStrap {
public static void main(String[] args) {
System.out.println("欢迎来到吉祥自动售货系统,请选择:");
FrontMenu.showFirstLevelMeun();
}
}
package cn.jixiang.front.menu;
import java.util.Scanner;
import cn.jixiang.front.service.UserService;
import cn.jixiang.front.service.UserServiceImp;
public class FrontMenu {
public static void showFirstLevelMeun() {
UserService userService = new UserServiceImp();
System.out.println("1、注册 2、登录");
Scanner sc = new Scanner(System.in);
String select = sc.nextLine();
//注册
if(select.equals("1")) {
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
System.out.println("请再次输入密码:");
String password2 = sc.nextLine();
if(password.equals(password2)) {
boolean isExists = userService.isExists(username);
if(isExists) {
System.out.println("此用户名已存在");
showFirstLevelMeun();
}else {
System.out.println("请输入地址:");
String address = sc.nextLine();
userService.regist(username,password,address);
}
}else {
System.out.println("您输入的密码不一致");
showFirstLevelMeun();
}
}else if(select.equals("2")) {
//登录
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
boolean success = userService.login(username,password);
if(success) {
System.out.println("登录成功");
}else {
System.out.println("用户名或者密码错误");
showFirstLevelMeun();
}
}else {
System.out.println("您输入的选项不正确");
showFirstLevelMeun();
}
}
}
通过接口的方法,定义抽象类。
此处体现了接口使用的意义所在,先定义后实现。先定义承上,后实现启下。体现了程序自顶向下的特点。接口就像连接上下层的一条具有固定规格的管子。
package cn.jixiang.front.service;
public interface UserService {
/**
* 判断用户名是否已经存在
* @param username
* @return
*/
boolean isExists(String username);
/**
* 注册一个用户
* @param username
* @param password
*/
void regist(String username, String password,String address);
/**
* 登录
* @param username
* @param password
* @return
*/
boolean login(String username, String password);
}
package cn.jixiang.front.service;
import java.util.HashMap;
import cn.jixiang.front.dao.UserDao;
import cn.jixiang.front.dao.UserDaoImp;
import cn.jixiang.front.menu.FrontMenu;
import cn.jixiang.product.User;
public class UserServiceImp implements UserService{
UserDao userdao = new UserDaoImp();
/**
* 判断用户名是否存在
*/
@Override
public boolean isExists(String username) {
HashMap userMap = userdao.loadUserData();
return userMap.containsKey(username);
}
/**
* 注册
*/
@Override
public void regist(String username, String password,String address) {
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setAddress(address);
//调用dao将user数据添加到hashmap中
HashMap userMap = userdao.loadUserData();
// HashMap userMap = new HashMap<>();
//将新用户对象添加到userMap中
userMap.put(user.getUsername(), user);
//调用dao将添加后usermap保存到数据文件中
userdao.saveUserData(userMap);
System.out.println("注册成功");
FrontMenu.showFirstLevelMeun();
}
/**
* 登录
*/
@Override
public boolean login(String username, String password) {
//调用dao将user数据添加到hashmap中
HashMap userMap = userdao.loadUserData();
if(userMap.containsKey(username)) {
User user = userMap.get(username);
if(user.getPassword().equals(password)) {
return true;
}else {
return false;
}
}else {
return false;
}
}
}
由于是纯javaSE故不适用数据库,而使用java中的序列化和反序列化来实现。
package cn.jixiang.front.dao;
import java.util.HashMap;
import cn.jixiang.product.User;
public interface UserDao {
/**
* 将数据文件中得数据读取到hashmap中
* @return
*/
HashMap loadUserData();
/**
* 将hashmap中的数据保存到数据文件中
* @param userMap
*/
void saveUserData(HashMap userMap);
}
package cn.jixiang.front.dao;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
import cn.jixiang.product.User;
public class UserDaoImp implements UserDao{
/**
* 将hashMap中的数据保存到用户数据文件中
*/
@Override
public HashMap loadUserData() {
File file = new File("D:/abc/user.data");
try {
if(!file.exists()) {
HashMap userMap = new HashMap();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(userMap);
oos.close();
return userMap;
}
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
HashMap userMap = (HashMap)ois.readObject();
ois.close();
return userMap;
} catch (Exception e) {
System.out.println("文件里没有对象");
e.printStackTrace();
}
System.out.println(3);
return null;
}
/**
* 将hashMap中的数据保存文件中
*/
@Override
public void saveUserData(HashMap userMap) {
//
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/abc/user.data"));
oos.writeObject(userMap);
//oos.flush();
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package cn.jixiang.product;
import java.io.Serializable;
/**
* 用户类
* @author 吉祥
*
*/
public class User implements Serializable{
private String username;
private String password;
private String address;
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
1.进行序列化的对象必须要实现Serializable接口
2.IO流的关流操作
3.HashMap的与序列化的相互转化细节,容易出现空指针异常
- - -解决办法是: 记住关流操作,从文件不存在时,返回的HashMap是不是新定义的HashMap,当文件不存在时,返回的HashMap是不是从文件中读取到的HashMap。