Чтение текстовых файлов в zip-архиве - PullRequest
21 голосов
/ 17 декабря 2010

У меня есть zip-архив, который содержит кучу простых текстовых файлов. Я хочу проанализировать данные каждого текстового файла. Вот что я написал до сих пор:

try {
    final ZipFile zipFile = new ZipFile(chooser.getSelectedFile());
    final Enumeration<? extends ZipEntry> entries = zipFile.entries();
    ZipInputStream zipInput = null;

    while (entries.hasMoreElements()) {
        final ZipEntry zipEntry = entries.nextElement();
        if (!zipEntry.isDirectory()) {
            final String fileName = zipEntry.getName();
            if (fileName.endsWith(".txt")) {
                zipInput = new ZipInputStream(new FileInputStream(fileName));
                final RandomAccessFile rf = new RandomAccessFile(fileName, "r");
                String line;
                while((line = rf.readLine()) != null) {
                    System.out.println(line);
                }
                rf.close();
                zipInput.closeEntry();
            }
        }
    }
    zipFile.close();
}
catch (final IOException ioe) {
    System.err.println("Unhandled exception:");
    ioe.printStackTrace();
    return;
}

Нужен ли для этого файл RandomAccessFile? Я потерялся в точке, где у меня есть ZipInputStream.

1 Ответ

38 голосов
/ 17 декабря 2010

Нет, вам не нужно RandomAccessFile. Сначала получите InputStream с данными для этой записи файла zip:

InputStream input = zipFile.getInputStream(entry);

Затем оберните его в InputStreamReader (для декодирования из двоичного файла в текст) и BufferedReader (для чтения строки за раз):

BufferedReader br = new BufferedReader(new InputStreamReader(input, "UTF-8"));

Тогда читайте строки из него как обычно. Оберните все соответствующие биты в try/finally блоках, как обычно, чтобы закрыть все ресурсы.

...