2017-01-25 55 views
0

我從webservice xml文件接收gzip格式壓縮的文件。 xml的原始大小約爲80Mb,而壓縮版本大約爲10Mb。這些XML文件存儲在我們的緩存中。替換gzip文件中的內容而不解壓縮

xml根包含表示8位唯一ID的屬性。所以,當我們提供來自緩存的響應時,我們需要在將xml返回給最終用戶之前將其另一個從另一個webservice接收到。

因此,這個過程應該是:

  1. 解壓縮緩存XML。
  2. 將緩存的ID替換爲從Web服務接收到的ID。
  3. 再次壓縮文件並將其返回給客戶端。

這是一個java軟件。我想知道是否有任何選擇來執行這個替換,而不需要解壓縮整個文檔並再次壓縮。任何一種部分讀寫......我不知道。

我一直在尋找一些java庫,可以做到這一點,但我沒有找到任何東西(也許是因爲它是不可能的)。

有什麼想法?謝謝。

+0

你可以顯示代碼在哪裏解壓縮,替換,然後再次壓縮?可能還有待改進的空間 –

+0

尚未編碼,但其想法是:1.使用未壓縮文檔(使用gzipinputstream)創建一個byte []。 2.逐字節替換8位數字(避免任何臨時副本)。 3.使用gzipoutputstream壓縮此字節[]。 – JBalaguero

回答

0

不需要。您必須對其進行解壓縮,至少要查找ID在何處以及如何編碼。然後,你可以a)真正聰明,並找出如何使用當前定義的代碼表重新組合具有不同ID但具有相同位數的流,從本質上解決一個難題(假設它可以被解決),或者b)用新ID重新壓縮整個事物。

如果你在控制壓縮你的起點,你可以專門爲這個流做準備,在ID之前切換到沒有壓縮,刷新塊,存儲塊,在ID之後,然後繼續壓縮。你可以注意到輸出流中的什麼地方。然後,您可以稍後將直接顯示在流中的ID替換爲這些字節。您還需要更新您可以排除的CRC,或者使用原始CRC的原始CRC或舊的未壓縮數據和新的未壓縮數據來更新CRC。這只是舊ID和ID的唯一標識,在填充數據長度前有一堆零和前後的數字。 「原始」CRC是CRC寄存器初始化爲零並且沒有最終的異或的CRC。