我正在从数据库中读取数据并将其写入缓冲的写入器以创建固定宽度的文件。我也正在读取相同的数据并将其转换为BSON文件,稍后由Mongo DB加载。
完成上述过程后,我可以为这两个文件创建一个jar文件,然后通过网络传输它们。
但是为了节省时间我被建议动态压缩数据并创建一个jar文件,这样的事情
JarOutputStream jarOutPutStream = new JarOutputStream(
new FileOutputStream(new File(file.getName() + ".jar")));
Writer bufferedWriter = new BufferedWriter(
new OutputStreamWriter(jarOutPutStream, "UTF-8"));
当我执行上述操作并添加以下代码时,我可以动态创建一个jar文件。
JarEntry ze = new JarEntry("temp.log");
jarOutPutStream.putNextEntry(ze);
这个jar有一个条目temp.log但是我想知道如何将其他FileOutputStream
与上面的jar相关联。
我的输出应该是一个包含两个条目的jar文件:一个用于固定宽度文件,另一个用于BSON文件。
答案 0 :(得分:1)
首先,如果您想要缓冲I / O,那么我强烈建议将缓冲区放在 Jar流下而不是顶部:
JarOutputStream jarOutPutStream = new JarOutputStream(
new BufferedOutputStream(
new FileOutputStream(new File(file.getName() + ".jar"))));
如果您操纵包装的流和包装流,则需要非常小心以避免损坏您的数据,因为您似乎打算通过包装Jar流来实现。
其次,鉴于你的问题,file.getName() + ".jar"
有点可疑。它没有任何问题,只要它产生一个构成有效文件名的字符串,但不要认为Jar文件的名称与其内容有任何内在联系。
第三,我不确定您是否认识到尽管您的示例代码演示了如何使用单个条目创建Jar文件,但它并未演示实际为该条目添加任何数据。您需要通过在调用JarOutputStream
后将条目的数据写入putNextEntry()
来执行此操作。
第四,并直接回答您的问题,在为第一个条目写入数据后,通过创建适当的ZipEntry
并再次在您的流上调用putNextEntry()
,为第二个文件添加条目,与那个条目。然后编写 条目的数据。
第五,如果您不需要在服务器上保留两个未压缩的文件,那么您首先不需要将它们创建为文件。相反,您可以将每个人的数据直接写入JarOutputStream
(连续),而不是写入单独的文件或内存,然后复制数据。
第六,如果您不需要在服务器上保留Jar文件,那么您可以将其直接写入响应流,而不是中间文件。是否或如何执行此操作取决于您提供响应的方式。
第七,有没有特别的理由使用Jar代替Zip?它们是相同的东西,除了有效的Jar文件包含一个清单,你似乎不需要这里。上面描述的所有内容都可以使用ZipOutputStream
和JarOutputStream
(事实上,它是ZipOutputStream
的子类)以相同的方式完成。
答案 1 :(得分:0)
JAR文件实际上是ZIP文件。 ZIP文件不允许在其中非连续存储单个文件。也就是说,文件1完全(压缩)出现在(或之后,取决于索引)文件2之前。
我认为这使得无法将两个或多个流流式传输到一个ZIP流中。看起来您可以将一个文件流式传输到ZIP OK,但需要缓存另一个文件并稍后将其添加到ZIP中。
您是否被迫使用ZIP格式?您希望查看支持 interleaved 数据的容器格式。在那里,一个文件1块可以与另一个文件2块交替,这样你就可以迭代地从任一文件中发出块。