2017-07-31 85 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