2016-09-09 9 views
0

я следующий код:Во время вызова Wget от Явы с потреблением «ошибки» и «выход» поток, вспомогательный процесс пытается выполнить неполную команду несколько раз

public void callWget(String WgetCommand) { 
    System.out.println(WgetCommand); 
    try {    
     Runtime rt = Runtime.getRuntime(); 
     Process proc = rt.exec(wget_FirstScan); 
     int exitVal = proc.waitFor(); 
     BufferedReader br= new BufferedReader(new InputStreamReader(proc.getErrorStream())); 
     String line = null; 
     while ((line = br.readLine()) != null) 
      System.out.println(line); 
     br.close(); 
     System.out.println("Process exitValue: " + exitVal); 
     proc.destroy(); 
    } catch (IOException ioe) { ioe.printStackTrace(); } 
    catch (InterruptedException ie) { ie.printStackTrace(); } 
} 

Проблема заключается в том, что подпроцесс пытается запустить неполную wgetCommand много раз и, наконец, вызывает полную команду, и все в порядке. Я считаю, что я должен заботиться о потоке ввода, так как команда длинная. Есть ли какой-нибудь орган, который имеет на это какое-то представление? Заранее спасибо.

+0

Не забудьте принять мой ответ, если это было полезно. – Gray

ответ

3

Проблема заключается в том, что подпроцесс пытается запустить неполную wgetCommand много раз и, наконец, вызывает полную команду, и все в порядке. ... Есть ли какое-нибудь тело, у которого есть идея по этому поводу?

Не знаю, почему это приведет к тому, что команда wget будет запущена более одного раза. Тем не менее, я бы определенно не позвонил proc.watiFor() до после, вы закончили обработку всего вывода из команды. По крайней мере, в unix, когда процесс завершается, базовые потоки ввода/вывода/ошибки закрываются. Кроме того, если имеется большой объем вывода, он может заполнять буферы ОС до тех пор, пока вы его не прочитаете, возможно, блокируя wget от завершения, вызывая тупик.

Так что вы должны сделать:

Process proc = rt.exec(wget_FirstScan); 
BufferedReader br= new BufferedReader(new InputStreamReader(proc.getErrorStream())); 
String line = null; 
while ((line = br.readLine()) != null) { 
    System.out.println(line); 
} 
br.close(); 

// wait after processing output 
int exitVal = proc.waitFor(); 
System.out.println("Process exitValue: " + exitVal); 
// no need to call proc.destroy() 

Кроме того, вы можете быть обработке proc.getInputStream();, который является «стандартный вывод» из команды Wget. getErrorStream() - это сообщения об ошибках, напечатанные wget.

+0

Спасибо, что поделились своими мыслями. Я пробовал ваш предлагаемый код, но, к сожалению, эта же ошибка повторяется снова. Я попробовал его с более короткой командой wget, и он отлично работает. Я думаю, что что-то не так с длинной командой. Я также попытался использовать поток ввода, но не успел. – Mohammadreza

+0

Как обновление, я попробовал короткую команду, и она отлично работает. – Mohammadreza

+0

Что вы подразумеваете под «короткой командой» @Mohammadreza? – Gray