2014-10-04 5 views
4

Я рассмотрел многие вопросы, касающиеся ввода/вывода из порожденного процесса на Java, но я все еще не могу понять, что не так с моей программой. Это очень короткий и простой, но он не работает. Я использую метод exec() объекта Runtime для создания нового процесса (я знаю, что ProcessBuilder, вероятно, лучше, но это для простого назначения, и мне действительно не нужно беспокоиться о stderr порожденного процесса) ,Простой процесс ввода/вывода Java-процесса

Я запускаю класс «Процессор» самостоятельно из командной строки IDE /. Memory.java находится в том же каталоге.

public class Memory 
{ 
    public static void main(String[] args) 
    { 
     System.out.println("Memory works!"); 
    } 
} 

И другая программа:

import java.io.IOException; 
import java.io.InputStream; 

public class Processor 
{ 
    public static void main(String[] args) 
    { 
     Runtime rt = Runtime.getRuntime(); 
     Process proc = null; 

     try { 
      proc = rt.exec("java Memory"); //execute Memory.java which is in same directory 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      System.exit(2); //exit code 2 means that process creation failed. 
     } 

     //stream to get output from memory 
     InputStream fromProcess = proc.getInputStream(); 

     int x; 

     try { 
      while((x = fromProcess.read()) != -1) 
       System.out.print((char)x); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

Там нет выхода, и программа никогда не завершается. Теперь это может быть из-за цикла while в памяти для сканера, но тогда должен быть какой-то выход хотя бы правильно?

+0

«Мне действительно не нужно беспокоиться о stderr порожденного процесса» ... посмотрите на него: он обязательно скажет вам, что вы ошибаетесь ;-) – ben75

+0

Я рекомендую вам пару шагов отладки вы можете использовать, чтобы понять, что происходит. Во-первых, позаботьтесь о stderr, поскольку это может указывать на вашу проблему. Во-вторых, попробуйте запустить другую команду, и вы убедитесь, что она выведет на stdout в качестве команды ls или dir, в зависимости от того, какой os вы работаете. Если вы видите вывод, это также может указать вам, какой текущий каталог используется, что было бы полезно просто чтобы быть уверенным в правильном контексте. Наконец, я просто проверяю, имеет ли текущий каталог выполнения класса процессоров скомпилированный файл memory.class? –

+0

Я отбросил ваши массивные правки ... поскольку они делают текущие ответы бесполезными. Если у вас все еще возникают проблемы с кодом, а другие рекомендации перечислены как добавление шагов отладки, задайте отдельный вопрос, который сужает новые проблемы, которые у вас есть, и включите соответствующий вывод. – rolfl

ответ

3

Проблема, которая возникает здесь, почти наверняка заключается в том, что команда «java Memory» терпит неудачу.

Когда вы запускаете процесс, Java создает три выхода, код выхода, STDOUT и STDERR. Хорошая программа, выполняющая внешний процесс, проверит все три.

Вы просто проверяете STDOUT.

Если изменить код после того, как вы строите прок, чтобы быть:

//stream to get output from memory 
    InputStream fromProcess = proc.getInputStream(); 
    InputStream fromError = proc.getErrorStream(); 

    int x; 

    try { 
     while((x = fromProcess.read()) != -1) 
      System.out.print((char)x); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try { 
     while((x = fromError.read()) != -1) 
      System.err.print((char)x); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    int exit = proc.exitValue(); 
    System.out.println("Exited with code " + exit); 

вы получите лучшее представление о том, что пошло не так.

Это трудно сделать, управляя этими тремя выходами, и многие системы реализуют отдельный поток для управления потоками STDERR и STDOUT. Как вы его решаете, но выходит за рамки этого quesiton.

+0

Это помогло, спасибо большое! – sarora

+0

Я отредактировал программу, где теперь процессор отправляет данные в stdin из памяти, а память выводит его на stdout (который отправляется процессору fromStream). Но ничего не происходит.Я бы очень признателен за вашу помощь, спасибо! – sarora

0

Я попробовал ваш код, написанный и побежал просто отлично ...

Вы пытаетесь запустить его из командной строки или из внутри IDE? Я попытался запустить его из Eclipse и получил ошибку ввода-вывода. Он не регистрировал память Memory.class.

Я вышел из файловой системы и перешел туда, где были Memory.class и Processor.class. Выполнение изнутри этого каталога работало нормально.

+0

Да, это была ошибка. Я запускал его из Eclipse и не проверял поток ошибок. Но теперь, когда я пытаюсь отправить данные взад и вперед, у меня проблемы. См. Отредактированный вопрос. Еще раз спасибо! – sarora

+0

Вы пытались запустить его из командной строки? Как я уже сказал, он работает отлично, как написано для меня. – barna10

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