Java, системная команда не запускается - PullRequest
2 голосов
/ 20 августа 2010

Я пытаюсь запустить системную команду для извлечения файла tar.bz2 в указанный каталог.Это код:

ProcessBuilder myProc = new ProcessBuilder("tar", "-xjf", "/path/to/MyTarFile.tar.bz2"); 
myProc.directory(new File("/directory/i/want/results/in/"));
myProc.start();
System.out.println(myProc.command());

Он работает без ошибок, однако файл удален и никуда не извлечен.

Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

6 голосов
/ 20 августа 2010

Я знаю, что Runtime.exec () имеет очень неприятную особенность , где, если вы не сливаете STDOUT / STDERR вручную, он фактически зависает.Я хотел бы надеяться, что ProcessBuilder исправит этот недостаток, но эта страница включает в себя этот лакомый кусочек:

Предостережение в отношении примеров в этом совете.Возможно, что примеры будут тупиковыми, если подпроцесс генерирует достаточно выходных данных для переполнения системы.Более надежное решение требует разделения процессов stdout и stderr в отдельных потоках.

Итак, убедитесь, что вы обрабатываете Process.getInputStream () и Process.getErrorStream (), как я рекомендовал в комментариях;это может решить проблему сразу!

3 голосов
/ 20 августа 2010

Измените строку myProc.start(); на

  Process p = myProc.start();
  p.waitFor();

Это будет гарантировать, что ваша программа не завершится, пока tar не закончится.

2 голосов
/ 20 августа 2010

Запустите это, чтобы увидеть ошибки. Возможно, один из ваших путей неверен.

import java.io.File;
import java.io.InputStream;

public class Untar {

public static void main(String[] args) throws Exception {
    ProcessBuilder myProc = new ProcessBuilder("tar", "-xjf", "foo.tar.bz2");
    myProc.directory(new File("newdir"));
    Process p = myProc.start();
    InputStream is = p.getErrorStream();
    int c;
    while( (c = is.read()) != -1 ){
       System.out.print((char)c);
    }
    p.waitFor();
    System.out.println(myProc.command());
}

}
0 голосов
/ 20 августа 2010

Только что попробовал этот код. Это работает.

Проверьте свои пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...