gpt4 book ai didi

java - 在java中获取zip文件夹中的文件作为字符串

转载 作者:行者123 更新时间:2023-11-30 07:01:35 33 4
gpt4 key购买 nike

我可以使用 new String(Files.readAllBytes(Paths.get(path)), StandardCharsets.UTF_8) 获取 String 形式的文本文件。如果文件位于 zip 文件的文件夹中,如何获得相同的结果?我知道我可以将 zip 作为 ZipFile 获取,将文件夹作为 ZipEntry 获取,但我不清楚如何获取文件,也不清楚如何制作 String 出来。我不想创建任何文件或文件夹来获取它。

编辑:根据 dpr 的回答,这是我使用的:

String fileAsString;
try (ZipFile zip = new ZipFile(path)) {
ZipEntry entry = zip.getEntry("folder/file.txt");
if (entry == null) entry = zip.getEntry("folder\\file.txt");
try (InputStream is = zip.getInputStream(entry)) {
try (Scanner s = new Scanner(is, "UTF-8").useDelimiter("\\A")) {
fileAsString = s.hasNext() ? s.next() : "";
}
}
}

最佳答案

从技术上讲,Zip 文件中不存在目录之类的东西。 Zip 文件中的所有内容基本上都是一个条目(Java 中的ZipEntry)。可以使用 isDirectory 方法来确定当前条目是否代表压缩文件系统结构的目录或常规文件。 ZipEntry 的 name 属性始终反射(reflect)原始压缩文件相对于存档根的完整目录层次结构。对于文件 Data\Folder1\example.txt,您的 zip 文件中将有 3 个 ZipEntries。一个用于Data,一个用于Data\Folder1,一个用于Data\Folder1\example.txt

通过简单地迭代 ZipFileZipEntries 并匹配所需文件的路径和文件名,您应该可以轻松找到所需的条目。然后可以使用已经建议的 ZipFile.getInputStream(ZipEntry) 方法提取该条目的内容。

参见this questions and the answers有关如何将 InputStream 读取为字符串的示例。

使用 Apache Commons-IO (IOUtils) 读取 InputStream 并将其字符串化,可能如下所示:

public String getFileContentsAsString(final File pZipFile, final String pFileName) throws Exception {

try (ZipFile zipFile = new ZipFile(pZipFile)) {
Enumeration<? extends ZipEntry> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry currentEntry = entries.nextElement();
if (matchesDesiredFile(pFileName, currentEntry)) {
try (InputStream entryIn = zipFile.getInputStream(currentEntry)) {
String text = IOUtils.toString(entryIn, Charsets.UTF_8);
return text;
}
}
}
}

return null;
}

private boolean matchesDesiredFile(final String pFileName, final ZipEntry pZipEntry) {
return !pZipEntry.isDirectory() && pZipEntry.getName().equals(pFileName);
}

如果您只是简单地匹配条目的名称属性,您当然也可以使用

ZipEntry zipEntry = zipFile.getEntry(filePathWithinZipArchive);

获取所需的条目,而不是“手动”迭代条目。

请注意,您应该小心用于目录的分隔符。正如所指出的here ,由创建 zip 文件的应用程序使用 \(反斜杠)或 /(正斜杠)作为目录分隔符。我在 Mac 上使用 zip 终端命令进行了尝试,ZipEntry 的名称和原始文件名均为 Data/Folder1/example.txt.如果您使用其他工具创建 zip,ZipEntry 的名称可能是 Data\Folder1\example.txt。甚至混合变体(一个 ZipEntry 使用正斜杠,另一个使用反斜杠)也是可能的。如果您无法控制 zip 创建过程,您可能需要考虑这一点。

关于java - 在java中获取zip文件夹中的文件作为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40827183/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com