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

  • 以下内容本人都是在 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;@Overridepublic 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  字符转换流:InputStreamReaderBufferedReader 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>() {@Overridepublic 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>() {@Overridepublic 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>() {@Overridepublic 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.mzph.cn/news/116043.shtml

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

相关文章

Http长连接同一个socket多个请求和响应如何保证一一对应?

HTTP/2引入二进制数据帧和流的概念&#xff0c;其中帧对数据进行顺序标识&#xff0c;如下图所示&#xff0c;这样浏览器收到数据之后&#xff0c;就可以按照序列对数据进行合并&#xff0c;而不会出现合并后数据错乱的情况。同样是因为有了序列&#xff0c;服务器就可以并行的…

使用Packstack安装器安装一体化OpenStack云平台

【实训目的】 初步掌握OpenStack快捷安装的方法。掌握OpenStack图形界面的基本操作。 【实训准备】 &#xff08;1&#xff09;准备一台能够安装OpenStack的实验用计算机&#xff0c;建议使用VMware虚拟机。 &#xff08;2&#xff09;该计算机应安装CentOS 7&#xff0c;建…

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

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

数据结构中的七大排序(Java实现)

目录 一、直接插入排序 二、希尔排序 三、直接选择排序 四、堆排序 五、冒泡排序 六、快速排序 七、归并排序 一、直接插入排序 思想&#xff1a; 定义i下标之前的元素全部已经有序&#xff0c;遍历一遍要排序的数组&#xff0c;把i下标前的元素全部进行排序&#xff0…

ArGIS Engine专题(15)之GP模型在地图服务与地图服务之间实现叠置分析

前一篇文章已经介绍过导入要素范围与地图服务的叠加分析,相当于单要素与多要素之间的分析,这篇文章介绍地图服务与地图服务之间的叠加分析,即是多要素有多要素之间的相交分析,功能基本类似。 一、结果预览 二、需求简介 以下是一些常见的业务场景: (1)空间规划和土地…

C#中ManualResetEvent 和 ManualResetEventSlim的使用

从 .NET Framework 版本2.0 开始&#xff0c; ManualResetEvent 派生自 EventWaitHandle 类。 在 ManualResetEvent 功能上等效于EventWaitHandle 使用创建的EventResetMode.ManualReset。ManualResetEventSlim用于实现更好的性能 ManualResetEvent。以下介绍.NET(C#)中ManualR…

导航守卫和拦截器

导航守卫 1.全局守卫 &#xff1a; 全局前置守卫&#xff08;beforeEach&#xff09;&#xff0c;分别有三个参数to,form,next 使用场景&#xff1a;全局前置守卫是最常用的导航守卫&#xff0c;它主要作用于登录验证&#xff0c;获取用户权限信息等场景。 全局后置守卫&am…

ElasticSearch Java API GEO操作(REST命令版)

前言 ElasticSearch支持地理空间数据查询、搜索&#xff0c;提供geo_point、geo_shape两种地理数据类型。 geo_point用于描述一个或多个地理坐标点&#xff0c;主要用于周边位置查询、边界内搜索点、聚合多个范围内的点等功能。 geo_shape用于描述点线面等多种地理数据&…

DS森林叶子编码/森林转二叉树 【数据结构】

DS森林叶子编码 题目描述 给定一组森林&#xff0c;编写程序生成对应的二叉树&#xff0c;输出这颗二叉树叶结点对应的二进制编码.规定二叉树的左边由0表示&#xff0c;二叉树的右边由1表示。 输入 N B 表示N个树&#xff0c;每结点最多B个分支 第2行至第N1行&#xff0c;每个…

驱动开发day1

头文件 #ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014#define PHY_LED2_MODER 0x50007000 #define PHY_LED2_ODR 0x50007014#define PHY_LED3_MODER 0x50006000 #define PHY_LED3_ODR 0x50006014#define P…

电脑技巧:27个Office使用小技巧,值得收藏

目录 一、Word 二、EXCEL 三、附文&#xff1a;Word和Excel快捷键 我们中的绝大部分人都使用微软的Office&#xff0c;但是我们是否都了解如何能够最有效地使用它&#xff1f;我们在这里列举了一些关于使用Word和Excel的窍门。 我们使用最多的软件可能就是办公软件了——字…

思辨:移动开发的未来在哪?

前段时间在知乎看到关于移动开发未来的问题&#xff0c;就尝试回答了一下&#xff0c;也触发了我对移动开发未来的思考。 什么是移动开发&#xff1f; 我们口中说的移动开发是什么&#xff0c;从广义和狭义的角度分别来看下&#xff1a; 从广义角度来看&#xff0c;移动开发是…

BMS电池管理系统理论基础

目录 1 、锂离子电池特性分析 1.1、 锂离子电池工作原理 1.2 锂离子电池特性 (1)容量特性

安装zip扩展(PHP)

记录一次 安装zip扩展的最优方案 &#xff08;备注 网上以及Ai提供的很乱不能很快解决&#xff09; 首先搜索zip包 yum search zip选择自己合适的php版本 比如我的php是7.4.33的 我就用php74-php-pecl-zip 如果没有的话 先添加软件源 sudo yum install epel-release sudo yu…

docker-rabbitmq 安装依赖

出现的问题如下: channel error; protocol method: #method(reply-code404, reply-textNOT_FOUND - no channel error&#xff1b; protocol method: #method&#xff1c;channel.close&#xff1e;(reply-code404, reply-textNOT_FOUND - no 查看rabbitmq 客户端是否存在如…

Kubernetes - 一键安装部署 K8S(附:Kubernetes Dashboard)

问题描述 不知道大伙是如何安装 K8s&#xff0c;特别还是集群的时候&#xff0c;我上一次安装搭建的时候&#xff0c;那个恶心到我了&#xff0c;真的是一步一个脚印走完整个搭建流程&#xff0c;爬了不少坑。 于是&#xff0c;才有了今天的文章&#xff0c;到底有没有可以一…

Kafka快速入门(最新版3.6.0)

文章目录 一、初识MQ1.1 什么是MQ1.2 同步和异步通讯1.1.1 同步通讯1.1.2 异步通讯 1.3 技术对比1.4 MQ的两种模式 二、初识Kafka2.1 Kafka的使用场景2.2 Kafka基本概念2.3 Topic与Partition 三、Kafka基本使用3.1 部署前的准备3.2 启动kafka服务器3.3 Kafka核心概念之Topic3.4…

出差学小白知识No6:LD_PRELOAD变量路径不对找不到库文件

交叉编译的时候出现以下问题&#xff0c;显示LD_PRELOAD变量找不到路劲 首先先查看一下LD_PRELOAD的路径&#xff1a;echo $LD_PRELOAD 如果输出一大串&#xff0c;那么先进行清空&#xff1a;unset LD_PRELOAD 重新给LD_PRELOAD进行赋值他的路径和库文件&#xff1a; expor…

操作系统【OS】Ch2 大题 PV题型分类

生产者-消费者问题&#xff1a;生产资源-消费资源理发师问题&#xff1a;服务-被服务读者-写者问题&#xff1a;同类进程不互斥、异类进程互斥哲学家进餐问题&#xff1a;只有一类进程&#xff0c;每个进程需要同时拥有多种资源才能运行单纯的同步问题&#xff1a;前驱后继图 生…

自然语言处理---RNN经典案例之构建人名分类器

1 案例介绍 关于人名分类问题&#xff1a;以一个人名为输入, 使用模型帮助判断它最有可能是来自哪一个国家的人名&#xff0c;这在某些国际化公司的业务中具有重要意义&#xff0c;在用户注册过程中&#xff0c;会根据用户填写的名字直接给他分配可能的国家或地区选项&#xff…