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


    • 以下内容本人都是在 Maven 工程下总结的
    1. 需求介绍
    2. 显示主菜单
    3. 让程序无线运行下去
    4. 加载数据
    5. 显示库存列表
    6. 根据名称查找特定库存记录
    7. 添加库存记录
    8. 查看_下架_退出功能实现
    9. 持久化数据 / 钝化:将 内存 里的数据持久化存储到 硬盘  IO流
    1. package com.csdn.fruit.pojo;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. @Data
    6. @NoArgsConstructor
    7. @AllArgsConstructor
    8. public class Fruit {
    9. private String fname;
    10. private Integer price;
    11. private Integer fcount;
    12. private String remark;
    13. @Override
    14. public String toString() {
    15. return fname + "\t\t" + price + "\t\t" + fcount + "\t\t" + remark;
    16. }
    17. }
    1. package com.csdn.fruit.view;
    2. import com.csdn.fruit.pojo.Fruit;
    3. import java.io.*;
    4. import java.util.ArrayList;
    5. import java.util.List;
    6. import java.util.Scanner;
    7. import java.util.function.Consumer;
    8. import java.util.function.Predicate;
    9. public class Menu {
    10. Scanner input = new Scanner(System.in);
    11. List fruitList = new ArrayList<>();
    12. {
    13. try {
    14. loadData();
    15. } catch (IOException e) {
    16. throw new RuntimeException(e);
    17. }
    18. }
    19. //加载数据
    20. public void loadData() throws IOException {
    21. InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("fruit.dat");
    22. if (inputStream != null) {
    23. //字节流转换成字符流
    24. //字节流:InputStream 字符流:Reader 字符转换流:InputStreamReader
    25. BufferedReader bf = new BufferedReader(new InputStreamReader(inputStream));
    26. String str = null;
    27. while ((str = bf.readLine()) != null) {
    28. String[] arr = str.split(" ");
    29. String fname = arr[0];
    30. Integer price = Integer.parseInt(arr[1]);
    31. Integer fcount = Integer.parseInt(arr[2]);
    32. String remark = arr[3];
    33. Fruit fruit = new Fruit(fname, price, fcount, remark);
    34. fruitList.add(fruit);
    35. }
    36. }
    37. }
    38. //显示主菜单
    39. public int showMainMenu() {
    40. System.out.println("================欢迎使用水果库存系统===================");
    41. System.out.println("1.显示库存列表");
    42. System.out.println("2.添加库存记录");
    43. System.out.println("3.查看特定库存");
    44. System.out.println("4.水果下架");
    45. System.out.println("5.退出");
    46. System.out.println("====================================================");
    47. System.out.print("请选择:");
    48. return input.nextInt();
    49. }
    50. //显示库存列表
    51. public void showFruitList() {
    52. System.out.println("----------------------------------------------------");
    53. System.out.println("名称\t\t单价\t\t库存\t\t备注");
    54. if (fruitList == null || fruitList.size() <= 0) {
    55. System.out.println("对不起,库存为空!");
    56. } else {
    57. /*fruitList.forEach(new Consumer() {
    58. @Override
    59. public void accept(Fruit fruit) {
    60. System.out.println(fruit);
    61. }
    62. });*/
    63. // fruitList.forEach(fruit -> System.out.println(fruit));
    64. fruitList.forEach(System.out::println);
    65. }
    66. System.out.println("----------------------------------------------------");
    67. }
    68. //根据名称查询指定的库存记录
    69. public Fruit getFruitByFname(String fname) {
    70. //判断型接口 有参数,返回值是布尔类型
    71. /* fruitList.stream().filter(new Predicate() {
    72. @Override
    73. public boolean test(Fruit fruit) {
    74. return fname.equals(fruit.getFname());
    75. }
    76. });*/
    77. return fruitList.stream().filter(fruit -> fname.equals(fruit.getFname())).findFirst().orElseGet(() -> null);
    78. /* for (Fruit fruit : fruitList) {
    79. if (fname.equals(fruit.getFname())) {
    80. return fruit;
    81. }
    82. }
    83. return null;*/
    84. }
    85. //添加库存记录
    86. public void addFruit() {
    87. System.out.print("请输入水果名称:");
    88. String fname = input.next();
    89. Fruit fruit = getFruitByFname(fname);
    90. if (fruit == null) {
    91. System.out.print("请输入水果单价:");
    92. Integer price = input.nextInt();
    93. System.out.print("请输入水果库存:");
    94. Integer fcount = input.nextInt();
    95. System.out.print("请输入水果备注:");
    96. String remark = input.next();
    97. fruit = new Fruit(fname, price, fcount, remark);
    98. fruitList.add(fruit);
    99. } else {
    100. System.out.print("请输入追加的库存量:");
    101. Integer fcount = input.nextInt();
    102. fruit.setFcount(fruit.getFcount() + fcount);
    103. }
    104. System.out.println("添加成功!");
    105. }
    106. //查看特定库存记录
    107. public void showFruitInfo() {
    108. System.out.print("请输入水果名称:");
    109. String fname = input.next();
    110. Fruit fruit = getFruitByFname(fname);
    111. if (fruit == null) {
    112. System.out.println("对不起,没有找到对应的库存记录!");
    113. } else {
    114. System.out.println("----------------------------------------------------");
    115. System.out.println("名称\t\t单价\t\t库存\t\t备注");
    116. System.out.println(fruit);
    117. System.out.println("----------------------------------------------------");
    118. }
    119. }
    120. //水果下架
    121. public void delFruit() {
    122. System.out.print("请输入水果名称:");
    123. String fname = input.next();
    124. Fruit fruit = getFruitByFname(fname);
    125. if (fruit == null) {
    126. System.out.println("对不起,没有找到需要下架的库存记录!");
    127. } else {
    128. System.out.print("是否确认下架?(Y/N)");
    129. String confirm = input.next();
    130. if ("y".equalsIgnoreCase(confirm)) {
    131. fruitList.remove(fruit);
    132. }
    133. }
    134. }
    135. //退出
    136. public boolean exit() {
    137. System.out.print("是否确认退出?(Y/N)");
    138. String confirm = input.next();
    139. boolean flag= !"y".equalsIgnoreCase(confirm);
    140. if (!flag) {
    141. try {
    142. saveData();
    143. } catch (IOException e) {
    144. throw new RuntimeException(e);
    145. }
    146. }
    147. return flag;
    148. }
    149. //保持数据
    150. public void saveData() throws IOException {
    151. PrintWriter pw = new PrintWriter(new FileWriter("pro02-fruit-IO/src/main/resources/fruit.dat"));
    152. /* fruitList.forEach(new Consumer() {
    153. @Override
    154. public void accept(Fruit fruit) {
    155. pw.println(fruit.getFname() + " " + fruit.getPrice() + " " + fruit.getFcount() + " " + fruit.getRemark());
    156. }
    157. });*/
    158. fruitList.forEach(fruit -> pw.println(fruit.getFname() + " " + fruit.getPrice() + " " + fruit.getFcount() + " " + fruit.getRemark()));
    159. pw.flush();
    160. }
    161. }
    1. package com.csdn.fruit.view;
    2. public class Client {
    3. public static void main(String[] args) {
    4. Menu m = new Menu();
    5. boolean flag = true;
    6. while (flag) {
    7. int slt = m.showMainMenu();
    8. switch (slt) {
    9. case 1:
    10. m.showFruitList();
    11. break;
    12. case 2:
    13. m.addFruit();
    14. break;
    15. case 3:
    16. m.showFruitInfo();
    17. break;
    18. case 4:
    19. m.delFruit();
    20. break;
    21. case 5:
    22. //方法设计时是否需要返回值,依据是:是否在调用的地方需要留下一些值用于再运算
    23. flag = m.exit();
    24. break;
    25. default:
    26. System.out.println("你不按套路出牌!");
    27. break;
    28. }
    29. }
    30. System.out.println("谢谢使用!再见!");
    31. }
    32. }

    • 需求介绍 

    1. ================欢迎使用水果库存系统===================
    2. 1.显示库存列表
    3. 2.添加库存记录
    4. 3.查看特定库存
    5. 4.水果下架
    6. 5.退出
    7. ====================================================
    8. 请选择:1
    9. ----------------------------------------------------
    10. 名称 单价 库存 备注
    11. 苹果 5 100 苹果很好吃
    12. 菠萝 3 150 菠萝很好吃
    13. 榴莲 4 200 榴莲很好吃
    14. ----------------------------------------------------
    15. ================欢迎使用水果库存系统===================
    16. 1.显示库存列表
    17. 2.添加库存记录
    18. 3.查看特定库存
    19. 4.水果下架
    20. 5.退出
    21. ====================================================
    22. 请选择:1
    23. ----------------------------------------------------
    24. 名称 单价 库存 备注
    25. 对不起,库存为空!
    26. ----------------------------------------------------
    27. ================欢迎使用水果库存系统===================
    28. 1.显示库存列表
    29. 2.添加库存记录
    30. 3.查看特定库存
    31. 4.水果下架
    32. 5.退出
    33. ====================================================
    34. 请选择:2
    35. 请输入水果名称:苹果
    36. 请输入追加的库存量:30
    37. 添加成功!
    38. ================欢迎使用水果库存系统===================
    39. 1.显示库存列表
    40. 2.添加库存记录
    41. 3.查看特定库存
    42. 4.水果下架
    43. 5.退出
    44. ====================================================
    45. 请选择:1
    46. ----------------------------------------------------
    47. 名称 单价 库存 备注
    48. 苹果 5 130 苹果很好吃
    49. 菠萝 3 150 菠萝很好吃
    50. 榴莲 4 200 榴莲很好吃
    51. ----------------------------------------------------
    52. ================欢迎使用水果库存系统===================
    53. 1.显示库存列表
    54. 2.添加库存记录
    55. 3.查看特定库存
    56. 4.水果下架
    57. 5.退出
    58. ====================================================
    59. 请选择:2
    60. 请输入水果名称:西瓜
    61. 请输入水果单价:6
    62. 请输入水果库存:120
    63. 请输入水果备注:西瓜很好吃!
    64. 添加成功!
    65. ================欢迎使用水果库存系统===================
    66. 1.显示库存列表
    67. 2.添加库存记录
    68. 3.查看特定库存
    69. 4.水果下架
    70. 5.退出
    71. ====================================================
    72. 请选择:1
    73. ----------------------------------------------------
    74. 名称 单价 库存 备注
    75. 苹果 5 130 苹果很好吃
    76. 菠萝 3 150 菠萝很好吃
    77. 榴莲 4 200 榴莲很好吃
    78. 西瓜 6 120 西瓜很好吃
    79. ----------------------------------------------------
    80. ================欢迎使用水果库存系统===================
    81. 1.显示库存列表
    82. 2.添加库存记录
    83. 3.查看特定库存
    84. 4.水果下架
    85. 5.退出
    86. ====================================================
    87. 请选择:3
    88. 请输入水果名称:榴莲
    89. ----------------------------------------------------
    90. 名称 单价 库存 备注
    91. 榴莲 4 200 榴莲很好吃
    92. ----------------------------------------------------
    93. ================欢迎使用水果库存系统===================
    94. 1.显示库存列表
    95. 2.添加库存记录
    96. 3.查看特定库存
    97. 4.水果下架
    98. 5.退出
    99. ====================================================
    100. 请选择:3
    101. 请输入水果名称:橙子
    102. 对不起,没有找到对应的库存记录!
    103. ================欢迎使用水果库存系统===================
    104. 1.显示库存列表
    105. 2.添加库存记录
    106. 3.查看特定库存
    107. 4.水果下架
    108. 5.退出
    109. ====================================================
    110. 请选择:4
    111. 请输入水果名称:橙子
    112. 对不起,没有找到需要下架的库存记录!
    113. ================欢迎使用水果库存系统===================
    114. 1.显示库存列表
    115. 2.添加库存记录
    116. 3.查看特定库存
    117. 4.水果下架
    118. 5.退出
    119. ====================================================
    120. 请选择:4
    121. 请输入水果名称:西瓜
    122. 是否确认下架?(Y/N) Y
    123. 下架成功!
    124. ================欢迎使用水果库存系统===================
    125. 1.显示库存列表
    126. 2.添加库存记录
    127. 3.查看特定库存
    128. 4.水果下架
    129. 5.退出
    130. ====================================================
    131. 请选择:1
    132. ----------------------------------------------------
    133. 名称 单价 库存 备注
    134. 苹果 5 130 苹果很好吃
    135. 菠萝 3 150 菠萝很好吃
    136. 榴莲 4 200 榴莲很好吃
    137. ----------------------------------------------------
    138. ================欢迎使用水果库存系统===================
    139. 1.显示库存列表
    140. 2.添加库存记录
    141. 3.查看特定库存
    142. 4.水果下架
    143. 5.退出
    144. ====================================================
    145. 请选择:5
    146. 是否确认退出?(Y/N) Y
    147. 谢谢使用!再见!

  • 相关阅读:
    IP、MAC地址,交换机路由器,ARP、NAT协议串讲
    目标检测YOLO实战应用案例100讲-基于改进YOLO v7的智能振动分拣系统开发
    算术运算符2(阁瑞钛伦特软件-九耶实训)
    ruoyi自动生成代码步骤
    nikto工具的用法描述(漏洞分析)
    问题处理: Keil5没有AT89C51芯片
    评比无代码低代码平台时,可以考虑以下几个方面
    【NR 定位】3GPP NR Positioning 5G定位标准解读(十五)-UL-TDOA 定位
    单片机实践:开发板上运行AES128防盗算法
    【OFDM系列5】单输入单输出OFDM(SISO-OFDM)多径信道迫零(ZF)和最小均方误差(MMSE)均衡器原理和公式推导
  • 原文地址:https://blog.csdn.net/m0_65152767/article/details/133999972