我使用一种方法使用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文件写入正确的文件夹。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分: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();
发生了什么事? 打开一个zip输出流,名为“out”。 然后对文件执行循环。 对于每个文件,获取输入流以读取名为“in”的文件字节。 然后将一个条目添加到zip输出流中。添加它会准备输出流以接收该条目的数据。之后,将输入流写入输出流,关闭该条目(对于循环中下一个文件的下一个条目进行修复),最后关闭zip输出流。
好吧,你所要做的就是遍历你的文件(目前在“m_objectToWrite”中)而不是磁盘文件。然后,您要求xml输出器将文档写入输出流,而不是从输入流复制到输出流。几乎相同的概念“在逻辑世界中,字节从输入到输出”。但是在这里,一些特殊的对象不是手动执行此复制,而是为您执行此操作。 xml输出器。
我会留给你让一切正常工作,比如一条好路径以及文件存储在zip中的位置。但是假设m_objectToWrite是一个“Document”对象,工作代码的框架可能是:(使用上面的代码和本帖中的代码:
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();