我的问题很简单。 Java 可以处理包含大约 450,000 个文件的 .zip 文件吗?我编写的代码不会加载所有文件,只会在 zip 中搜索一个特定文件,并逐行读取。文件大小约为500kb。
这会起作用还是会出现 OutOfMemory 异常?
哦,抱歉,未压缩时大约有 0.5MB。压缩后的整个文件大约 250mb。
好的,文件的名称是该 zip 文件中的 ID + 日期(唯一)。如果我必须检查日志,我会调用 Java 并提供 ID + 日期,Java 只会读取该文件,而不会读取更多文件。
编辑:它有效,它非常有效。一个 zip 中大约有 400.000 个文件,如果您有足够的内存来压缩文件,则不会出现任何问题。
Edit2:它在 Linux 文件系统上运行没有问题,在 NTFS 上有时会崩溃。 NTFS 对 1 Zip 中的 musch 文件存在问题。
最佳答案
使用 Java 7 中的 zip 文件系统,您实际上可以非常轻松地访问一个单独的文件并在其上打开一个 BufferedReader
。
首先您必须创建文件系统
:
public static FileSystem getZipFileSystem(final String zipPath)
{
final Path path = Paths.get(zipPath).toAbsolutePath();
final Map<String, Object> env = new HashMap<>();
final URI uri = URI.create("jar:file:" + path.toString());
return FileSystems.newFileSystem(uri, env, null);
}
完成此操作后,您可以从 zip 本身的条目创建一个 BufferedReader
:
try (
final FileSystem fs = getZipFileSystem("/path/to/the.zip");
final BufferedReader reader = Files.newBufferedReader(fs.getPath("path/to/entry"),
StandardCharsets.UTF_8);
) {
// operate on the reader
}
您还可以使用 Files.readAllLines()
一次读取条目中的所有行。
如果您希望将 zip 条目复制到文件系统上的文件中,您也可以这样做:
Files.copy(zipfs.getPath("path/to/entry"), Paths.get("file/on/local/fs"));
或者您可以直接将结果复制到 OutputStream
,或者直接从 OutputStream
创建条目...
甚至使用 Files.walkFileTree()
遍历整个 zip。
或者使用Files.newDirectoryStream()
获取zip中“目录”中的所有条目。请注意,正如其名称所示,这是一个流;与File.listFiles()
(它只适用于磁盘上的文件)不同,这会返回一个遍历条目的迭代器。
或者...或者...或者...
请注意,FileSystem
需要是 .close()
d。
关于java - 处理 zip 中约 450.000 个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22501507/