北京建网站费用,网络设计师学什么专业,成都关键词排名提升,网站qq登录原理【实验7-2】商城进货记录交易
【任务介绍】 1.任务描述
每个商城都需要进货#xff0c;而这些进货记录整理起来很不方便#xff0c;本案例要求编写一个商城进货记录交易的程序#xff0c;使用字节流将商场的进货信息记录在本地的csv文件中。程序具体要求如下#xff1a; …【实验7-2】商城进货记录交易
【任务介绍】 1.任务描述
每个商城都需要进货而这些进货记录整理起来很不方便本案例要求编写一个商城进货记录交易的程序使用字节流将商场的进货信息记录在本地的csv文件中。程序具体要求如下
当用户输入商品编号时后台会根据商品编号查询到相应商品信息并打印商品信息。接着让用户输入需要进货的商品数量程序将原有的库存数量与输入的数量相加作为商品最新的库存数量并将商品进货的记录保存至本地的csv文件中。在csv文件中每条记录包含商品编号、商品名称、购买数量、单价、总价、联系人等数据每条记录的数据之间直接用英文逗号或空格分隔每条记录之间由换行符分隔。文件命名格式为“进货记录”加上当天日期加上“.csv”后缀如进货记录“20210611.csv”。保存文件时需要判断本地是否存在当天的数据如果存在则追加不存在则新建。 2.运行结果
任务运行结果如图7-1所示。 图7-1 运行结果
运行结束后在本地生成一个“进货记录20210611.csv”文件用Excel方式打开此文件如图7-1所示。 【实现思路】
为了方便保存商品的相关信息可以将商品信息封装为一个实体类。商品进货过程中可能会打印商品相关信息所以需要对该实体类的toString()方法进行重写使其能更清晰地显示商品信息商品每次进货后要修改库存数量需要在实体类中编写一个操作库存数量的方法。对于一个超市首先会有很多商品商品需要不断进货。这里我们需要创建一个集合用于模拟超市仓库然后向集合中添加有具体信息的商品对象这样一个超市就有了商品。管理员进货是通过在控制台键盘输入商品编号和购买数量的方式进行的如果商品编号正确且购买数量也正常则商品进货成功并将此商品的进货信息保存到csv文件中同时要将库存数量增加。查询商品信息时可以通过Scanner类的nextInt()方法从控制台获取商品编号之后根据这个编号到库存中查询此商品的信息如果查到了商品的信息从控制台获取进货的数量之后将此商品的所有信息进行封装。将商品的销售信息写入到csv文件之前需先拼凑好csv文件名再判断本地是否已存在此文件这里可通过输入流尝试获取此文件的字节流如果获取成功则证明这个文件已存在那么就通过输出流向文件末尾追加销售信息如果获取失败即异常说明之前并没有生成当日的销售信息则需要新建此文件。将封装的信息写入csv文件中时csv格式的文件以纯文本形式存储表格数据写入文件时可以用图7-1的格式写入当此类文件用Excel格式打开的时候展现信息如图7-2所示。在拼凑csv文件名时需要获取当日的日期。这里可以通过以下代码来获取并拼凑csv文件名
DateFormat format new SimpleDateFormat(yyyyMMdd);// 定义日期格式
String name 进货记录 format.format(date) .csv;// 拼接文件名
【实现代码】
1将商品信息封装成一个实体类Good具体如文件7-1所示。
文件7-1 Good.java
package chapter0702;public class Good { int id; String name; //商品的价格 double price; //商品的单价 int number; //进货的数量 double money; //总价 String people; //审批人 public Good(int id, String name, double price, int number, double money, String people) { this.id id; this.name name; this.price price; this.number number; this.money money; this.people people; } Override public String toString() { String message进货记录编号id\n商品名称name \n联系人people\n单价price\n库存数量number\n; return message; } public void setNumber(int number) { this.numbernumber; }}
在文件7-1中第3~8行代码定义了用于标识商品的信息各种字段第9~17行代码定义了一个有参的构造方法用于对象的创建和初始化在第18~23行重写了toString()方法用于返回商品的详细信息。第24~26行的代码定义了一个setNumber()的方法用于修改商品的库存量。
2定义RecordGoodOrder类来记录和操作商品信息具体如文件7-2所示。
文件7-2 RecordGoodOrder.java
package chapter0702;import java.util.ArrayList;import java.util.Scanner;public class RecordGoodOrder { //创建商品库存 static ArrayListGood goodsListnew ArrayListGood(); public static void main(String[] args) { init(); //初始化商品库存 //将书架上所以商品信息打印出来 for (int i 0; i goodsList.size(); i) { System.out.println(goodsList.get(i)); } while(true) { //获取控制台输入的信息 Scanner scannew Scanner(System.in); System.out.println(请输入商品编号); int goodIdscan.nextInt(); Good stockGoodgetGoodsById(goodId); if (stockGood ! null) {// 判断是否存在此商品 System.out.println(当前商品库存信息 stockGood); System.out.print(请输入进货数量); int goodNumber scan.nextInt(); // 将输入信息封装成Good对象 Good good new Good(stockGood.id, stockGood.name, stockGood.price, goodNumber, stockGood.price * goodNumber, stockGood.people); FileUtil.saveGoods(good);// 将本条数据保存至本地文件 // 修改库存 stockGood.setNumber(stockGood.number goodNumber); } else { System.out.println(商品编号输入错误); } } } /* * 初始化商品库存的信息 将商品存入库存 */ private static void init() { Good good1new Good(1001,百事可乐,4.5,100,450,张三); Good good2new Good(1002,可口可乐,4,100,400,李四); Good good3new Good(1003,百事雪碧,3.8,100,380,张三); goodsList.add(good1); goodsList.add(good2); goodsList.add(good3); } /* * 根据输入的商品编号查找商品信息循环遍历库存中商品信息找到商品编号相等的取出 */ private static Good getGoodsById(int goodId) { for (int i 0; i goodsList.size(); i) { Good thisGoodgoodsList.get(i); if (goodIdthisGood.id) { return thisGood; } } return null; }}
在文件7-8中第6行代码创建了ArrayList类型的全局变量作为商品的仓库。第39~46代码初始化了商品信息向ArrayList中添加了3种商品的信息并在第10~12行代码中通过for循环进行展示。第13~34行代码使用while循环来获取和处理用户输入信息每次循环先由第16~17行代码从控制台获取商品编号的数据再由第49~57行的代码根据商品编号查询到商品信息当获得的商品信息不为空时可从第21~22代码获得购买的数量可通过24~29的代码将所有数据封装再利用第27行代码调用FileUtil类中的saveGoods()方法将其保存至本地。最后在第29行代码中调用setNumber()方法修改库存。
3定义工具类FileUtil保存商品信息具体如文件7-3所示。
文件7-3 FileUtil.java
package chapter0702;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;/** * 工具类 */public class FileUtil { public static final String SEPARATE_FIELD ,;// 字段分隔 英文逗号 public static final String SEPARATE_LINE \r\n;// 行分隔 /** * 保存商品信息 */ public static void saveGoods(Good good) { // 判断本地是否存在此文件 Date date new Date(); // 定义日期格式 DateFormat format new SimpleDateFormat(yyyyMMdd); // 拼接文件名 String name 进货记录 format.format(date) .csv; InputStream in null; try { in new FileInputStream(name);// 判断本地是否存在此文件 if (in ! null) { in.close();// 关闭输入流 // 可获取输入流则存在文件采取修改文件方式 createFile(name, true, good); } } catch (FileNotFoundException e) { // 输入流获取失败则不存在文件采取新建新文件方式 createFile(name, false, good); } catch (IOException e) { e.printStackTrace(); } } /** * 将进货记录的信息保存到本地可通过label标识来判断是修改文件还是新建文件 * param name 文件名 * param label 文件已存在的标识 true已存在则修改 false不存在则新建 * param good 商品信息 */ public static void createFile(String name,boolean label,Good good) { BufferedOutputStream out null; StringBuffer sbf new StringBuffer();// 拼接内容 try { if (label) {// 当已存在当天的文件则在文件内容后追加 // 创建输出流用于追加文件 out new BufferedOutputStream(new FileOutputStream(name, true)); } else {// 不存在当天文件则新建文件 // 创建输出流用于保存文件 out new BufferedOutputStream(new FileOutputStream(name)); String[] fieldSort new String[] { 商品编号, 商品名称, 购买数量, 单价, 总价, 联系人 };// 创建表头 for (String fieldKye : fieldSort) { // 新建时将表头存入本地文件 sbf.append(fieldKye).append(SEPARATE_FIELD); } } sbf.append(SEPARATE_LINE);// 追加换行符号 sbf.append(good.id).append(SEPARATE_FIELD); sbf.append(good.name).append(SEPARATE_FIELD); sbf.append(good.number).append(SEPARATE_FIELD); sbf.append((double) good.price).append(SEPARATE_FIELD); sbf.append((double) good.money).append(SEPARATE_FIELD); sbf.append(good.people).append(SEPARATE_FIELD); String str sbf.toString(); byte[] b str.getBytes(); for (int i 0; i b.length; i) { out.write(b[i]);// 将内容写入本地文件 } } catch (Exception e) { e.printStackTrace(); } finally { try { if (out ! null) out.close();// 关闭输出流 } catch (Exception e2) { e2.printStackTrace(); } } } }
在文件7-3中当saveGoods()方法被调用时获取当前日期并格式化后拼出了文件名再通过第29行代码尝试获取此文件的字节输入流。当能够获取输入流时可通过第30~34行代码先关闭输入流再在文件末尾追加信息。当不能获取输入流时则抛出异常在异常处理中调用第37行代码的createFile()方法可以通过此方法中的label参数来区分是新建文件还是在已有文件中追加内容如果label值是true则追加内容如果label值是false则新建文件并写入表头其中进行追加还是新建操作由构造函数的append参数来定义。然后利用65~72行代码拼出一行数据且在每次拼接之前都要加上换行符“\r\n”每个字段之间通过“,”分隔字段再利用第73~76行的代码写入文件。最后80~86行代码关闭了输出流。