当前位置: 首页 > 面试题库 >

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

公子昂
2023-03-14
问题内容

我正在尝试解压缩一些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");
}

那个执行者/未来的东西只是为了确保我正确地做。在类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

为什么没有“状态=某物”输出?

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

//编辑

这成功了

@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在unzip调用中添加参数来最大程度地减少其创建的输出量,从而从中受益。



 类似资料:
  • 我有一个来自不同位置的文件列表。我使用以下代码创建了一个zip文件,该代码可以正常工作。但是,当我尝试在Windows中使用Extract All解压文件时,无法找到任何字节,但是如果我使用Windows资源管理器双击zip文件本身,我可以看到文件,并且可以打开单个文件并包含正确的数据

  • 本文向大家介绍Python压缩解压缩zip文件及破解zip文件密码的方法,包括了Python压缩解压缩zip文件及破解zip文件密码的方法的使用技巧和注意事项,需要的朋友参考一下 python 的 zipfile 提供了非常便捷的方法来压缩和解压 zip 文件。 例如,在py脚本所在目录中,有如下文件: 将 readability 目录中的文件压缩到脚本所在目录的 readability.zip

  • 本文向大家介绍Java解压和压缩带密码的zip文件过程详解,包括了Java解压和压缩带密码的zip文件过程详解的使用技巧和注意事项,需要的朋友参考一下 前言 JDK自带的ZIP操作接口(java.util.zip包,请参看文章末尾的博客链接)并不支持密码,甚至也不支持中文文件名。 为了解决ZIP压缩文件的密码问题,在网上搜索良久,终于找到了winzipaes开源项目。 该项目在google cod

  • 我正在尝试解压文件使用Java,它正在编译没有任何错误。当我从工具中调用它,并给出文件的绝对目标路径和源路径时,例如:source:d:\data\test.zip destination:d:\data\op\ 我收到了类似访问被拒绝的错误(我有系统的管理访问权限) 堆栈跟踪: 正在提取:测试/新文本文档-复制(2).txt java.io.FileNotFoundException:d:\da

  • 我试图使用在Java()压缩文件,但不能解压文件后创建它。我使用下面的代码: 当我读取一个文件,并将其作为InputStream输入到此方法时,它会创建一个文件。 但是,当我尝试使用命令打开这个zip文件时,它无法打开,错误如下: 我尝试使用,它起作用并显示包含文本文件。这是因为命令不会在zip文件中查找中心目录签名的

  • 问题内容: 我正在下载包含XML的压缩文件,由于延迟要求,我希望避免在操作之前将zip文件写入磁盘。但是,这不足以满足我的需求。没有办法说“这是一个zip文件的字节数组,请使用它”而不将其转换为流,并且它不可靠,因为它会扫描条目标头(请参阅EDIT下面的讨论,以了解为什么它不可靠)。 我尚无法访问要处理的zip文件,因此我不知道我是否能够通过来处理它们,因此我需要找到一种适用于任何有效ZIP文件的