gpt4 book ai didi

Java 进程 - 无法解压缩 zip 文件

转载 作者:行者123 更新时间:2023-12-02 07:33:08 25 4
gpt4 key购买 nike

我正在尝试解压缩一些 zip 文件,它大约有 65 兆。代码片段如下:

这个方法实际上解压一个文件:

public synchronized void execute(Path zipFile) {
final ProcessBuilder builder = new ProcessBuilder("/bin/unzip",zipFile.toAbsolutePath().toString(), "-d", dir.toAbsolutePath().toString());
FutureTask<Integer> task = new FutureTask<Integer>(new Callable<Integer>() {
@Override public Integer call() {
try {
System.out.println("started and waiting");
int status = builder.start().waitFor();
System.out.println("status: " + status);
return status;
} catch (InterruptedException e) {
} catch (IOException e) {
}
return 0;
}
});

List<FutureTask<Integer>> tasks = new ArrayList<FutureTask<Integer>>();
tasks.add(task);
System.out.println("task added");
ExecutorService executor = Executors.newCachedThreadPool();
for (FutureTask<Integer> t : tasks) {
executor.submit(t);
System.out.println("submitted");
}
executor.shutdown();
System.out.println("shutdown");
}

那个执行者/ future 的东西只是为了确保我正确地做这件事。该方法在 Finder 类中调用,该类在目录中查找 zip 文件并尝试解压缩它。它基于此代码 http://docs.oracle.com/javase/tutorial/essential/io/walk.html

具体来说:

@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (find(file)) {
synchronized(Finder.class) {
executor.execute(file);
}
}
return CONTINUE;
}

现在问题来了。这真的很有趣。每当我通过此代码提取某些内容时,zip 文件实际上会被解压缩,但只有某些目录被解压缩,而其他目录则没有。例如,我有一个包含目录 temp foo 和 bar 的 zip 文件,但解压后,只有 temp 和 foo 目录,并且 bar 未被提取。

输出是:

task added
submitted
started and waiting
shutdown

为什么没有“status = Something”输出?

我不明白为什么会这样。当我手动解压它时,它会正确解压。

//编辑

这成功了

@Override
public synchronized void execute(String file, String dest) {
ProcessBuilder pb = new ProcessBuilder("/bin/unzip","-qq", file, "-d", dest);
pb.redirectErrorStream(true);

try {
Process p = pb.start();
InputStream is = p.getInputStream();
InputStreamReader r = new InputStreamReader(is);
BufferedReader in = new BufferedReader(r);
String line;
while ((line = in.readLine()) != null) {
// because of the -qq option, it does actually write out nothing
System.out.println(line);
}
} catch (IOException ex) {
System.err.println(ex.getMessage());
}
}

最佳答案

unzip 命令将解压缩到标准输出的文件的详细信息打印出来,因此您需要在 Java 程序中读取此内容(通过 Process.getInputStream) 。如果您没有及时读取输出,一旦缓冲区已满,进程可能会阻塞 - 这在 Process 的 javadoc 中有详细说明。

我建议您调用builder.redirectErrorStream(true),然后确保从流程流中读取所有数据。您还可以通过在解压缩调用中添加 -qq 参数来最大程度地减少它首先创建的输出量。

关于Java 进程 - 无法解压缩 zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12653982/

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