Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:ReadInputStreamReader到字符串-添加额外字符_Java_Zip - Fatal编程技术网

Java:ReadInputStreamReader到字符串-添加额外字符

Java:ReadInputStreamReader到字符串-添加额外字符,java,zip,Java,Zip,我使用zip4j在Android中提取zip文件。我想从zip文件中读取一个文件,而不将其保存在某个地方。我已经让它工作,但它会在文件末尾添加额外的字符。额外字符是先前文件的一部分 is = zipFile.getInputStream(fileHeader); InputStreamReader isr = new InputStreamReader(is, "UTF-8"); ArrayList<String> list = n

我使用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);

            }
is=zipFile.getInputStream(文件头);
InputStreamReader isr=新的InputStreamReader(即“UTF-8”);
ArrayList=新建ArrayList();
char[]buffer=新字符[BUFF_SIZE];
while(isr.read(buffer,0,buffer.length)!=-1){
字符串ans=新字符串(缓冲区);
//strUnzipped+=新字符串(缓冲区);
strUnzipped+=ans;
列表。添加(ans);
}

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

buffer变量不知道先前的
读取的
放入了多少个字符。您需要记录读取操作的结果,并将其用于字符串构造:

    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();
或者,如果您想要一个
列表
,其中每个条目都是文件中的一行,那么:

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

常见问题。您没有正确使用
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);
这更像是缓冲区没有被清除,它只替换了缓冲区的一部分

这更像是缓冲区停留在建议的读取计数之外。缓冲区不会被“清除”