Please clarify the issue in the java code below

2019-08-24 23:40发布

问题:

  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();    
  }    
}    

I have modified this way... but the following error occurs,

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   

回答1:

You're indeed ignoring the stdout and stderr streams of the Process returned by Runtime#exec().

This is going to be a long story, so here's just a link: When Runtime.exec won't. Read all the four pages.



回答2:

There is no problem with that code.

What is does, is to execute another Java program inside.

The class Process has a method to get the output of the program, you have to redirect that output to your own, if you want to see the result.

Here's a sample using a "modern" alternative to 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);
         }
     }
}

Output:

Hello world


回答3:

Child is declared inside the try...catch block so its scope is local to that block. You're trying to access it outside of the block. You should declare it before the block, something like

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