【问题标题】:Convert files to xml, then add them to zip将文件转换为 xml,然后将它们添加到 zip
【发布时间】:2013-06-03 20:56:02
【问题描述】:

我使用一种方法来使用 XMLOutputter、FileWriter 和 BufferedWriter 创建 xml 文件。它工作正常,但 xml 文件可能会更大(超过 10 兆),我使用其中的很多文件。

我正在尝试找到一种将文件直接写入 zip 文件的方法,同时保留文件架构。我使用的方法是将不同的xml文件一个接一个地添加到一个主文件夹中。

我想改变我的方法,这样它就不会删除已归档的文件,只需将它们添加到其中。

我一直在研究如何做到这一点,我知道我需要从现有存档中获取文件,将新文件附加到其中,然后再次压缩。我想使用 zipInputStream 和 zipOutputStream 来做到这一点。

这个问题的公认答案Java appending files into a zip 是我想做的最好的例子,但我第一次使用该方法时,zip 文件不存在,我不会添加多个文件存档的时间。我想我可以使用 if 语句自行解决此问题,该语句将检查 zip 文件是否存在,并在方法参数中使用 file 而不是 file[]。

我面临的主要问题是找到一种方法来创建 xml 文件而不将其写入磁盘并将其压缩到 zip 文件中。

我的猜测是创建一个临时文件并在压缩完成后将其删除。

知道如何实现这一目标吗?

这是我的代码示例:

XMLOutputter objOut = new XMLOutputter();
objOut.setFormat(Format.getPrettyFormat());
File objBaseDirectory = new File(m_strFolder); // folder where the xml file will be written but not main xml folder
if(!objBaseDirectory.exists())
{objBaseDirectory.mkdirs();}
FileWriter objFileWriter = new FileWriter(m_strFile); // xml file name
BufferedWriter objBuffer = new BufferedWriter(objFileWriter);
objOut.output(m_objectToWrite.toXml(0), objBuffer); // source file to convert to xml

这工作正常,并将 xml 文件写入正确的文件夹。

谁能帮我解决这个问题?

【问题讨论】:

    标签: java xml filewriter zipoutputstream


    【解决方案1】:

    这个概念并没有太大的不同。 您的 XMLOutputter 将 xml 数据写入目标 Writer 或 OutputStream。 在您的代码中,它被写入到最终在磁盘上的文件中。 您可以提供另一个以 zip 结尾的输出流。

    如果您查看示例中有关将文件附加到 zip 的代码,您会看到以下内容:

    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(source));
    for(int i = 0; i < files.length; i++){
        InputStream in = new FileInputStream(files[i]);
        out.putNextEntry(new ZipEntry(path + files[i].getName()));
        for(int read = in.read(buffer); read > -1; read = in.read(buffer)){
            out.write(buffer, 0, read);
        }
        out.closeEntry();
        in.close();
    }
    
    ...
    
    out.close();
    

    发生了什么? 打开一个名为“out”的 zip 输出流。 然后对文件执行循环。 对于每个文件,获取一个输入流来读取文件字节,命名为“in”。 然后将一个条目添加到 zip 输出流中。添加它准备输出流以接收该条目的数据。之后,将输入流写入输出流,关闭条目(为循环中的下一个文件准备下一个),最后关闭 zip 输出流。

    好吧,您所要做的就是遍历您的文档(当前位于“m_objectToWrite”中)而不是磁盘文件。然后,不是从输入流复制到输出流,而是要求 xml 输出器将文档写入输出流。 “在逻辑世界中,字节从输入到输出”的概念几乎相同。但是在这里,不是手动执行此副本,而是一些特殊对象正在为您执行此操作。 xml 输出器。

    我会让你让一切正常工作,比如一个好的路径和文件在 zip 中的存储位置。但假设 m_objectToWrite 是一个“文档”对象,工作代码的骨架可能是:(使用上面的代码和这篇文章中的代码:

    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(source));
    for( Document m_objectToWrite : MY_DOCUMENTS_LIST ){
        out.putNextEntry(new ZipEntry(path + GIVE_NAME_BASED_ON_CURRENT_DOCUMENT));
        objOut.output(m_objectToWrite.toXml(0), out);
        out.closeEntry();
    }
    
    ...
    
    out.close();
    

    【讨论】:

    • 太好了,非常感谢。我现在理解得更好,终于能够解决这个问题了。
    猜你喜欢
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    相关资源
    最近更新 更多