2012-06-24 2 views
1

Я пытаюсь выполнить окно команд из Java, используя следующий код,Как выполнить несколько окон команд, используя класс выполнения в Java

Process p=Runtime.getRuntime().exec("wget www.anyurl.com/index.html); 

и он работает, но когда я пытаюсь выполнить другую команду, которая выглядит следующим образом ,

Process p1=Runtime.getRuntime().exec("pscp -pw sysadmin c:/mydirectory/mypage.html [email protected]:/home/usr"); 

не работает. Если я прокомментирую первую линию процесса (т.е. процесс p), то процесс p1 работает нормально, он выполняет и показывает, что файл был скопирован успешно. Пожалуйста, кто-нибудь скажет мне, почему это происходит?

+0

Определение "это не будет работать". Что происходит? –

+0

ли первая команда должна быть завершена до того, как вторая может быть вызвана успешно? –

+0

Привет, JB Nizet, первая команда работает отлично (т.е. wget), но когда я пытаюсь выполнить pscp, она не работает, и если я прокомментирую первую строку (т.е. Process p = Runtime.getRuntime(). Exec ("wget ​​www.anyurl.com /index.html);) тогда pscp работает нормально. – Mahesh

ответ

4

Вам необходимо очистить потоки первого процесса, иначе программа будет заблокирована, потому что процесс «wget» создает выходные данные, которые никогда не читаются в текущей реализации. Вам нужно разобраться в выводах и потоках ошибок первого процесса. Посмотрите на ответы, например. another question about java-runtime-exec on SO.

Код ниже работает для справки, но зависит от того, что wget генерирует выходные данные для stderr и pscp в stdout. Если что-то выводится на другой соответствующий поток, код работает до тех пор, пока выход вписывается в буфер программы Java (обратите внимание, что эти размеры буфера, как правило, отличаются от платформы к платформе), в то время как он опустошает первый поток. Если буфер заполняется, выполнение команды просто блокируется. Вы должны создать отдельный поток для обоих: stout и stderr, который читает соответствующий поток процесса.

import java.io.BufferedReader; 
    import java.io.InputStreamReader; 

...

Process p=Runtime.getRuntime().exec("wget http://www.duckduckgo.com/"); 

    BufferedReader perr=new BufferedReader(new InputStreamReader(p.getErrorStream())); 
    BufferedReader pout=new BufferedReader(new InputStreamReader(p.getInputStream())); 
    // We read stderror first from wget, because it spits the progress information into stderr 
    for (String s=perr.readLine(); s!=null; s=perr.readLine()) 
    { 
     System.out.println("Stderr from p: "+s); 
    } 
    for (String s=pout.readLine(); s!=null; s=pout.readLine()) 
    { 
     System.out.println("Stdout from p: "+s); 
    } 
    // if you need to check whether the command actually returned normally 
    int returnCode = p.waitFor(); 
    perr.close(); 
    pout.close(); 

    System.out.println("Returned from p with exit code "+returnCode); 

    p=Runtime.getRuntime().exec("pscp -pw dontuseplainpwusesshkeys index.html [email protected]:"); 
    perr=new BufferedReader(new InputStreamReader(p.getErrorStream())); 
    pout=new BufferedReader(new InputStreamReader(p.getInputStream())); 
    // We read stdout of pscp first because pscp spits stuff into stdout. 
    // The process will block if the buffer gets full and does not get emptied. 
    for (String s=pout.readLine(); s!=null; s=pout.readLine()) 
    { 
     System.out.println("Stdout from p: "+s); 
    } 
    for (String s=perr.readLine(); s!=null; s=perr.readLine()) 
    { 
     System.out.println("Stderr from p: "+s); 
    } 

    int returnCode1 = p.waitFor(); 
    perr.close(); 
    pout.close(); 

    System.out.println("Process exited with return code "+returnCode1); 
+0

Привет, Дэвид, первая команда отлично работает до выполнения второй команды – Mahesh

+0

Привет, я пытаюсь с вашим предложением и возвращаться к вам. – Mahesh

+0

Привет, ребята, здесь я предоставляю свои код, пожалуйста, загляните в него и скажите мне, что не так с этим кодом, String inpu t; BufferedReader br; br = новый BufferedReader (новый InputStreamReader (System.in)); вход = br.readLine(); , если (input.equals ("загрузить")) { \t Процесс р = Runtime.getRuntime() Exec ("Wget www.anyurl.com/index.html);. } еще , если (вход. равно ("загрузить")) { \t процесса p1 = Runtime.getRuntime() Exec ("PSCP -pw сисадмин с: /mydirectory/mypage.html Махеш @ vmstni01:/дома/USR".); } – Mahesh

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