使用序列化技术保存数据 改进 IO流完成项目实战水果库存系统

news/2024/5/19 3:41:04 标签: java, 水果系统, IO操作, 反射
  •  上一节内容是 使用IO流完成项目实战水果库存系统
  • https://blog.csdn.net/m0_65152767/article/details/133999972?spm=1001.2014.3001.5501
java">package com.csdn.fruit.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Fruit implements Serializable {
    private String fname;
    private Integer price;
    private Integer fcount;
    private String remark;
    @Override
    public String toString() {
        return fname + "\t\t" + price + "\t\t" + fcount + "\t\t" + remark;
    }
}
  • 只改动 加载数据  保存数据  代码的IO操作,改进成  序列化对象(ObjectOutputStream,ObjectInputStream)知识
  • 参看  https://blog.csdn.net/m0_65152767/article/details/133280223
java">package com.csdn.fruit.view;
import com.csdn.fruit.pojo.Fruit;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.function.Consumer;
import java.util.function.Predicate;
public class Menu {
    Scanner input = new Scanner(System.in);
    List<Fruit> fruitList = new ArrayList<>();
    {
        try {
            loadData();
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
    //加载数据
    public void loadData() throws IOException, ClassNotFoundException {
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("fruit.dat");
        /*if (inputStream != null) {
            //字节流转换成字符流
            //字节流:InputStream    字符流:Reader  字符转换流:InputStreamReader
            BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream));
            String str = null;
            while ((str = bf.readLine()) != null) {
                String[] arr = str.split(" ");
                String fname = arr[0];
                Integer price = Integer.parseInt(arr[1]);
                Integer fcount = Integer.parseInt(arr[2]);
                String remark = arr[3];

                Fruit fruit = new Fruit(fname, price, fcount, remark);

                fruitList.add(fruit);
        }
        }*/
        if (inputStream!=null) {
            ObjectInputStream ois = new ObjectInputStream(inputStream);
            fruitList = (List<Fruit>) ois.readObject();
        }
    }
    //显示主菜单
    public int showMainMenu() {
        System.out.println("================欢迎使用水果库存系统===================");
        System.out.println("1.显示库存列表");
        System.out.println("2.添加库存记录");
        System.out.println("3.查看特定库存");
        System.out.println("4.水果下架");
        System.out.println("5.退出");
        System.out.println("====================================================");
        System.out.print("请选择:");


        return input.nextInt();
    }
    //显示库存列表
    public void showFruitList() {
        System.out.println("----------------------------------------------------");
        System.out.println("名称\t\t单价\t\t库存\t\t备注");
        if (fruitList == null || fruitList.size() <= 0) {
            System.out.println("对不起,库存为空!");
        } else {
            /*fruitList.forEach(new Consumer<Fruit>() {
                @Override
                public void accept(Fruit fruit) {
                    System.out.println(fruit);
                }
            });*/
//            fruitList.forEach(fruit -> System.out.println(fruit));
            fruitList.forEach(System.out::println);
        }
        System.out.println("----------------------------------------------------");
    }
    //根据名称查询指定的库存记录
    public Fruit getFruitByFname(String fname) {
        //判断型接口    有参数,返回值是布尔类型
      /*  fruitList.stream().filter(new Predicate<Fruit>() {
            @Override
            public boolean test(Fruit fruit) {
                return fname.equals(fruit.getFname());
            }
        });*/
        return fruitList.stream().filter(fruit -> fname.equals(fruit.getFname())).findFirst().orElseGet(() -> null);

      /*  for (Fruit fruit : fruitList) {
            if (fname.equals(fruit.getFname())) {
                return fruit;
            }
        }
        return null;*/
    }
    //添加库存记录
    public void addFruit() {
        System.out.print("请输入水果名称:");
        String fname = input.next();

        Fruit fruit = getFruitByFname(fname);

        if (fruit == null) {
            System.out.print("请输入水果单价:");
            Integer price = input.nextInt();
            System.out.print("请输入水果库存:");
            Integer fcount = input.nextInt();
            System.out.print("请输入水果备注:");
            String remark = input.next();

            fruit = new Fruit(fname, price, fcount, remark);
            fruitList.add(fruit);
        } else {
            System.out.print("请输入追加的库存量:");
            Integer fcount = input.nextInt();
            fruit.setFcount(fruit.getFcount() + fcount);
        }
        System.out.println("添加成功!");
    }
    //查看特定库存记录
    public void showFruitInfo() {
        System.out.print("请输入水果名称:");
        String fname = input.next();
        Fruit fruit = getFruitByFname(fname);

        if (fruit == null) {
            System.out.println("对不起,没有找到对应的库存记录!");
        } else {
            System.out.println("----------------------------------------------------");
            System.out.println("名称\t\t单价\t\t库存\t\t备注");
            System.out.println(fruit);
            System.out.println("----------------------------------------------------");
        }
    }
    //水果下架
    public void delFruit() {
        System.out.print("请输入水果名称:");
        String fname = input.next();

        Fruit fruit = getFruitByFname(fname);
        if (fruit == null) {
            System.out.println("对不起,没有找到需要下架的库存记录!");
        } else {
            System.out.print("是否确认下架?(Y/N)");
            String confirm = input.next();
            if ("y".equalsIgnoreCase(confirm)) {
                fruitList.remove(fruit);
            }

        }
    }
    //退出
    public boolean exit() {
        System.out.print("是否确认退出?(Y/N)");
        String confirm = input.next();
        boolean flag= !"y".equalsIgnoreCase(confirm);
        if (!flag) {
            try {
                saveData();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return flag;
    }
    //保存数据
    public void saveData() throws IOException {

//        PrintWriter pw = new PrintWriter(new FileWriter("pro02-fruit-Serializable/src/main/resources/fruit.dat"));

      /*  fruitList.forEach(new Consumer<Fruit>() {
            @Override
            public void accept(Fruit fruit) {
                pw.println(fruit.getFname() + " " + fruit.getPrice() + " " + fruit.getFcount() + " " + fruit.getRemark());
            }
        });*/

       /* fruitList.forEach(fruit -> pw.println(fruit.getFname() + " " + fruit.getPrice() + " " + fruit.getFcount() + " " + fruit.getRemark()));

        pw.flush();*/

        File file = new File("pro02-fruit-Serializable/src/main/resources/fruit.dat");
        System.out.println(file.exists());
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
        oos.writeObject(fruitList);
        oos.flush();
    }
}
java">package com.csdn.fruit.view;
public class Client {
    public static void main(String[] args) {
        Menu m = new Menu();
        boolean flag = true;
        while (flag) {
            int slt = m.showMainMenu();
            switch (slt) {
                case 1:
                    m.showFruitList();
                    break;
                case 2:
                    m.addFruit();
                    break;
                case 3:
                    m.showFruitInfo();
                    break;
                case 4:
                    m.delFruit();
                    break;
                case 5:
                    //方法设计时是否需要返回值,依据是:是否在调用的地方需要留下一些值用于再运算
                    flag = m.exit();
                    break;
                default:
                    System.out.println("你不按套路出牌!");
                    break;
            }
        }
        System.out.println("谢谢使用!再见!");
    }
}


http://www.niftyadmin.cn/n/5115834.html

相关文章

mysql下载和安装,使用

先下载安装 官方下载 已下载备份软件 安装&#xff0c;一路下一步设置环境变量 4. 打开一个cmd&#xff0c;输入mysql -u root -p

微信小程序ios页面没有滚动下拉也会出现黑色背景

问题截图&#xff1a; 查了一下资料说有用一下方法解决的&#xff1a; 整体overflow: hidden&#xff0c;页面的内容将无法滚动&#xff08;试了一下没用&#xff09;&#xff1b;设置 -webkit-overflow-scrolling 和 touch-action 样式属性来禁用页面的拖动和拉拽操作&…

学生成绩管理神器

老师们是否还在为繁琐的成绩查询而烦恼&#xff1f;是否希望有一个简便易用的成绩查询系统&#xff0c;让同学们可以自助查询成绩&#xff1f;那么&#xff0c;这篇文章就是你的救星&#xff01; 让我们一起来认识一下这个成绩查询系统。它是一个基于网页或微信小程序的应用程序…

视觉SLAM十四讲-第三讲三维刚体运动

什么是刚体运动以及三维空间中刚体运动描述方式有哪些&#xff1f; 两个坐标系之间的运动由一个旋转加上一个平移组成&#xff0c;这种运动称为刚体运动。描述三维空间中刚体运动的方式有旋转矩阵、旋转向量、欧拉角、四元数。 请描述左手坐标系和右手坐标系。 大拇指——y …

Docker Swarm 节点维护

Docker Swarm Mode Docker Swarm 集群搭建 Docker Swarm 节点维护 Docker Service 创建 1.角色转换 Swarm 集群中节点的角色只有 manager 与 worker&#xff0c;所以其角色也只是在 manager 与worker 间的转换。即 worker 升级为 manager&#xff0c;或 manager 降级为 worke…

【微服务】Feign 整合 Sentinel,深入探索 Sentinel 的隔离和熔断降级规则,以及授权规则和自定义异常返回结果

文章目录 前言一、Feign 整合 Sentinel1.1 实现步骤1.2 FallbackFactory 示例 二、Sentinel 实现隔离2.1 隔离的实现方法2.2 Sentinel 实现线程隔离示例 三、熔断降级规则3.1 熔断降级原理及其流程3.2 熔断策略 —— 慢调用3.3 熔断策略 —— 异常比例和异常数 四、授权规则4.1…

计算机网络(谢希仁)第八版课后题答案(第一章)

1.计算机网络可以向用户提供哪些服务 连通性:计算机网络使上网用户之间可以交换信息&#xff0c;好像这些用户的计算机都可以彼此直接连通一样。 共享:指资源共享。可以是信息、软件&#xff0c;也可以是硬件共享。 2.试简述分组交换的要点 采用了存储转发技术。把报文(要发…

一文教你学会使用Cron表达式定时备份MySQL数据库

各位小伙伴大家好&#xff0c;今天我就来讲述一下作为一个运维&#xff0c;如何解放自己的双手去让服务器定时备份数据库数据&#xff0c;防止程序操作数据库出现数据丢失。 mysql_dump_script.sh脚本文件 #!/bin/bash#保存备份个数&#xff0c;备份7天数据 number7 #备份保存…