当前位置: 首页 > news >正文

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

  •  上一节内容是 使用IO流完成项目实战水果库存系统
  • https://blog.csdn.net/m0_65152767/article/details/133999972?spm=1001.2014.3001.5501
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;@Overridepublic 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
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  字符转换流: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);}}*/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>() {@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-Serializable/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();*/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();}
}
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("谢谢使用!再见!");}
}

相关文章:

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

上一节内容是 使用IO流完成项目实战水果库存系统https://blog.csdn.net/m0_65152767/article/details/133999972?spm1001.2014.3001.5501 package com.csdn.fruit.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java…...

0基础学习PyFlink——使用PyFlink的Sink将结果输出到外部系统

在《0基础学习PyFlink——使用PyFlink的SQL进行字数统计》一文中&#xff0c;我们直接执行了Select查询操作&#xff0c;在终端中直接看到了查询结果。 select word, count(1) as count from source group by word; ------------------------------------------------------ |…...

会声会影2024旗舰版详细功能介绍

随着网络视频的蓬勃发展&#xff0c;越来越多的人开始涉足视频剪辑领域&#xff0c;毕竟技多不压身嘛。在众多剪辑软件中&#xff0c;剪映和会声会影是备受新手青睐的两种。那么&#xff0c;会声会影和剪映哪个好呢&#xff1f;在它们之间&#xff0c;哪一个更适合初学者呢接&a…...

QtCreator 查看类帮助文档,快捷键操作:按两次F1 全屏帮助,Esc取消全屏

如何查看类帮助文档 选择类&#xff0c;按F1查看类帮助文档。 示例&#xff1a; #include <QLabel> // 将光标放在QLabel上&#xff0c;按F1右侧弹出的类帮助手册可视宽度很小&#xff0c;如果按两次 F1 键&#xff0c;帮助文档将会以全屏模式显示&#xff0c;以便更清…...

C语言文件操作(1)

C语言文件操作&#xff08;1&#xff09; 文章目录 C语言文件操作&#xff08;1&#xff09;一、理解文件1.概述2.分类①.正常角度②.文本文件和二进制文件 二、文件的打开和关闭1.流和标准流2.文件类型指针3.文件的打开和关闭以及使用类型 三、文件缓冲区 一、理解文件 1.概述…...

adb 操作命令(adb调试QT项目使用到的命令)

1.adb连接串口 获取root权限 adb root && adb remount && adb shell2.测试串口命令 stty -F /dev/ttyS4 cs8 -parenb -cstopb -echoecho "12345\n" > /dev/ttyS8cat /dev/ttyS4 &3.软件在安卓系统上的名字已经活动名称&#xff08;下面是示…...

mysql下载和安装,使用

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

Redis底层核心数据结构详解

文章目录 一、深入String&#xff08;SDS&#xff09;1. 字符串简介2. SDS存在的意义3. SDS结构设计4. SDS与C字符串的区别4.1 常数复杂度获取字符串长度4.2 杜绝缓冲区溢出4.3 二进制安全4.4 SDS API 5 小结 二、深入List (QuickList)1. 链表节点结构设计2. Redis的链表实现的…...

如何学会从产品经理角度去思考问题?

如何学会从产品经理角度去思考问题&#xff1f; 从产品经理的角度思考问题意味着你需要关注产品从构思到上市全过程中的各个方面&#xff0c;包括用户需求、市场趋势、设计、开发、测试、上市后的用户反馈等。以下是一些策略和方法&#xff0c;帮助你培养从产品经理角度思考问…...

正则表达式的神奇世界:表达、匹配和提取

正则表达式的神奇世界&#xff1a;表达、匹配和提取 前言第一&#xff1a; 什么是正则表达式&#xff1f;第二&#xff1a; 字符匹配和量词&#xff1a;1. 字符匹配&#xff1a;2. 量词&#xff1a;3. 贪婪和非贪婪匹配&#xff1a; 第三&#xff1a;字符类和元字符1. 字符类&a…...

密码登录虽安全,但有时很麻烦!如何禁用或删除Windows 11中的密码登录

如果你想在Windows 11上自动登录,在本指南中,我们将向你展示如何删除你的帐户密码。 在Windows 11上,你可以至少通过三种方式从帐户中删除登录密码。在你的帐户上使用密码有助于保护你的计算机和文件免受来自internet或本地的未经授权的访问。然而,在某些情况下,密码可能…...

Python实现的快速排序代码

Python实现的快速排序代码 def bubble_sort(arr): n len(arr) for i in range(n): for j in range(0, n-i-1): if arr[j] > arr[j1]: arr[j], arr[j1] arr[j1], arr[j] return arr 冒泡排序是一种简单的排序算法&#xff0c;它重复地遍历要排序的数列&#xff0c;…...

【USRP】通信基带物理层历史

无线通信的基带物理层开发历史涵盖了从早期无线技术到当前复杂的移动通信标准的各种进步。以下是关于无线通信基带物理层开发的简要历史概述&#xff1a; 无线电初期&#xff1a;20世纪初&#xff0c;Guglielmo Marconi等人通过无线电进行了早期的无线通信尝试。这些早期的尝试…...

依靠继承与聚合,实现maven搭建分布式项目

简介聚合 对于复杂的Maven项目&#xff0c;一般建议采用多模块的方式来设计开发&#xff0c;便于后期维护管理。但是构建项目时&#xff0c;如果每次都需要按模块一个一个进行构建会十分麻烦&#xff0c;而Maven的聚合功能就可以很好的解决这个问题&#xff0c;当用户对聚合模…...

华为OD 叠积木(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

vue重修之自定义项目、ESLint和代码规范修复

文章目录 VueCli 自定义创建项目ESlint代码规范及手动修复代码规范错误 VueCli 自定义创建项目 安装脚手架 (已安装) npm i vue/cli -g创建项目 vue create xxx选项 Vue CLI v5.0.8 ? Please pick a preset:Default ([Vue 3] babel, eslint)Default ([Vue 2] babel, eslint) …...

华为OD 完全二叉树非叶子部分后序遍历(200分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应往年部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为OD…...

AI是未来?——神经网络篇

AI是未来&#xff1f;——神经网络篇 文章目录 AI是未来&#xff1f;——神经网络篇1. 神经网络小记问题记录&#xff1a; 1. 神经网络小记 疑问&#xff1a;假如让神经网络识别一张猫的图片&#xff0c;他经过了n个神经元节点最终识别为了狗。那么此时观察产生反应的这些神经…...

c语言练习94:分割链表

分割链表 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x…...

华为OD 数组二叉树(200分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应往年部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为OD…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...