2013-06-03 238 views
0

我使用一种方法使用XMLOutputter,FileWriter和BufferedWriter创建xml文件。它工作正常,但XML文件可以更大(超过10兆),我与他们很多。将文件转换为xml,然后将它们添加到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文件到正确的文件夹。

任何人都可以帮我解决这个问题吗?

回答

1

这个概念没有太大的不同。 您的XMLOutputter将xml数据写入Writer或OutputStream。 在您的代码中,它正在写入一个以磁盘上的文件结尾的文件。 您可以提供另一个以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(); 

发生了什么? 打开一个zip输出流,命名为“out”。 然后在文件上执行循环。 对于每个文件,获取输入流以读取名为“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(); 
+0

大,非常感谢我现在好理解并最终能够解决这个问题。 – jpl

相关问题