Zip-файл Java Nio

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

 try (Stream<Path> paths = Files.walk(Paths.get(FOLDER_NAME)))
 {

    paths
      .filter(p -> p.toString().contains("XYZ"))
      .forEach(p -> readFileXYZ(Paths.get(p.getName())));

  }
  catch (IOException e)
  {
    e.printStackTrace();
  }

А также

private static void readFileXYZ(Path pathFile)
{    
  try {

    Files.lines(pathFile).forEach(System.out::println);   

  } catch (IOException ex) 
  {
    ex.printStackTrace();
  }
}

В тестовой папке есть один zip, содержащий текстовый документ testFileXYZ.txt, и я получаю это исключение

java.nio.file.NoSuchFileException: testFileXYZ.txt
testFileXYZ.txt
    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)

Как я могу получить поток txt-файла в zip-архиве, не распаковывая его?

Правда, это лишний шаг. Я обновляю код

Mark 13.03.2018 12:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
3 668
1

Ответы 1

Проблема в том, что вы фактически не распаковываете содержимое ZipFile. ZipFile.stream () позволяет вам перебирать метаданные Zip (список имен файлов в Zip), но на самом деле не распаковывает содержимое, чтобы вы могли его прочитать. Для этого вам нужно использовать InputStream, полученный из ZipFile, а затем прочитать его, чтобы получить свой контент. Я привел пример этого ниже. Есть и другие способы сделать это (например, используя ZipInputStream), но я хотел основывать свой пример на коде, который вы предоставили. Надеюсь это поможет!

private static void openZip(String zipPath)
{
    try (ZipFile zipFile = new ZipFile(zipPath))
    {
        zipFile.stream()
                .filter(p -> p.toString().contains("XYZ"))
                .forEach(p -> readFileXYZ(p, zipFile));

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

private static void readFileXYZ(ZipEntry zipEntry, ZipFile zipFile)
{
    try {
        InputStream inputStream = zipFile.getInputStream(zipEntry);
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        String line;

        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
        bufferedReader.close();
    } 
    catch (IOException ex)
    {
        ex.printStackTrace();
    }
}

Другие вопросы по теме