Java-процесс - невозможно распаковать 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-файл на самом деле распаковывается, но ТОЛЬКО одни каталоги разархивированы, а другие нет. Например, у меня есть zip-файл с каталогами temp foo и bar, но после распаковки есть только, например, каталоги 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());
}
}