java解zip压缩包命令_Java进程-无法解压缩zip文件

我正在尝试解压缩一些zip文件,它的大小约为65兆。下面的代码段:

此方法实际上将文件解压缩:

public synchronized void execute(Path zipFile) {

final ProcessBuilder builder = new ProcessBuilder("/bin/unzip",zipFile.toAbsolutePath().toString(), "-d", dir.toAbsolutePath().toString());

FutureTask task = new FutureTask(new Callable() {

@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> tasks = new ArrayList>();

tasks.add(task);

System.out.println("task added");

ExecutorService executor = Executors.newCachedThreadPool();

for (FutureTask 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());

}

}

FreeBuilder为 Java 1.6  自动生成 Builder 模式。当设计类的构造函数或静态工厂具有多个参数时,Builder 模式是一个不错的选择。—— Effective Java,第二版,第39页背景在 Java 中实现 Builder 模式容易出错和重复。即使是一个简单的四字段类,最基本的构建器 API 需要 39 行代码,如果你不使用像 AutoValue 这样的实用程序来生成值样板,则需要 72 行代码。使用import org.inferred.freebuilder.FreeBuilder; @FreeBuilder public interface Person {   /** Returns the person's full (English) name. */   String name();   /** Returns the person's age in years, rounded down. */   int age();   /** Builder of {@link Person} instances. */   class Builder extends Person_Builder { } }JavaBean convention如果值类型遵循 JavaBean 命名约定,只需在访问器方法前面加上'get'(或者,布尔访问器是'is')。 FreeBuilder 会跟随,并在 setter 方法上添加“set”前缀,以及从 toString 输出中删除前缀。@FreeBuilder public interface Person {   /** Returns the person's full (English) name. */   String getName();   /** Returns the person's age in years, rounded down. */   int getAge();   /** Builder of {@link Person} instances. */   class Builder extends Person_Builder { } } Person person = new Person.Builder()     .setName("Phil")     .setAge(31)     .build(); System.out.println(person);  // Person{name=Phil, age=31} 标签:FreeBuilder
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值