2009-11-12 42 views
26

創建一個輸入流我有包裝ZipEntrys一類,但我掙扎,看我怎麼可以那麼寫,返回從任何一個ZipEntry的輸入流的方法。我設法寫了一些可以返回ZipFile輸入流數組的東西,但是我需要一種方法從一個ZipEntry中獲取輸入流。如何從一個ZipEntry的

+3

請看:http://stackoverflow.com/questions/3233555/is-it-possible-to-get-a-zipentrys-inputstream-from-a-zipinputstream – diyism 2012-06-21 03:45:20

回答

20

你沒有從中ZipEntry的是源zip文件實例?如果你可以使用ZipFile.getInputStream(ZipEntry)。

https://docs.oracle.com/javase/8/docs/api/java/util/zip/ZipFile.html

PS。只需快速查看代碼,ZipEntry不是zip文件中底層數據的包裝。據我所知,它只是一個條目的「佔位符」(即壓縮文件屬性而不是數據)。實際的流是通過ZipFile類中的JNI調用創建的。這意味着我不相信你能夠以實際的方式做你想要做的事情。

+0

馬爾科姆,感謝您的幫助,我剛剛找到了這個方法。我現在的問題是最初打開zip文件的代碼(當你做ZipFile zip = new ZipFile(「path」);)時,然後關閉它。如果我想要,我可以阻止它關閉它,但是我想知道 - 不關閉拉鍊/罐子的後果是什麼?顯然,如果我刪除了close()命令,我會留下一個方法,以便用戶稍後關閉它,但我想知道如果用戶忘記了會發生什麼 - 只是貪婪的內存? 我知道這是不是爲數據的包裝 - 我正在寫,是對付郵編/ Jar文件的包裝。 – Stephen 2009-11-12 16:28:44

+1

讓它開着對我來說不是一個好主意。同樣如此,推遲關閉您的解決方案的用戶責任。一個選項(可能 - 我猜你正在解決的問題)是包裝ZipEntry幷包含它在包裝類中的ZipFile句柄。這似乎有點沉重,但意味着您可以在需要時打開\關閉流包裹的zip條目。 – 2009-11-13 05:49:06

27

這個怎麼樣?

ZipFile zipFile = new ZipFile("file.zip"); 
ZipEntry zipEntry = zipFile.getEntry("fileName.txt");  
InputStream inputStream = zipFile.getInputStream(zipEntry); 
+0

+1代碼片段。 – 2009-11-12 15:45:19

+1

不幸的是,創建一個ZipFile的新實例泄漏1.4.2_12中的文件句柄 – 2010-09-20 10:37:05

4
static void printInputStream(File zip) throws IOException 
    { 
     ZipInputStream zin = new ZipInputStream(new FileInputStream(zip)); 
     for (ZipEntry zipEntry;(zipEntry = zin.getNextEntry()) != null;) 
     { 
      System.out.println("reading zipEntry " + zipEntry.getName()); 
      Scanner sc = new Scanner(zin); 
      while (sc.hasNextLine()) 
      { 
       System.out.println(sc.nextLine()); 
      } 
      System.out.println("reading " + zipEntry.getName() + " completed"); 
     } 
     zin.close(); 
    } 

有人在這裏找到:
getInputStream for a ZipEntry from ZipInputStream (without using the ZipFile class)

誤區什麼是從壓縮文件打開輸入流。 解決方案:從zip文件 ZipInputStream zipInputStream = ZipInputStream(new FileInputStream(zipfile), 運行週期zipInputStream.getNextEntry()開放的輸入流。 對於每一輪,您都有當前輸入的輸入流(之前爲zip文件打開); ..