2014-09-22 201 views
0

我正在使用zip4j在Android中提取zip文件。我想從zip文件中讀取一個文件而不保存在某個地方。我有它的工作,但它增加了文件末尾的額外字符。額外的字符是前面文件的一部分。Java:將InputStreamReader讀取爲字符串 - 添加額外字符

is = zipFile.getInputStream(fileHeader); 

      InputStreamReader isr = new InputStreamReader(is, "UTF-8"); 

      ArrayList<String> list = new ArrayList<String>(); 
      char[] buffer = new char[BUFF_SIZE]; 
      while (isr.read(buffer, 0, buffer.length) != -1) { 
       String ans = new String(buffer); 
       //strUnzipped += new String(buffer); 
       strUnzipped += ans; 
       list.add(ans); 

      } 

我已經使用該列表來查看額外字符的插入位置。它插在最後一行。以及來自上一行的額外文本。在某種程度上,它更像是緩衝區沒有被清除,而只是替換了緩衝區的一部分。

回答

1

buffer變量沒有關於先前read放置在其中的多少個字符的概念。你需要記錄的讀取操作的結果,並在你的字符串建築使用它:

int charsRead; 
    while ((charsRead = isr.read(buffer, 0, buffer.length)) != -1) { 
     String ans = new String(buffer, 0, charsRead); 
     ... 
    } 

然而,這是讀什麼書大概是文本內容的好辦法。如果你想建立一個包含文件內容的巨大的字符串,你可以:

StringBuilder sb = new StringBuilder(); 
    while ((charsRead = isr.read(buffer, 0, buffer.length)) != -1) { 
     sb.append(buffer, 0, charsRead); 
    } 
    strUnzipped = sb.toString(); 

或者,如果你想要一個List<String>每個條目是從此文件一行:

LineNumberReader lnr = new LineNumberReader(isr); 
    String inputLine; 
    while((inputLine = lnr.readLine()) != null) { 
     list.add(inputLine); 
    } 
1

常見問題。您沒有正確使用read()返回的值。

while (isr.read(buffer, 0, buffer.length) != -1) { 
    String ans = new String(buffer); 

應該

int count; 
while ((count = isr.read(buffer)) != -1) { 
    String ans = new String(buffer, 0, count); 

它更像緩衝區沒有得到清除,並且只更換緩衝的一部分。

它更像是緩衝區保持了超出讀取次數的建議。緩衝區不會被「清除」。