2012-06-19 47 views
5

Có cách nào để tìm/ước tính kích thước của ZipInputStream trước khi chúng tôi đọc toàn bộ luồng không?Lấy kích thước của ZipInputStream

Ví dụ: chúng tôi có thể lấy siêu dữ liệu của mục nhập bằng getNextEntry trước khi chúng tôi có thể đọc dữ liệu người dùng.

Inputstream có phương thức available() để trả về ước tính số byte có thể đọc từ luồng đầu vào này nhưng tôi không thể tìm thấy phương thức tương tự cho ZipInputStream.

+0

Bạn có quyền truy cập vào ZipFile nơi luồng đến từ đâu không? – Thilo

+0

Không. Chúng tôi chỉ có một luồng vào. Tôi muốn biết liệu có cách nào khác để lấy siêu dữ liệu trước khi đọc toàn bộ luồng không. –

Trả lời

1

ZipInputStream có phương pháp có sẵn() nhưng nó sẽ trả về 0 hoặc 1.

Để có được kích thước ước tính của bất kỳ kiểu file nào, bạn có thể sử dụng FileInputStream và sau đó để đọc file zip sử dụng ZipInputStream. Ví dụ:

public class ZipUtil { 

    public static void main(String[] args) throws Exception { 
     ZipInputStream zis = null; 

     FileInputStream fis = new FileInputStream("C:/catalina.zip"); 
     int size = fis.available(); 
     System.out.println("size in KB : " + size/1024); 
     zis = new ZipInputStream(fis);   

     ZipEntry ze; 
     while ((ze = zis.getNextEntry()) != null) { 
      System.out.println(ze.getName()); 
     } 
    } 
} 
+0

Vấn đề với cách tiếp cận này là tôi không có một tệp zip mà tôi có thể tạo thành một FileInputStream. Tôi chỉ có một ZipInputStream để làm việc với. –

+0

Vui lòng chia sẻ mã của bạn để hiểu rõ hơn yêu cầu của bạn –

+1

Có một cảnh báo cụ thể trong Javadoc dựa vào việc sử dụng giá trị có sẵn() làm tổng kích thước. – EJP

2

Nếu bạn chỉ có luồng, thì tôi không nghĩ vậy.

zip file format chỉ có một chuỗi mục nhập và sau đó là thư mục chung (có bảng tất cả các tệp và kích thước của chúng) ở cuối. Vì vậy, không có quyền truy cập vào tệp, bạn sẽ không nhận được thông tin đó.

1

InputStream có một phương pháp có sẵn() để trả về một ước tính số byte có thể được đọc từ này input stream

mà không ngăn chặn. Không giống nhau. Có một cảnh báo cụ thể trong Javadoc về số không coi giá trị này là tổng kích thước tệp.

nhưng tôi không thể tìm thấy phương thức tương tự cho ZipInputStream.

Điều đó thật lạ vì nó ở đó. Tuy nhiên nó trả về số không, đó là ước tính tốt nhất nó có thể làm cho bao nhiêu có thể được đọc mà không bị chặn.

Tại sao? Bởi vì (a) đó là một luồng, và (ii) đó là một luồng nén. Không có cách nào để biết có bao nhiêu mà không đọc tất cả; và không có cách nào biết được số lượng đó có thể được đọc mà không chặn,

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