Вопрос о чтении из ZipInputStream / ZipEntry в Java - PullRequest
0 голосов
/ 10 июля 2019

Сценарий: у меня есть код, который вызывает мыльный веб-сервис, получает вложение в виде 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, мне нужно проанализировать LINE BY LINE.Этот код также должен работать для случая, когда файл CSV содержит несколько строк, и именно здесь я не уверен, работает ли он, поскольку нет способа проверить это (я не контролирую ввод этого метода, что всеисходит из веб-службы).

Можете ли вы сказать мне, читает ли внутренний цикл for содержимое файла LINE by LINE?:

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

1 Ответ

0 голосов
/ 10 июля 2019

BufferedReader - это «вещь» Java, которая может построчно читать Reader. И клей, что вам нужно, это InputStreamReader. Тогда вы можете обернуть ZipInputStream как

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

(желательно в блоке try-with-resources), и классический цикл чтения из BufferedReader выглядит следующим образом:

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