Это кажется действительно глупым, но я не понимаю, что делаю неправильно. У меня есть папка с несколькими 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-архиве, не распаковывая его?




Проблема в том, что вы фактически не распаковываете содержимое 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();
}
}
Правда, это лишний шаг. Я обновляю код