2013-02-08 71 views
5

Tôi có tệp có tên như ex.zip. Trong ví dụ này, tệp Zip chỉ chứa một tệp có cùng tên (ví dụ: 'ex.txt'), tệp này khá lớn. Tôi không muốn trích xuất các tập tin zip mỗi time.Hence tôi cần phải đọc nội dung của tập tin (ex.txt) mà không cần giải nén các tập tin zip. Tôi đã thử một số mã như dưới đây Nhưng tôi chỉ có thể đọc tên của tập tin trong biến.Cách đọc nội dung của tệp được nén mà không cần giải nén trong java

Làm cách nào để đọc nội dung của tệp và lưu trữ trong biến?

Cảm ơn bạn trước

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

Theo văn bản, câu hỏi của bạn là rất rõ ràng. Bạn có muốn trích xuất tệp từ ZIP hay không? * Vấn đề cụ thể * bạn đang cố gắng giải quyết? – parsifal

+0

bye cách: Navigation Sytems làm theo cùng một cách, họ giữ dữ liệu bản đồ đường kỹ thuật số của họ được nén trong bộ nhớ chính, và giải nén các bộ phận theo yêu cầu – AlexWien

Trả lời

5

Ý tưởng của bạn là để đọc các tập tin zip vì nó là vào một mảng byte và lưu nó trong một biến. Sau này khi bạn cần zip bạn giải nén nó theo yêu cầu, tiết kiệm bộ nhớ:

Đầu đọc nội dung của file Zip trong một mảng byte zipFileBytes

Nếu bạn có Java 1.7:

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

nếu không sử dụng Appache.commons lib

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

Bây giờ Zip của bạn tệp được lưu trữ trong một biến zipFileBytes, vẫn ở dạng nén.

Sau đó, khi bạn cần phải giải nén cái gì đó sử dụng

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

Hãy thử điều này:

 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); 

     } 

Ví dụ, nếu các tập tin chứa văn bản và bạn muốn in nó như là một String, bạn có thể đọc InputStream như thế này: Read/convert an InputStream to a String

2

Tôi nghĩ rằng trong trường hợp của bạn thực tế là tệp zip là một vùng chứa có thể chứa nhiều tệp (và do đó buộc bạn điều hướng bên phải chứa tập tin mỗi khi bạn mở nó) nghiêm trọng phức tạp mọi thứ, như bạn nói rằng mỗi zipfile chỉ chứa một textfile. Có lẽ nó dễ dàng hơn nhiều để chỉ gzip các tập tin văn bản (gzip không phải là một container, chỉ là một phiên bản nén dữ liệu của bạn). Và nó rất đơn giản để sử dụng:

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)); 

Sản xuất họ cũng không kém phần đơn giản:

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

Đó không phải là câu trả lời, anh ta muốn zip ở dạng nén trong một biến. Trích dẫn: Tôi không muốn trích xuất trên đĩa tệp zip mỗi lần và sau đó đọc dữ liệu của nó – AlexWien

+0

@AlexWien Nó không, nó chỉ cho phép đọc nội dung (byte byte hoặc như được hiển thị từng dòng) ** mà không có mở rộng ** toàn bộ tập tin cùng một lúc, và đó là sự hiểu biết của tôi rằng đó là những gì OP là sau. Tôi chỉ muốn chỉ ra một giải pháp thay thế để nén các tệp dễ làm việc hơn là tệp zip. Lưu trữ một tập tin zip như vậy trong một biến imo không có ứng dụng thực tế. – fvu

+0

Nó không rõ ràng, những gì ông muốn, có thể ông muốn rằng những gì giải pháp của bạn, giải nén whitout tạo ra một tập tin mới trên đĩa. Nó không phải lúc nào cũng ngớ ngẩn để giữ một tập tin zip trong một avariable: cách của nó fasther để giải nén từ một mảng byte hơn đọc từ một tập tin: Hãy tưởng tượng bạn phải giải nén 100 lần thứ hai, bạn không thể làm điều đó với acces đĩa, trên một thiết bị ebedded bộ nhớ cache thấp. Có rất nhiều ứng dụng: ví dụ: các hệ thống khớp bản đồ, tính toán đường đi mà một chiếc xe đang lái xe ở hai quốc gia lớn: Đọc từ đĩa sẽ chậm – AlexWien

Các vấn đề liên quan