2017-07-31 89 views
-1

我已经搜索了一个方法来做到这一点,寻找各种方式来解决这个问题,但他们都没有为我工作。Java - 以编程方式将文件追加到Jar文件

我只需要一种将文件附加到Jar文件的方式,如果它们已经存在,就会覆盖文件,并且我也希望以最快的方式执行此操作。我试图将其转换为Zip文件并使用Zip文件系统添加文件,但是我遇到了诸如“zip END header not found”之类的错误,其他方法可以正常工作,但速度很慢(6 MB文件需要3分钟)。

将文件追加到Jar文件的最快方法是什么?

编辑:是的,继续前进,downvote而不是回答,非常有成效。

+1

你能指定你试过的方法花费的时间太长吗? – Matt

+0

我无法完全记得,但我使用了一个文件流来提取Jar文件的内容。我认为这是类似于这个顶部的答案https://stackoverflow.com/questions/1529611/how-to-write-a-java-program-which-can-extract-a-jar-file-and-store -its-data-in-s然后我使用其他方法添加文件并将整个文件重命名为.jar – QuantumVertex

+0

您可以使用任何ZIP处理库,这里有很多。我会去truezip – Marged

回答

1

你应该这样做,你更新一个文本文件的方式:

  • 打开从当前文件的输入流。
  • 打开输出流到新(临时)文件。
  • 从输入流中读取:
    • 如果不需要更改,请写入输出流。
    • 如果应删除内容,请不要编写它。
    • 如果内容应该改变,改变它,然后写下来。
    • 如果此时应添加新内容,请立即写入。
    • 重复,直到处理完所有内容。
  • 关闭两个流。
  • 删除/重命名旧文件并将新文件重命名为旧文件。

在你的情况,这意味着:

  • 开始对文件的列表以复加。
  • 在当前Jar文件上打开ZipInputStream。 (临时)Jar文件上打开ZipOutputStream
  • 复制所有现有条目(文件),但将被替换的文件除外。
  • 插入所有新文件。
  • 关闭两个流。
  • 删除/重命名旧Jar文件并将新文件重命名为旧Jar文件。

你当然可以翻转订单。

  • 在新(临时)Jar文件上打开ZipOutputStream
  • 插入所有新文件,并记住它们的名称。
  • 在当前Jar文件上打开ZipInputStream
  • 复制所有现有条目(文件),除已添加的文件外。
  • 关闭两个流。
  • 删除/重命名旧Jar文件并将新文件重命名为旧Jar文件。
+0

如何复制现有文件**除**将被替换的文件?流以字节为单位复制数据(从我的理解中),那么如何识别整个文件已被复制并获取其名称? @Andreas – QuantumVertex

+0

怀疑已被证实:https://stackoverflow.com/questions/4930111/get-file-name-from-fileoutputstream我不能复制除了替换的使用流的所有文件。 – QuantumVertex

+0

@QuantumVertex该链接与任何内容有什么关系?你甚至可以看看ZipInputStream是如何工作的吗?也许如果你阅读它的文档,你会意识到我所描述的是完全可能的,因为zip *条目*的文件名是**给你的**。 – Andreas