java - 将文件转换为 xml,然后将其添加到 zip

标签 java xml filewriter zipoutputstream

我使用 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 文件写入正确的文件夹。

谁能帮我解决这个问题吗?

最佳答案

这个概念并没有太大不同。 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();

关于java - 将文件转换为 xml,然后将其添加到 zip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16905684/

相关文章:

java - 删除父项将子值设置为 NULL 而不删除它们

xml - 如何将UTC秒转换为时间字符串?

xml - 我可以将 struts.xml 文件更改为其他任何文件吗?

java - 从堆栈写入文件

java - 有没有简单的小程序 url 生成器?

java - 计算土星和木星的重量

java - Android 应用程序总是意外停止,尝试执行事件处理程序?

ruby-on-rails - 用 Grape 构建 XML API

java - 在 Java 中,为什么 FileWriter 抛出 IOException 而 FileOutputStream 抛出 FileNotFoundException 的原因完全相同

Java FileWriter 输出一个问号