2013-03-26 79 views
0

我有一個下面提到的java類,它提取一個zip,並逐個將其內容轉換爲字符串並打印到控制檯。
問題是,當zip內的文件大〜80KB時。整個內容沒有被顯示(只有3/4的數據被轉換爲字符串並在控制檯中顯示)。
其次,下面提到的代碼是在介於兩者之間的空/空間以及如果文件大小很小〜1KB無法使用ZipInputStream處理zip文件中的大文件

下面提到的代碼中出現了什麼問題。

public static void main(String[] args) throws Exception { 
    byte[] buf = new byte[1024]; 
    final int BUFFER = 1024; 
    String fName = "c:\\DOC00001.zip"; 
    ZipInputStream zinstream = new ZipInputStream(
      new FileInputStream(fName)); 
    ZipEntry zentry = zinstream.getNextEntry(); 

    while (zentry != null) {    
    byte data[] = new byte[BUFFER]; 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    while ((zinstream.read(data, 0, BUFFER)) != -1) { 
     out.write(data); 
    }  
    InputStream is = new ByteArrayInputStream(out.toByteArray()); 
    StringWriter writer = new StringWriter(); 
    IOUtils.copy(is, writer, "UTF-8"); 
    String response = writer.toString(); 
    System.out.println(response); 
    zentry = zinstream.getNextEntry(); 
    } 
    zinstream.close(); 
} 

回答

0

read方法不能保證讀緩衝區滿;返回已讀取的字節數。提取從一個zip文件,或任何一般InputStream數據的正確方法,是:

byte[] data = new byte[BUFFER]; 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
int bytesRead; 
while ((bytesRead = zinstream.read(data, 0, BUFFER)) != -1) { 
    out.write(data, 0, bytesRead); 
} 

或者,因爲你已經在使用IOUtils

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
IOUtils.copy(zinstream, out); 

或者,因爲你寫一個ByteArrayOutputStream只能稍後寫入一個字符串,您可以完全跳過ByteArrayOutputStream

while (zentry != null) { 
    StringWriter writer = new StringWriter(); 
    IOUtils.copy(zinstream, writer, "UTF-8"); 
    String response = writer.toString(); 
    System.out.println(response); 
    zentry = zinstream.getNextEntry(); 
}