2014-02-15 65 views
3

我使用了Apache壓縮圖書館閱讀.tar.gz文件,像這樣:提取tar.gz文件在Java中

final TarArchiveInputStream tarIn = initializeTarArchiveStream(this.archiveFile); 
    try { 
     TarArchiveEntry tarEntry = tarIn.getNextTarEntry(); 
     while (tarEntry != null) { 
      byte[] btoRead = new byte[1024]; 
      BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(destPath)); //<- I don't want this! 
      int len = 0; 
      while ((len = tarIn.read(btoRead)) != -1) { 
       bout.write(btoRead, 0, len); 
      } 
      bout.close(); 
      tarEntry = tarIn.getNextTarEntry(); 
     } 
     tarIn.close(); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 

是否有可能不提取到一個單獨的這文件,並以某種方式在內存中讀取它?也許成爲一個巨大的字符串或什麼?

+0

爲什麼你想這樣做? –

回答

3

是否有可能不將這個提取到一個單獨的文件中,並以某種方式在內存中讀取它?也許成爲一個巨大的字符串或什麼?

是的,

只需替換打開文件的內部循環中的代碼,然後用代碼寫入ByteArrayOutputStream ...或一系列這樣的流中即可。

從TAR中讀取的數據的自然表示(如那樣)將是字節/字節數組。如果字節是正確編碼的字符,並且您知道正確的編碼,則可以將它們轉換爲字符串。否則,最好將數據保留爲字節。 (如果您嘗試將非文本數據轉換爲字符串,或者如果您使用錯誤的字符集/編碼進行轉換,則可能會使其不可逆轉地發生錯誤。)

顯然,您需要考慮一些這些問題你自己,但基本的想法應該工作......只要你有足夠的堆空間。

0

btoread的值複製到像

的String =將String.valueOf(byteVar)一字符串;

和打手附加字節值到文件的字符串,直到結束時達到..

5

你可以用ByteArrayOutputStream替換文件流。

即替換此:

BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(destPath)); //<- I don't want this! 

與此:

ByteArrayOutputStream bout = new ByteArrayOutputStream(); 

,然後關閉bout後,用bout.toByteArray()得到字節。