Не мог считать InputStream из Процесса Java (Runtime.getRuntime () .exec () или ProcessBuilder)

Я пытаюсь запустить процесс внешне с Java и ничего не могу считать из его InputStream.

Если я запускаю процесс с команд как "ls", "PS" или "уничтожаю" все, хорошо работает. Я могу запустить процесс и получить информацию или о InputStream или о ErrorStream Процесса.

Если я пытаюсь использовать команду как "ftp", или "telnet" и InputStream и ErrorStream блокируют мою программу при попытке читать. Никакая информация не передается через эти потоки никогда.

Кто-либо может объяснить поведение? Разве это просто не возможно с этими командами, или у меня есть проблема с моей реализацией?

     String processName = _configuration.getProgramCommand().getCommand();
   ProcessBuilder procBuilder = new ProcessBuilder(processName);   

   System.out.println("Starting process "+processName);   
   _proc = Runtime.getRuntime().exec(processName);// procBuilder.start();            

   if(!procBuilder.redirectErrorStream()) {    
    _errorWorker = new ProcessErrorWorker(_proc);
    _errorWorker.start();   
   }

   String proc_start_answer = _configuration.getNextCommand().getCommand();
   System.out.println("Waiting for process answer '"+proc_start_answer+"'");
   BufferedReader input = new BufferedReader(new InputStreamReader(_proc.getInputStream()));      

   String answer = "";  

   try {         
    System.out.println("inputstream ready: "+input.ready());
    answer+=input.readLine(); 
    System.out.println("process answer:  "+answer);
    input.close();        

   } catch(Exception e) {
    System.out.print(e.getMessage());     
   } 
21
задан Community 31 August 2016 в 20:32
поделиться

1 ответ

Вам нужно выполнить эту работу в потоке. Например, чтобы зарегистрировать стандартный вывод:

Process process = Runtime.getRuntime().exec(command);
LogStreamReader lsr = new LogStreamReader(process.getInputStream());
Thread thread = new Thread(lsr, "LogStreamReader");
thread.start();


public class LogStreamReader implements Runnable {

    private BufferedReader reader;

    public LogStreamReader(InputStream is) {
        this.reader = new BufferedReader(new InputStreamReader(is));
    }

    public void run() {
        try {
            String line = reader.readLine();
            while (line != null) {
                System.out.println(line);
                line = reader.readLine();
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Затем вам понадобится второй поток для обработки ввода. И вы можете иметь дело со stderr точно так же, как со stdout.

6
ответ дан 29 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: