[案例7-2]商城进货交易记录

任务描述:

每个商城都需要进货.而这些进货记录整理起来很不方便,本案例要求编写一个商城进货记录交易的程序,使用字节流将商场的进货信息记录在本地的csv文件中.程序具体要求如下:                               

当用户输入商品编号时,后台会根据商品编号查询到相应的商品信息,并打印商品信息,接着让用户输入需要进货的商品数量,程序将原有的库存数量与输入的数量相加作为商品最新的库存数量,并将商品进货的记录保存至本地的csv文件中,在csv文件中,每条语句包含商品编号,商品名称,购买数量,单价,总价,联系人,等数据,每条记录的数据之间直接用英文的逗号或空格分隔,每条记录之间由换行符分隔,文件命名格式为"进货记录"加上当天日期加上".csv"后缀,如进货记录"20210611.csv".保存文件时,需要判断本地文件是否存在当天的数据,如果存在则追加,不存在则创建.

初始文件信息:

 

 

运行结果:

 

 运行后文件信息:

 代码如下:

定义一个实体类:

/**
 * 2022/4/13
 */
public class Good {
    int id;             // 商品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() {   // 重写toString方法
        return
                "进货记录编号=" + id +
                "\n商品名称='" + name + '\'' +
                "\n单价=" + price +
                "\n库存数量=" + number +
                "\n联系人='" + people + '\'' +
                '\n';
    }

    public void setNumber(int number){
        this.number = number;
    }
}

  定义RecordGoodOrder类来记录和操作商品信息:

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 2022/4/13
 */
public class RecordGoodOrder {
    // 创建商品库存
    static ArrayList<Good> goodsList = new ArrayList<Good>();

    public static void main(String[] args) {
        init();  // 初始化商品库存
        // 将书架上所有商品信息打印出来
        for (int i = 0 ; i < goodsList.size() ; i++){   // 遍历集合
            System.out.println(goodsList.get(i));  // 将集合中指定索引处的元素
        }
        while (true){
            // 获取控制台输入的信息
            Scanner in = new Scanner(System.in);
            System.out.println("请输入商品编号(输入-1退出):");
            int goodId = in.nextInt();
            Good stockGood = getGoodsById(goodId);    // 调用getGoodById方法,将值赋给stockGood
            if (stockGood != null){  // 判断是否存在此商品
                System.out.println("当前商品库存信息:" + stockGood);  // 打印商品信息
                System.out.println("请输入进货数量:");
                int bookNumber = in.nextInt();  // 用户输入进货量
                // 将输入的信息封装成Books对象
                Good good = new Good(stockGood.id, stockGood.name,stockGood.price,bookNumber,stockGood.price*bookNumber,stockGood.people);
                FileUtil.saveBooks(good);// 调用saveBooks方法,将本条数据保存到本地文件
                // 修改库存
                stockGood.setNumber(stockGood.number+bookNumber); // 通过stockGood调用setNumber方法,将输入的库存与原始库存相加

            }else if (goodId == -1){   // 判断输入的id是否为-1
                System.exit(0);   // JVM退出
            }else{
                System.out.println("商品编号错误!");
            }
        }
    }
    // 初始化商品库存的信息,将商品存入库存
    private static void init(){
        Good good1 = new Good(10001,"百事可乐",3.5,100,350,"张三");  // 创建Good对象,往里存入元素
        Good good2 = new Good(10002,"可口可乐",3,100,300,"李四");
        Good good3 = new Good(10003,"百事雪碧",4,100,400,"张三");
        goodsList.add(good1);   // 将Good对象存入集合中
        goodsList.add(good2);
        goodsList.add(good3);
    }
    // 根据输入的商品编号查找商品信息,循环遍历库存中的商品信息,找到商品编号相等的取出
    private static Good getGoodsById(int goodId){
        for (int i = 0 ; i < goodsList.size() ; i++){   // 遍历数组
            Good thisGood = goodsList.get(i);
            if (goodId == thisGood.id){   // 判断是否有该id
                return thisGood;   // 如果有则返回
            }
        }
        return null;   // 否则返回null
    }
}

定义工具类FileUtil保存图书信息:

import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 2022/4/13
 */
// 工具类
public class FileUtil {
    public static final String zd = ",";  // 字段分隔
    public static final String hfg = "\r\n";  // 行分隔

    // 保存商品信息
    public static void saveBooks(Good good){   // 创建saveBooks方法
        // 判断本地是否存在此文件

        Date date = new Date();    // 创建Date日期类对象
        // 定义日期格式
        DateFormat format = new SimpleDateFormat("yyyyMMdd"); // y:年 , M:月, d:日
        // 拼接文件名
        String name = "进货记录" + format.format(date) + ".csv";  // format.format(date):设置对象格式以生成字符串
        InputStream in; // 定义字节输入流
        // 使用try...catch处理异常
        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();
        }
    }

    public static void createFile(String name,boolean label,Good good){ // name :文件名,label:表示文件是否存在,good:商品信息
        BufferedOutputStream out = null;  // 定义字节缓冲输出流对象
        // 构造一个字符串生成器
        StringBuilder sdf = new StringBuilder(); // 拼接内容
        try{
            if (label){  // 当已存在当天的文件,则在文件内容后追加
                // 创建输出流,用于追加文件
                out = new BufferedOutputStream(new FileOutputStream(name,true)); // 末尾定义为true,表示追加写入,不会重新写入

            }else{   // 不存在当天文件,则新建文件
                // 创建输出流,用于保存文件
                out = new BufferedOutputStream(new FileOutputStream(name));
                String[] fieldSort = new String[]{"商品编号","商品名称","购买数量","单价","总价","联系人"}; // 创建表头
                for (String fieldKey : fieldSort){  // 增强for遍历
                    // 新建时,将表头存入本地文件
                    sdf.append(fieldKey).append(zd);
                }
            }
            sdf.append(hfg); // 追加换行符号
            sdf.append(good.id).append(zd);
            sdf.append(good.name).append(zd);
            sdf.append(good.number).append(zd);
            sdf.append(good.price).append(zd);
            sdf.append(good.money).append(zd);
            sdf.append(good.people).append(zd);
            String str = sdf.toString();  // 将sdf转换为String类型
            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 e){
                e.printStackTrace();
            }
        }
    }
}

有些小伙伴可能会出现乱码问题,像下面这样:

解决方法如下:

点击文件上面的数据,选择从文本/csv:

点击它:

选择这个文件 ,点击导入:

然后点击加载:

 之后就显示出来了:

 

  • 11
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小陈努力学JAVA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值