使用IO流完成项目实战水果库存系统

  • 以下内容本人都是在 Maven 工程下总结的
  1. 需求介绍
  2. 显示主菜单
  3. 让程序无线运行下去
  4. 加载数据
  5. 显示库存列表
  6. 根据名称查找特定库存记录
  7. 添加库存记录
  8. 查看_下架_退出功能实现
  9. 持久化数据 / 钝化:将 内存 里的数据持久化存储到 硬盘 IO流
java 复制代码
package com.csdn.fruit.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Fruit {
    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;
    }
}
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 e) {
            throw new RuntimeException(e);
        }
    }

    //加载数据
    public void loadData() throws IOException {
        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);
            }
        }
    }

    //显示主菜单
    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-IO/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();
    }
}
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("谢谢使用!再见!");
    }
}
  • 需求介绍
java 复制代码
================欢迎使用水果库存系统===================
1.显示库存列表
2.添加库存记录
3.查看特定库存
4.水果下架
5.退出
====================================================
请选择:1
----------------------------------------------------
名称         单价          库存           备注
苹果         5            100            苹果很好吃
菠萝         3            150            菠萝很好吃
榴莲         4            200            榴莲很好吃
----------------------------------------------------
================欢迎使用水果库存系统===================
1.显示库存列表
2.添加库存记录
3.查看特定库存
4.水果下架
5.退出
====================================================
请选择:1
----------------------------------------------------
名称         单价          库存           备注
对不起,库存为空!
----------------------------------------------------
================欢迎使用水果库存系统===================
1.显示库存列表
2.添加库存记录
3.查看特定库存
4.水果下架
5.退出
====================================================
请选择:2
请输入水果名称:苹果
请输入追加的库存量:30
添加成功!
================欢迎使用水果库存系统===================
1.显示库存列表
2.添加库存记录
3.查看特定库存
4.水果下架
5.退出
====================================================
请选择:1
----------------------------------------------------
名称         单价          库存           备注
苹果         5            130            苹果很好吃
菠萝         3            150            菠萝很好吃
榴莲         4            200            榴莲很好吃
----------------------------------------------------
================欢迎使用水果库存系统===================
1.显示库存列表
2.添加库存记录
3.查看特定库存
4.水果下架
5.退出
====================================================
请选择:2
请输入水果名称:西瓜
请输入水果单价:6
请输入水果库存:120
请输入水果备注:西瓜很好吃!
添加成功!
================欢迎使用水果库存系统===================
1.显示库存列表
2.添加库存记录
3.查看特定库存
4.水果下架
5.退出
====================================================
请选择:1
----------------------------------------------------
名称         单价          库存           备注
苹果         5            130            苹果很好吃
菠萝         3            150            菠萝很好吃
榴莲         4            200            榴莲很好吃
西瓜         6            120            西瓜很好吃
----------------------------------------------------
================欢迎使用水果库存系统===================
1.显示库存列表
2.添加库存记录
3.查看特定库存
4.水果下架
5.退出
====================================================
请选择:3
请输入水果名称:榴莲
----------------------------------------------------
名称         单价          库存           备注
榴莲         4            200            榴莲很好吃
----------------------------------------------------
================欢迎使用水果库存系统===================
1.显示库存列表
2.添加库存记录
3.查看特定库存
4.水果下架
5.退出
====================================================
请选择:3
请输入水果名称:橙子
对不起,没有找到对应的库存记录!
================欢迎使用水果库存系统===================
1.显示库存列表
2.添加库存记录
3.查看特定库存
4.水果下架
5.退出
====================================================
请选择:4
请输入水果名称:橙子
对不起,没有找到需要下架的库存记录!
================欢迎使用水果库存系统===================
1.显示库存列表
2.添加库存记录
3.查看特定库存
4.水果下架
5.退出
====================================================
请选择:4
请输入水果名称:西瓜
是否确认下架?(Y/N)  Y
下架成功!
================欢迎使用水果库存系统===================
1.显示库存列表
2.添加库存记录
3.查看特定库存
4.水果下架
5.退出
====================================================
请选择:1
----------------------------------------------------
名称         单价          库存           备注
苹果         5            130            苹果很好吃
菠萝         3            150            菠萝很好吃
榴莲         4            200            榴莲很好吃
----------------------------------------------------
================欢迎使用水果库存系统===================
1.显示库存列表
2.添加库存记录
3.查看特定库存
4.水果下架
5.退出
====================================================
请选择:5
是否确认退出?(Y/N) Y
谢谢使用!再见!
相关推荐
Data_Journal8 分钟前
使用 AutoScraper 进行网页抓取:分步教程
大数据·开发语言·数据库·python·scrapy
yume_sibai24 分钟前
12-Rust 性能优化指南(性能分析 + 内存优化 + SIMD + 并发优化 + 编译器优化 + 基准测试)
开发语言·性能优化·rust
SL_staff32 分钟前
插单风险的数据闭环治理:JVS-BI 在制造业实时预警中的技术实践
java·数据分析·数据可视化
萧瑟余晖36 分钟前
Hibernate 核心原理与架构详解
开发语言·架构·hibernate
爱喝水的鱼丶36 分钟前
SAP-ABAP:SAP MM 模块物料主数据批量导入与增强开发:字段扩展、校验逻辑与批量导入工具开发
开发语言·性能优化·sap·abap·增强·经验交流·mm
geovindu41 分钟前
rust:Builder Pattern
开发语言·设计模式·rust·建造者模式
白远山1 小时前
健身场馆无人自动化解决方案:从架构到落地实践
java·开发语言·数据库·数据挖掘·需求分析
user_admin_god1 小时前
第 01 篇:OpenAI 兼容 API 初探 —— 用 curl 跑通第一次对话
java·人工智能·spring boot·语言模型·devops
曹牧1 小时前
PostMan:400 Bad Request‌
java
devpotato1 小时前
RPO与RTO:容灾的两个关键指标
java·后端