如何使用Runtime.getRuntime()。exec来运行任意Java程序?

时间:2015-07-10 01:06:45

标签: java concurrency runtime

我发现以下代码使用Runtime.getRuntime().exec来运行任意程序(如Notepad.exe)。

public class RuntimeDemo {

   public static void main(String[] args) {
   try {

   // create a new array of 2 strings
   String[] cmdArray = new String[2];

   // first argument is the program we want to open
   cmdArray[0] = "notepad.exe";

   // second argument is a txt file we want to open with notepad
   cmdArray[1] = "example.txt";

   // print a message
   System.out.println("Executing notepad.exe and opening example.txt");

   // create a process and execute cmdArray and currect environment
   Process process = Runtime.getRuntime().exec(cmdArray,null);

   // print another message
   System.out.println("example.txt should now open.");

   } catch (Exception ex) {
   ex.printStackTrace();
   }

   }
}

我从Eclipse运行它,它打开Notepad.exe(或者我也可以使用calc.exe)。

但是如果我们想从这个程序中运行一个任意的Java命令,比如:

java -version -

这会跑吗?我在这看到一个问题是..你在哪里看到它的结果?如果我正在运行命令行,它会出现在命令行中..但是这里?

1 个答案:

答案 0 :(得分:1)

  1. 使用ProcessBuilder的{​​{1}},它提供了一个更具可配置性的解决方案,并鼓励使用Runtime#execString[]作为命令和参数,从而解决了一系列问题,尤其是当您的参数包含空格时。
  2. 阅读List<String>&#39; Process
  3. 例如......

    InputStream

    哪个输出

    try {
        String[] command = {"java.exe", "-?"};
        ProcessBuilder pb = new ProcessBuilder(command);
        pb.redirectErrorStream(true);
        Process exec = pb.start();
    
        BufferedReader br = new BufferedReader(new InputStreamReader(exec.getInputStream()));
        String text = null;
        while ((text = br.readLine()) != null) {
            System.out.println(text);
        }
    
        System.out.println("Process exited with " + exec.waitFor());
    } catch (IOException | InterruptedException exp) {
        exp.printStackTrace();
    }
    

    这假设Usage: java [-options] class [args...] (to execute a class) or java [-options] -jar jarfile [args...] (to execute a jar file) where options include: -d32 use a 32-bit data model if available -d64 use a 64-bit data model if available -server to select the "server" VM The default VM is server. -cp <class search path of directories and zip/jar files> -classpath <class search path of directories and zip/jar files> A ; separated list of directories, JAR archives, and ZIP archives to search for class files. -D<name>=<value> set a system property -verbose:[class|gc|jni] enable verbose output -version print product version and exit -version:<value> require the specified version to run -showversion print product version and continue -jre-restrict-search | -no-jre-restrict-search include/exclude user private JREs in the version search -? -help print this help message -X print help on non-standard options -ea[:<packagename>...|:<classname>] -enableassertions[:<packagename>...|:<classname>] enable assertions with specified granularity -da[:<packagename>...|:<classname>] -disableassertions[:<packagename>...|:<classname>] disable assertions with specified granularity -esa | -enablesystemassertions enable system assertions -dsa | -disablesystemassertions disable system assertions -agentlib:<libname>[=<options>] load native agent library <libname>, e.g. -agentlib:hprof see also, -agentlib:jdwp=help and -agentlib:hprof=help -agentpath:<pathname>[=<options>] load native agent library by full pathname -javaagent:<jarpath>[=<options>] load Java programming language agent, see java.lang.instrument -splash:<imagepath> show splash screen with specified image See http://www.oracle.com/technetwork/java/javase/documentation/index.html for more details. Process exited with 0 java.exe环境中,否则您可能需要提供它的完整路径(或更改工作目录)