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

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

            }

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

最佳答案

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

关于Java:将 InputStreamReader 读取到字符串 - 添加额外的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25966381/

相关文章:

java - Apache 的 Java XMLRPC 库的问题

java - 下载完成后如何隐藏微调器(进度条)?

Java类加载

Java Weka获取具有给定属性值的所有实例

c# - 在 C# 中即时解压缩

java - 如何将 XML 文件直接写入 zip 存档?

java - Android 静态函数

c# - 如何使用 SharpZipLib 从 zip 文件中提取文件夹?

linux - 如何解决 linux 操作系统中的 "unzip: cannot find or open"错误

c# - 压缩文件夹后所有 zip 条目更改编码