这似乎是一件非常愚蠢的事情,但我看不出我做错了什么。 我有一个包含多个 zip 文件的文件夹。每个 zip 文件至少包含一个名为 sometingXYZsomething 的文件。我想读取每个文件 sometingXYZsomething 而不解压每个 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,其中包含一个 txt 文档 testFileXYZ.txt,我收到此异常
java.nio.file.NoSuchFileException: testFileXYZ.txt
testFileXYZ.txt
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)
如何在不解压的情况下获取 zip 中的 txt 文件流?
最佳答案
您遇到的问题是您实际上并未解压缩 ZipFile 的内容。 ZipFile.stream() 允许您迭代 Zip 元数据(Zip 中的文件名列表),但实际上并不解压缩内容供您阅读。为此,您需要使用从 ZipFile 获取的 InputStream,然后读取它以获取内容。我在下面提供了一个例子。还有其他方法可以做到这一点(例如使用 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();
}
}
关于Java Nio Zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49254998/