Пожалуйста, проясните проблему в коде Java ниже - PullRequest
0 голосов
/ 03 августа 2010
  import java.lang.Process;    
  import java.io.*;   
  import java.io.InputStream;    
  import java.io.IOException;    
  public class prgms{    
  public static void main(String[] args) {    
    try {    
      // Execute a command without arguments    
      String command = "java JavaSimpleDateFormatExample";    
      Process child = Runtime.getRuntime().exec(command);    

      // Execute a command with an argument    
      // command = "java JavaStringBufferAppendExample";    
     //child = Runtime.getRuntime().exec(command);    
    } catch (IOException e) {    
    }    
    InputStream in = child.getInputStream();    
    int c;    
    while ((c = in.read()) != -1) {    
        process((char)c);    
    }    
    in.close();    
  }    
}    

Я изменил этот способ ... но возникает следующая ошибка,

prgms.java:17: cannot find symbol    
symbol  : variable child    
location: class prgms     
InputStream in = child.getInputStream();    
                 ^
prgms.java:20: cannot find symbol    
symbol  : method process(char)    
location: class prgms    
        process((char)c);    
        ^    
2 errors   

Ответы [ 3 ]

8 голосов
/ 03 августа 2010

Вы действительно игнорируете stdout и stderr потоков Process, возвращаемых Runtime#exec().

Это будет длинная история, так что вот ссылка: Когда Runtime.exec не будет .Прочитайте все четыре страницы.

4 голосов
/ 03 августа 2010

С этим кодом проблем нет.

Что означает выполнение другой программы Java внутри.

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

Вот пример использования "современной" альтернативы Runtime.exec

// Hello.java says Hello to the argument received.
class Hello {
    public static void main ( String [] args ) {
         System.out.println( "Hello, "+args[ 0 ] );
    }
}

// CallHello.java 
// Invokes Hello from within this java program 
// passing "world"  as argument.
import java.io.InputStream;
import java.io.IOException;
public class CallHello {
    public static void main( String [] args ) throws IOException {
         Process child = new ProcessBuilder("java", "Hello", "world").start(); 
         // read byte by byte the output of that progam.
         InputStream in = child.getInputStream();
         int c = 0;
         while( ( c = in.read() ) != -1 ) {
            // and print it
            System.out.print( (char)c);
         }
     }
}

Выход:

Hello world
2 голосов
/ 03 августа 2010

Дочерний объект объявлен внутри блока try ... catch, поэтому его область действия является локальной для этого блока. Вы пытаетесь получить доступ к нему за пределами блока. Вы должны объявить это перед блоком, что-то вроде

Process child;
try {
// code
child = Runtime.getRuntime().exec(command);
// code
}
catch(/*blah blah*/) {}
// more code
...