【问题标题】:Write Object from List to File, using ObjectOutputStream使用 ObjectOutputStream 将对象从列表写入文件
【发布时间】:2016-07-25 04:18:00
【问题描述】:

我正在尝试使用 ObjectOutputStream 将列表(对象)的内容写入磁盘。

这是相关代码:

//Input Filetype is .xlsx with an embedded File (also .xlsx), Output Filetype should be .xlsx (Type of embedded File)
//This code should save the embedded File to D:\\...

List<HSSFObjectData> extrList = new ArrayList<HSSFObjectData>();

HSSFWorkbook embeddedWorkbook = new HSSFWorkbook(pPart.getInputStream());
extrList = embeddedWorkbook.getAllEmbeddedObjects();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\scan_temp\\emb.xlsx"));

oos.writeObject(extrList);
oos.flush();
oos.close();

这段代码创建了一个名为 emb.xlsx 的文件,但内容不是我所期望的。如果我尝试使用记事本打开,它类似于:

¬í sr java.util.ArrayListxÒ™Ça I sizexp    w    x

我在这里做错了什么?谢谢你的帮助。

【问题讨论】:

    标签: java apache-poi outputstream objectoutputstream poi-hssf


    【解决方案1】:

    我在这里做错了什么?

    你做错了几件事:

    1. 您误用了序列化对象文件的.xlsx 扩展名。该扩展适用于 XML 格式的 Excel 电子表格。您应该使用 .bin.data.ser 等类似的名称。
    2. 当您应该使用 POI 中内置的 I/O 设施时,您正在使用序列化。
    3. 您正在尝试使用文本编辑器读取二进制文件。
    4. 您在close() 之前重复调用flush()

    【讨论】:

    • 感谢您的回答。因此,如果我的数据存储为二进制文件。甚至可以使用 ObjectOutputStream 将嵌入文件 (xlsx) 保存为其原始数据格式吗?你能告诉我一个示例代码怎么做吗?非常感谢!
    • ObjectOutputStream 不会以“原始格式”存储任何内容。它根据对象序列化规范中定义的序列化协议存储它。您需要再次查看 POI API,了解如何将电子表格对象存储为 .xlsx。序列化不会为你做这件事。
    • 好吧,我刚刚意识到我的代码在各个方面都是错误的。 :) ObjectOutputStream 对我没有帮助。
    【解决方案2】:

    如果其他人正在尝试与我相同的事情,请使用以下代码(有效!):

    HSSFWorkbook embeddedWorkbook = new HSSFWorkbook(InputStream);
    
    FileOutputStream fileOut = new FileOutputStream("/outputfilepath.xls");
    embeddedWorkbook.write(fileOut);
    fileOut.close();
    

    不要尝试将嵌入的对象放入列表中。只需使用.write()即可。 :-)

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 2013-04-27
      • 2019-02-18
      • 2019-09-13
      • 2020-07-18
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 2013-12-08
      相关资源
      最近更新 更多