2013-02-08 13 views
5

Mam plik o nazwach takich jak ex.zip. W tym przykładzie plik Zip zawiera tylko jeden plik o tej samej nazwie (np. "Ex.txt"), który jest dość duży. Nie chcę rozpakowywać pliku ZIP za każdym razem. Dlatego muszę przeczytać zawartość pliku (ex.txt) bez wyodrębniania pliku zip. Spróbowałem trochę kodu jak poniżej Ale mogę tylko odczytać nazwę pliku w zmiennej.Jak odczytywać zawartość spakowanego pliku bez wyodrębniania w java

Jak odczytać zawartość pliku i zapisać go w zmiennej?

góry dziękuję

fis=new FileInputStream("C:/Documents and Settings/satheesh/Desktop/ex.zip"); 
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 
ZipEntry entry; 

while((entry = zis.getNextEntry()) != null) { 
    i=i+1; 
    System.out.println(entry); 
    System.out.println(i); 
    //read from zis until available 
} 
+1

Jak napisano, Twoje pytanie jest bardzo niejasna. Czy chcesz wyodrębnić pliki z ZIP, czy nie? Jaki * konkretny problem * próbujesz rozwiązać? – parsifal

+0

Bye the way: Navigation Sytems robią to w ten sam sposób, przechowują cyfrowe dane map drogowych skompresowane w pamięci głównej i rozpakowują części na żądanie – AlexWien

Odpowiedz

5

Twój pomysł jest do odczytu pliku zip jak jest do tablicy bajtów i przechowywać ją w zmiennej. Później, kiedy trzeba zip rozpakować go na żądanie, oszczędzając pamięć:

Najpierw należy przeczytać zawartość pliku ZIP w tablicy bajtów zipFileBytes

Jeśli masz Java 1.7:

Path path = Paths.get("path/to/file"); 
byte[] zipFileBytes= Files.readAllBytes(path); 

inaczej używać Appache.commons lib

byte[] zipFileBytes; 
zipFileBytes = IOUtils.toByteArray(InputStream input); 

teraz Twój ZIP plik jest przechowywany w zmiennej zipFileBytes, nadal w formie skompresowanej.

Wtedy, gdy trzeba wyodrębnić użyć czegoś

ByteArrayInputStream bis = new ByteArrayInputStream(zipFileBytes)); 
ZipInputStream zis = new ZipInputStream(bis); 
4

Spróbuj tego:

 ZipFile fis = new ZipFile("ex.zip"); 

     int i = 0; 
     for (Enumeration e = zip.entries(); e.hasMoreElements();) { 
      ZipEntry entry = (ZipEntry) e.nextElement(); 
      System.out.println(entry); 
      System.out.println(i); 

      InputStream in = fis.getInputStream(entry); 

     } 

Na przykład, jeśli plik zawiera tekst, a chcesz, aby wydrukować ją jako ciąg, można przeczytaj InputStream w ten sposób: Read/convert an InputStream to a String

2

Myślę, że w twoim przypadku fakt, że plik zip jest kontenerem, który może pomieścić wiele plików (a tym samym zmusza do nawigacji) do prawego zawartego pliku za każdym razem, gdy go otwierasz) poważnie komplikuje sytuację, ponieważ stwierdzasz, że każdy plik zip zawiera tylko jeden plik tekstowy. Być może o wiele łatwiej jest po prostu zgasić plik tekstowy (gzip nie jest kontenerem, tylko skompresowaną wersją danych). I to jest bardzo prosty w obsłudze:

GZIPInputStream gis = new GZIPInputStream(new FileInputStream("file.txt.gz")); 
// and a BufferedReader on top to comfortably read the file 
BufferedReader in = new BufferedReader(new InputStreamReader(gis)); 

je Produkcja jest równie prosta:

GZIPOutputStream gos = new GZIPOutputStream(new FileOutputStream("file.txt.gz")); 
+0

To nie jest odpowiedź, on chce skompresować zip w zmiennej. Cytat: Nie chcę wyodrębniać na dysku pliku zip za każdym razem, a następnie czytać jego dane. – AlexWien

+0

@AlexWien To nie pozwala, pozwala tylko odczytać zawartość (bajt po bajcie lub jak pokazano linia po linii) ** bez poszerzenie ** całego pliku naraz i zrozumiałem, że właśnie to jest PO. Chciałem tylko wskazać alternatywę dla skompresowania plików, z którymi łatwiej pracować niż plik zip. Przechowywanie pliku zip jako takiego w zmiennej imo nie ma praktycznego zastosowania. – fvu

+0

Nie jest jasne, czego chciał, może chciał, aby to, co twoje rozwiązanie, rozpakuj whitout tworząc nowy plik na dysku. Nie zawsze głupie jest przechowywanie pliku zip w zmiennej: jego sposób jest szybszy do rozpakowania z tablicy bajtów niż czytanie z pliku: Wyobraź sobie, że musisz rozpakować 100 razy drugi, nie możesz tego zrobić z dostępem do dysku, na wbudowanym urządzeniu z niska pamięć podręczna. Istnieje wiele aplikacji: np. Systemy do porównywania map, które obliczają tor, którym pojazd jechał w dwóch dużych krajach: odczytywanie z dysku byłoby zwolnione – AlexWien

Powiązane problemy