今天学习了文件IO和对象序列化

ScreenShot_2026-10-10_002043_433.png

▼
text
复制代码
/** * // TODO 1: 创建 File 对象,路径为 "data/quotations.csv" * // 提示:如果 data 目录不存在,用 file.getParentFile().mkdirs() 自动创建 * <p> * // TODO 2: 用 try-with-resources 创建 BufferedWriter * // 提示:new BufferedWriter(new FileWriter(file)) * // 每行格式:编号,项目名称,原始金额,客户姓名 * <p> * // TODO 3: 遍历 quotations,每行写入一条数据 * // 提示:writer.write(字符串); writer.newLine(); */ package cn.com.d99714.smart.practice; import cn.com.d99714.smart.common.Config; import cn.com.d99714.smart.entity.*; import java.io.*; import java.util.ArrayList; public class QuotationFileWriter { private static ArrayList<SmartHomeQuotation> quotations = new ArrayList<>(); public static void main(String[] args) { initData(); // Windows 默认用 GBK,Java 默认用 UTF-8,两边编码不一致。 // 1. 写法一,简单写法,直接用Excel打开CSV文件可能出现乱码 File file = new File("data/quotations.csv"); file.getParentFile().mkdirs(); try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { writeCSV(writer); System.out.println("写入完成!路径:" + file.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); } // 2. 写法二,显式"UTF-8"编码格式,直接用Excel打开CSV文件乱码,打开前需要选择编码格式 File fileUTF8 = new File("data/quotations_utf8.csv"); fileUTF8.getParentFile().mkdirs(); try (BufferedWriter writer2 = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileUTF8), "UTF-8"))) { writeCSV(writer2); System.out.println("写入完成!路径:" + fileUTF8.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); } // 3. 写法三,显式"GBK"编码格式,直接用Excel打开CSV文件应该没有乱码 File fileGBK = new File("data/quotations_gbk.csv"); fileGBK.getParentFile().mkdirs(); try (BufferedWriter writer3 = new BufferedWriter( new OutputStreamWriter(new FileOutputStream(fileGBK), "GBK"))) { writeCSV(writer3); System.out.println("写入完成!路径:" + fileGBK.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); } // 4. 写法四,要用 UTF-8 且让 Excel 不乱码,需要写 BOM 头(文件开头加特殊标记) File fileUTF8BOM = new File("data/quotations_utf8bom.csv"); fileUTF8BOM.getParentFile().mkdirs(); try (FileOutputStream fos = new FileOutputStream(fileUTF8BOM); BufferedWriter writer4 = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"))) { fos.write(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}); // UTF-8 BOM writeCSV(writer4); System.out.println("写入完成!路径:" + fileUTF8BOM.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); } } static void writeCSV(BufferedWriter writer) throws IOException{ // TODO 1: 写表头(用逗号分隔) writer.write("项目编号, 项目名称, 客户姓名, 原始金额"); writer.newLine(); for (SmartHomeQuotation q : quotations) { writer.write(q.getQuotationNo() + "," + q.getProjectName() + "," + q.getClient().getName() + "," + q.calcOriginalTotalAmount()); writer.newLine(); // 关键:每条数据换一行 } } static void initData() { // 复用之前的初始化,1-2条就行 // 1. 创建公司用户(商家) Company vendor = new Company("野火智能", "13600305044", "野火智能科技", "上海市徐汇区", "KNX全屋智能"); // 2. 创建个人用户(业主) Person client1 = new Customer("赵今麦", "15138473848", "上海市静安区", 533); Person client2 = new Customer("刘雅瑟", "13915522551", "湖北省武汉市蔡甸区", 725); Person client3 = new Customer("刘亦菲", "13828293839", "北京市海淀区", 725); // 3.1 创建订单 SmartHomeQuotation q1 = new SmartHomeQuotation(); // 3.1.1 设置项目信息 q1.setQuotationNo(Config.QUOTATION_PREFIX + "2026100000-000001"); q1.setQuotationDate("20261009 00:08:19"); q1.setProjectName("赵女士上海国之贸雅居8栋1201"); q1.setClient(client1); q1.setVendor(vendor); // 3.1.2 设置各项金额 q1.setDeviceCost(896000.00); q1.setMaterialCost(481900.00); q1.setInstallCost(210400.00); q1.setDebugCost(92300.00); q1.setOtherCost(59123.00); // 3.1.3 设置各项折扣 q1.setDeviceDiscountRate(1.0); q1.setMaterialDiscountRate(1.0); q1.setInstallDiscountRate(1.0); q1.setDebugDiscountRate(1.0); q1.setOtherDiscountRate(1.0); q1.setTotalDiscountRate(0.93); SmartHomeQuotation q2 = new SmartHomeQuotation(); // 3.2.1 设置项目信息 q2.setQuotationNo(Config.QUOTATION_PREFIX + "2026100000-000002"); q2.setQuotationDate("20261009 00:38:43"); q2.setProjectName("刘女士万科城1期11栋2802"); q2.setClient(client2); q2.setVendor(vendor); // 3.2.2 设置各项金额 q2.setDeviceCost(446710.00); q2.setMaterialCost(285070.00); q2.setInstallCost(94600.00); q2.setDebugCost(43020.00); q2.setOtherCost(11500.00); // 3.2.3 设置各项折扣 q2.setDeviceDiscountRate(1.0); q2.setMaterialDiscountRate(1.0); q2.setInstallDiscountRate(1.0); q2.setDebugDiscountRate(1.0); q2.setOtherDiscountRate(1.0); q2.setTotalDiscountRate(0.96); SmartHomeQuotation q3 = new SmartHomeQuotation(); // 3.2.1 设置项目信息 q3.setQuotationNo(Config.QUOTATION_PREFIX + "2026100000-000003"); q3.setQuotationDate("20261009 01:12:22"); q3.setProjectName("刘女士北京什刹海别野3期15栋"); q3.setClient(client3); q3.setVendor(vendor); // 3.2.2 设置各项金额 q3.setDeviceCost(743250.00); q3.setMaterialCost(453000.00); q3.setInstallCost(230600.00); q3.setDebugCost(86000.00); q3.setOtherCost(54300.00); // 3.2.3 设置各项折扣 q3.setDeviceDiscountRate(1.0); q3.setMaterialDiscountRate(1.0); q3.setInstallDiscountRate(1.0); q3.setDebugDiscountRate(1.0); q3.setOtherDiscountRate(1.0); q3.setTotalDiscountRate(0.97); // 加入列表 quotations.add(q1); quotations.add(q2); quotations.add(q3); } }

ScreenShot_2026-10-10_003051_859.png

▼
text
复制代码
package cn.com.d99714.smart.practice; import java.io.*; public class QuotationFileReader { public static void main(String[] args) { File file = new File("data/quotations_utf8bom.csv"); if (!file.exists()) { System.out.println("文件不存在"); return; } try (BufferedReader reader = new BufferedReader(new FileReader(file))) { String header = reader.readLine(); System.out.println("表头:" + header); String line; while ((line = reader.readLine()) != null) { String[] parts = line.split(","); double amount = Double.parseDouble(parts[3]); // parts[3]是String不能直接格式化 System.out.println(parts[0] + " | " + parts[1] + " | " + parts[2] + " | " + String.format("¥%,.2f 元", amount)); } } catch (IOException e) { e.printStackTrace(); } } }

ScreenShot_2026-10-10_004136_191.png

▼
text
复制代码
package cn.com.d99714.smart.practice; import cn.com.d99714.smart.common.Config; import cn.com.d99714.smart.entity.*; import java.io.*; /** * 练习10:对象序列化与反序列化 * 已经对实体类 Person、Company、Customer、Worker、SmartHomeQuotation实现了序列化接口 * implements Serializable { * private static final long serialVersionUID = 1L; */ public class QuotationSerializePractice { public static void main(String[] args) { // TODO 1: 创建一条简单的报价单(不用完整 initData,1条就行) // 1.1 创建公司用户(商家) Company vendor = new Company("野火智能", "13600305044", "野火智能科技", "上海市徐汇区", "KNX全屋智能"); // 1.2 创建个人用户(业主) Person client = new Customer("赵今麦", "15138473848", "上海市静安区", 533); SmartHomeQuotation q = new SmartHomeQuotation(); q.setQuotationNo("Q-SM-TEST-001"); q.setProjectName("测试项目"); // 1.3 设置其他字段 ... q.setClient(client); q.setVendor(vendor); // 1.4 设置各项金额 q.setDeviceCost(896000.00); q.setMaterialCost(481900.00); q.setInstallCost(210400.00); q.setDebugCost(92300.00); q.setOtherCost(59123.00); // 1.5 设置各项折扣 q.setDeviceDiscountRate(1.0); q.setMaterialDiscountRate(1.0); q.setInstallDiscountRate(1.0); q.setDebugDiscountRate(1.0); q.setOtherDiscountRate(1.0); q.setTotalDiscountRate(0.93); File file = new File("data/quotation.obj"); file.getParentFile().mkdirs(); // TODO 2: 序列化写入(ObjectOutputStream) // 提示:try-with-resources,writeObject(q) try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file))){ oos.writeObject(q); System.out.println("序列化已完成:" + file.getAbsolutePath()); }catch (IOException e){ e.printStackTrace(); } // TODO 3: 反序列化读取(ObjectInputStream) // 提示:readObject() 返回 Object,需要强转成 SmartHomeQuotation // 打印读取出来的对象,验证和写入的是否一致 try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))){ SmartHomeQuotation restored = (SmartHomeQuotation)ois.readObject(); System.out.println("反序列化成功!"); System.out.println("报价编号:" + restored.getQuotationNo()); System.out.println("项目名称:" + restored.getProjectName()); System.out.println("客户名称:" + restored.getClient().getName()); System.out.println("报价单位:" + restored.getVendor().getCompanyName()); System.out.println("原始金额:" + String.format("¥%,.2f 元",restored.calcDiscountedTotalAmount())); }catch (IOException | ClassNotFoundException e){ e.printStackTrace(); } } }
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP