快递e栈(控制台简易版)——IO流

基础版可参考文章:快递e栈(控制台简易版)——最最最基础

二维数组储存版可参考文章: 快递e栈(控制台简易版)——异常处理

集合存储版可参考文章:快递e栈(控制台简易版)——集合

快递E栈(控制台简易版)——IO流

考察内容:面向对象 + 集合 + IO流的使用 (序列化与反序列化)

本文仅仅是基于上个版本集合修改的代码,并非全部代码,如有需求请参考集合篇。

本节任务用于熟悉快递管理业务,完成快递管理控制台项目,具体需求如图。
在这里插入图片描述

任务过程

  1. 明确需求,可以基于上次快递 e 栈集合版进行修改

  2. 程序一开始运行,就需要将封装有快递的集合,保存到磁盘中,后续所有的操作都需要从磁盘中反序列化的方式读取到内存

  3. 在每个逻辑方法中,用户每次操作完集合后,要及时再次序列化到磁盘中,保证磁盘中的序列化文件内容始终是最新的。

项目模块分析如图

在这里插入图片描述

基于上一个集合版本的改动:新添加的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;
    }
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小成同学_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值