关于阅读 java 中的 ZipInputStream/ZipEntry 的问题

Question about reading from a ZipInputStream/ZipEntry in java

场景:我有调用 soap Web 服务的代码,获取一个 zip 文件附件。然后解压,遍历所有文件,得到一个我想要的文件,是一个csv文件,得到csv文件的内容:

public static void unzipTry2(AttachmentPart att) throws IOException, SOAPException {
    try (ZipInputStream zis = new ZipInputStream(att.getRawContent())) {
        byte[] buffer = new byte[1024];
        for (ZipEntry zipEntry = zis.getNextEntry(); zipEntry != null; zipEntry = zis.getNextEntry()) {
            if (zipEntry.isDirectory()) {
                continue;
            }
            if (!zipEntry.getName().equals("FileIwant.csv")) {
                continue; //if it's not the file I want, skip this file
            }
            System.out.println(zipEntry.getName());
            for (int len = zis.read(buffer); len > 0; len = zis.read(buffer)) {
                //System.out.write(buffer, 0, len);
                String testString = new String(buffer,0,len);
                processCSVString(testString);
            }

        }
    }
}

它工作得很好。然而,我得到的 CSV 文件只包含一行,这是现在预期的,但将来它可能包含多行。由于它是一个 CSV 文件,我需要逐行解析。此代码还必须适用于 CSV 文件包含多行的情况,这就是我不确定它是否有效的地方,因为无法测试它(我不控制此方法的输入,所有来自网络服务)。

你能告诉我内部for循环是否逐行读取文件的内容吗? :

            for (int len = zis.read(buffer); len > 0; len = zis.read(buffer)) {
                //System.out.write(buffer, 0, len);
                String testString = new String(buffer,0,len);
                processCSVString(testString);
            }

BufferedReader is the Java "thing" which can read a Reader line-by-line. And the glue what you need is InputStreamReader。然后你可以将 ZipInputStream 包装为

BufferedReader br=new BufferedReader(new InputStreamReader(zis))

(最好在 try-with-resources 块中),从 BufferedReader 读取的经典循环如下所示:

String line;
while((line=br.readLine())!=null){
    <process one line>
}