2010-08-20 3 views
2

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

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

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

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

+3

Предполагая, что Пол не просто решил вашу проблему прямо, возможно, стоит потратить Process.getInputStream() и Process.getErrorStream() на место, где вы можете их прочитать. (Или вызовите ProcessBuilder.redirectErrorStream (true) и просто следите за getInputStream().) Это может быть молча отчетность о проблемах, которые не могли бы привести к сбою программы Java. – BlairHippo

ответ

6

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

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

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

+0

Ничего себе, я бы никогда не поймал это. Благодаря! – dave

+0

Рад помочь, приятель. Похоже на это; совершенно непонятно, а не весело. – BlairHippo

+1

Также можно вызвать 'myProc.redirectErrorStream (true)', который перенаправляет стандартную ошибку в стандартный вывод и избавляется от необходимости в отдельном потоке. –

3

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

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

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

+0

Хорошее предложение, однако я сделал это и получаю те же результаты. – dave

2

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

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()); 
} 

} 
+1

Это также поможет, если буфер stderr заполнен. Но это не поможет, если буфер stdout заполнен. –

0

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

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

+0

Если предложение @ BlairHippo верное, оно может работать для вас, а не для OP, если OP имеет намного больше файлов в своем файле tar, чем вы. –

Смежные вопросы