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

news2024/7/4 6:12:34
  • 以下内容本人都是在 Maven 工程下总结的
  1. 需求介绍
  2. 显示主菜单
  3. 让程序无线运行下去
  4. 加载数据
  5. 显示库存列表
  6. 根据名称查找特定库存记录
  7. 添加库存记录
  8. 查看_下架_退出功能实现
  9. 持久化数据
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;
    }
}
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();
    }
}
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("谢谢使用!再见!");
    }
}

  • 需求介绍 

 

================欢迎使用水果库存系统===================
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
谢谢使用!再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1125571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统可靠性分析与设计

系统可靠性分析与设计 内容提要 可靠性相关概念 骚戴理解&#xff1a;计算机系统的可靠性和可用性不是完全相同的概念&#xff0c;尽管它们在某些方面有重叠之处。 可靠性指的是计算机系统在特定时间段内正常运行的能力&#xff0c;即系统在面对各种故障或意外情况时能够继续…

“第四十八天” 计算机组成原理

数据结构学完了&#xff0c;不过也就是匆匆过了一遍&#xff0c;后面肯定还是要重来的。现在开始学机组了。 计算机发展历程&#xff1a; 计算机硬件唯一能识别的数据是二进制的 0/1&#xff0c;而在计算机中用低/高电平表示 0 / 1&#xff0c;也就是通过电信号传递数据&#x…

Tecplot绘制三维彩色流线

文章目录 1234 1 2 需要选取合适的截面 3 4 用温度云图对流线进行染色

07、Python -- 序列相关函数与封包解包

目录 使用函数字符串也能比较大小序列封包序列解包多变量同时赋值 最大值、最小值、长度 序列解包与封包 使用函数 len()、max()、min() 函数可获取元组、列表的长度、最大值和最小值。 字符串也能比较大小 字符串比较大小时&#xff0c;将会依次按字符串中每个字符对应的编…

KSD1-16 KSD1-32 KUKA 与人工智能和机器人合作

KSD1-16 KSD1-32 KUKA 与人工智能和机器人合作 人工智能(AI)和机器人技术是每个行业越来越多的话题&#xff0c;特别是围绕它们如何简化流程和实践。这过去十年&#xff0c;英国人工智能公司的数量增加了688%虽然这项技术的进步令许多人兴奋&#xff0c;但也有一些神话让许多…

开发趋势 Java Lambda 表达式 第二篇

开发趋势 Java Lambda 表达式 第二篇 Lambda 的发展史 Java Lambda 表达式是在 Java 8 版本中引入的重要特性&#xff0c;它描述了一种更简洁、更灵活的方式来处理函数式编程。 在 Java 8 之前&#xff0c;要实现函数式编程&#xff0c;需要通过匿名类实现接口的方式。这样的…

代码随想录算法训练营第三十一天 | LeetCode 455. 分发饼干、376. 摆动序列、53. 最大子数组和

代码随想录算法训练营第三十一天 | LeetCode 455. 分发饼干、376. 摆动序列、53. 最大子数组和 文章链接&#xff1a;分发饼干 摆动序列 最大子数组和 视频链接&#xff1a;分发饼干 摆动序列 最大子数组和 目录 代码随想录算法训练营第三十一天 …

第三章 C++的循环结构

系列文章目录 第一章 C的输入第二章 C的输出 文章目录 系列文章目录前言一、个人名片二、while三、do-while四、for总结 前言 今天来学循环结构&#xff01; 一、个人名片 个人主页&#xff1a;睡觉觉觉得 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评…

怎样正确进行全链路压测?

全链路压测是确保软件系统稳健性和性能的关键一环。通过全面评估整个系统的性能&#xff0c;并在生产环境之前发现和解决问题&#xff0c;可以提高系统的可用性、用户满意度&#xff0c;并降低潜在的风险。本文将介绍怎样正确进行全链路压测! 确定测试目标&#xff1a;首先&…

异步编程详解(.NET)

在之前写的一篇关于async和await的前世今生的文章之后&#xff0c;大家似乎在async和await提高网站处理能力方面还有一些疑问&#xff0c;很多网站本身也做了不少的尝试。今天我们再来回答一下这个问题&#xff0c;同时我会做一个async和await在WinForm中的尝试&#xff0c;并且…

hackmyvm之gift

hackmyvm是一个平台&#xff0c;包含了大量靶机&#xff0c;类似于vulnhub、hackthebox等平台&#xff0c;你可以在上面下载靶机&#xff0c;进行渗透测试练习&#xff0c;非常适合热爱黑客技术或从事渗透测试的人员。 &#xff08;这段解释参考这篇文章&#xff09; 下载安装…

一键运行大语言模型服务,搭建聊天应用

前言 本文介绍一个可以快速搭建本地大语言模型的聊天服务&#xff0c;模型和代码已全部提供&#xff0c;不需要联网运行。项目使用的是Qwen-7B-Int4模型&#xff0c;只需要8G显存的显卡都能流畅运行&#xff0c;无论是Windows还是Linux系统都支持使用。 安装环境 安装GPU版本…

PyTorch 与 TensorFlow:机器学习框架之战

深度学习框架是简化人工神经网络 (ANN) 开发的重要工具&#xff0c;并且其发展非常迅速。其中&#xff0c;TensorFlow 和 PyTorch 脱颖而出&#xff0c;各自在不同的机器学习领域占有一席之地。但如何为特定项目确定理想的工具呢&#xff1f;本综合指南[1]旨在阐明它们的优点和…

基于粒子群算法的无人机航迹规划-附代码

基于粒子群算法的无人机航迹规划 文章目录 基于粒子群算法的无人机航迹规划1.粒子群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用粒子群算法来优化无人机航迹规划。 1.粒子群…

电脑软件:推荐一款非常强大的pdf阅读编辑软件

目录 一、软件简介 二、功能介绍 1、界面美观&#xff0c;打开速度快 2、可直接编辑pdf 3、非常强大好用的注释功能 4、很好用的页面组织和提取功能 5、PDF转word效果非常棒 6、强大的OCR功能 三、软件特色 四、软件下载 pdf是日常办公非常常见的文档格式&#xff0c;…

WPF Material Design UI框架

前言 Material Design in xaml 是开源免费的ui框架&#xff0c;工控软件主打的就是简单界面。 以下简称MD 相关资源 MaterialDesignInXamlToolkit Github 地址 MD 快速启动 MD 案例压缩包 MD 框架使用 启动环境配置 安装Nuget包 App.xaml 配置 <Application x:Class&qu…

利用dns协议发起ddos反射攻击

利用DNS服务器发起反射型DDOS&#xff0c;攻击带宽 基本思路&#xff1a; 1、利用any类型的dns查询&#xff0c;可完成发送少量请求数据&#xff0c;获得大量返回数据。 2、将原请求地址改为受害者地址&#xff0c;则dns会向受害者返回大量数据&#xff0c;占用带宽 警告&…

计算机网络之数据链路层

[复习提示] 王道&#xff1a;本章是历年考试中考查的重点。要求在了解数据链路层基本概念和功能的基础上&#xff0c;重点掌握滑动窗口机制、三种可靠传输协议、各种MAC协议、HDLC协议和PPP协议&#xff0c;特别是CSMA/CD协议和以太网帧格式&#xff0c;以及局域网的争用期和最…

现代C++、STL、QTL的使用

0、现代C中最重要的是&#xff1a; 右值引用、移动语义、完美转发、万能引用 1、std::vector、QVector 2、std::list、QList 3、std::map、QMap 4、std::multimap、QMultiMap 5、std::tuple &#xff08;1&#xff09;创建&#xff1a; std::tuple<T1, T2, TN>…

7.21 SpringBoot项目实战【图书借阅】并发最佳实践:细粒度Key锁、数据库乐观锁、synchronized、ReentrantLock

文章目录 前言一、编写服务层二、编写控制器三、并发实战1. synchronized关键字2. Lock 接口3. Atomic类4. 细粒度Key锁5. 数据库乐观锁6. 最终service完整代码 最后 前言 上文的产品设计流程&#xff1a;查看图书列表 7.3 实现-》查看图书详情上文7.20 -》图书借阅(本文)。 就…