Java:将InputStreamReader读取到String - 添加额外的字符

时间:2014-09-22 03:40:29

标签: java zip

我使用zip4j在Android中提取zip文件。我想从zip文件中读取一个文件而不保存它。我有它的工作,但它在文件的末尾添加额外的字符。额外的字符是之前文件的一部分。

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

            }

我使用列表查看插入多余字符的位置。它插在最后一行。以及来自前一行的额外文本。在某种程度上,它更像是缓冲区没有被清除,它只替换了部分缓冲区。

2 个答案:

答案 0 :(得分: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 :(得分: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);
  

它更像缓冲区没有被清除,它只替换了部分缓冲区。

它更像是缓冲区保持超出建议的读取计数。缓冲区没有被清除&#39;。