我正在使用 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/