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