基础版可参考文章:快递e栈(控制台简易版)——最最最基础
二维数组储存版可参考文章: 快递e栈(控制台简易版)——异常处理
集合存储版可参考文章:快递e栈(控制台简易版)——集合
快递E栈(控制台简易版)——IO流
考察内容:面向对象 + 集合 + IO流的使用 (序列化与反序列化)
本文仅仅是基于上个版本集合修改的代码,并非全部代码,如有需求请参考集合篇。
本节任务用于熟悉快递管理业务,完成快递管理控制台项目,具体需求如图。
任务过程
-
明确需求,可以基于上次快递 e 栈集合版进行修改
-
程序一开始运行,就需要将封装有快递的集合,保存到磁盘中,后续所有的操作都需要从磁盘中反序列化的方式读取到内存
-
在每个逻辑方法中,用户每次操作完集合后,要及时再次序列化到磁盘中,保证磁盘中的序列化文件内容始终是最新的。
项目模块分析如图
基于上一个集合版本的改动:新添加的util包,里面是一个读写文件的类,利用序列化与反序列化。
IOUtil
import java.io.*;
//用于读写文件的类
public class IOUtil {
/**
* 读取数据
* @param fileName 文件名
* @return ois.readObject()
* @throws ClassNotFoundException
* @throws IOException
*/
public static Object readFile(String fileName) throws ClassNotFoundException, IOException {
FileInputStream fis = new FileInputStream(fileName);
ObjectInputStream ois = new ObjectInputStream(fis);
return ois.readObject();
}
/**
* 写入数据
* @param obj
* @param fileName
* @throws IOException
*/
public static void writeFile(Object obj,String fileName) throws IOException {
FileOutputStream fos = new FileOutputStream(fileName);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
}
}
涉及到文件读写,所以我们需要在数据存取的Dao层添加一些代码。
ExpressDao
//将同一包下的子包中的类导入进来,这两行代码需自行导包,不能直接复制
import mission.demo04.express.Express;
import mission.demo04.util.IOUtil;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.Random;
import java.util.TreeMap;
//数据存取的dao层
public class ExpressDao {
private static final String FILE_NAME = "express.txt";//将文件名设置为 express.txt
static Map<String, Express> expressMap = new TreeMap<>();//key为快递单号,value为快递信息
//初始化快递柜,默认添加几个快递
public ExpressDao() {
expressMap.put("1001",new Express("1001","中通快递",123456,1,3));
expressMap.put("1002",new Express("1002","圆通快递",456789,2,7));
expressMap.put("1003",new Express("1003","顺丰速递",123789,6,2));
}
/**
* 初始化数据
* 如果文件不存在,则创建文件
* 如果文件存在,则初始化,从文件中读入数据
*/
static{
File file = new File(FILE_NAME);
if(!file.exists()){//如果文件不存在,则创建文件
try {
if(file.createNewFile()){
System.out.println("文件创建成功!");
}
} catch (IOException e) {
System.out.println(e.getMessage());
}
}else{
try {
Object obj = IOUtil.readFile(FILE_NAME);//读取
if(obj != null && obj instanceof Map){//如果对象不为空,并且是Map集合
expressMap = (Map<String, Express>) obj;
}
} catch (IOException e) {
System.out.println(e.getMessage());
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
}
}
/**
* 添加快递
* @param express
* @return express
*/
public static Express add(Express express){
Random random = new Random();
if(expressMap.size() == 100){
try {
throw new Exception("快递柜已满!不能放入快递了!");
} catch (Exception e) {
e.printStackTrace();
}
}
int x,y;
do{
x = random.nextInt(10);
y = random.nextInt(10);
}while(isExist(x,y));
int code;
do{
code = random.nextInt(100000)+900000;
}while(isExistCode(code));
express.setCode(code);
express.setX(x);
express.setY(y);
expressMap.put(express.getNumber(),express);
try {
IOUtil.writeFile(expressMap,FILE_NAME);
} catch (IOException e) {
e.printStackTrace();
}
return express;
}
/**
* 判断快递柜是否已存在快递
* @param x
* @param y
* @return true/false
*/
public static boolean isExist(int x, int y){
for(Express express : expressMap.values()){
if(express.getX() == x && express.getY() == y){
return true;
}
}
return false;
}
/**
* 判断取件码是否已经存在
* @param code
* @return true/false
*/
public static boolean isExistCode(int code){
for(Express express : expressMap.values()){
if(express.getCode() == code){
return true;
}
}
return false;
}
/**
* 根据快递单号查找快递,返回快递对象
* @param number
* @return express/null
*/
public Express findExpressByNumber(String number){
for(Express express : expressMap.values()){
if(express.getNumber().equals(number)){
return express;
}
}
return null;
}
/**
* 根据快递单号查找快递,如果不存在返回-1
* @param number
* @return 1/-1
*/
public static int findExpressIsExist(String number){
for(Express express:expressMap.values()){
if(express.getNumber().equals(number)){
return 1;
}
}
return -1;
}
/**
* 根据快递单号删除快递
* @param number
* @return true
*/
public static boolean delete(String number) {
expressMap.remove(number);
try {
IOUtil.writeFile(expressMap,FILE_NAME);
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
/**
* 修改快递信息
* @param number
* @param newExpress
*/
public static void updateExpress(String number, Express newExpress) {
Express oldExpress = expressMap.get(number);//获取旧的快递信息
oldExpress.setCompany(newExpress.getCompany());
oldExpress.setNumber(newExpress.getNumber());
try {
IOUtil.writeFile(expressMap,FILE_NAME);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取所有的快递信息
* @return expressMap
*/
public Map<String, Express> getExpressMap(){
return expressMap;
}
/**
* 通过取件码查询是否存在
* @param code
* @return express/null
*/
public static Express findByExpressCode(int code){
Express e = new Express();
e.setCode(code);
for(Express express : expressMap.values()){
if(express.getCode() == code){
return express;
}
}
return null;
}
}