Runtime.getRuntime.exec()执行java进程失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Runtime.getRuntime.exec()执行java进程失败相关的知识,希望对你有一定的参考价值。

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;

// Test_Exe.java
public class Test_Exe
public static void main(String[] args) throws IOException,
InterruptedException
Process p = Runtime
.getRuntime()
.exec("java Test1");
int exitVal = p.waitFor();
System.out.println(exitVal);


Test1随便写了一个(可以产生一个文件)
输出代码为何为1,而且java Test1并没有被执行,是环境变量没有设置么?

输出log一类的,或者那个程序能不能重写一下,或者你有任何方法可控制它,如RV message, JMS, 等等。

此乃局限性...

重写是说,有没有办法让那个调用的程序不是使用子进程,或者让他的主进程等子进程结束在结束。exitValue()和waitFor()在被调用的程序是单一进程的时候是有效的。

另外你可以写一个.cmd来调用那个程序,看看是否在insert完成之前命令行就已经返回,确定是否是一个子进程。

其他方法有

- 监视此进程的log
- 让此进程insert完毕时发回一个信息(JMS, RV, 等等)

但都要看这个程序的写法了。如果他没有任何征兆的起一个子进程马上返回并且没有任何的其他输出,那是没办法的。
另外,虚机团上产品团购,超级便宜
参考技术A 要想运行java命令,环境变量肯定得设置好。至于代码看看下面的,这个测过的。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Test_exe
public static void main(String[] args) throws IOException
Runtime rt = Runtime.getRuntime();
Process p= null;
int exitValue = 1;
try
p= rt.exec("java");
InputStream is = p.getErrorStream();
if (is == null)
exitValue = 1;

InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
while ((br.readLine()) != null)

br.close();
isr.close();
is.close();
exitValue = p.waitFor();
p.destroy();
System.out.println(exitValue );
catch (IOException e)
e.printStackTrace();
catch (Exception e1)
e1.printStackTrace();


参考技术B 读一下p的inputStream,看看输出啥了 参考技术C 自己也刚学,,帮不了你了

Runtime.exec()

1. Runtime.getRuntime().exec()能做什么?
	
	1)调用外部程序
		// 调用的是javac.exe小程序
		Runtime.getRuntime().exec("javac");
		
	2)调用外部程序的某个指令
		// 调用的是cmd.exe中的dir指令
		Runtime.getRuntime().exec("cmd /c dir");
		
	3)调用外部的批处理文件(.bat)
		// 调用的是目录【D:\\test】下的【test.bat】脚本
		runtime.exec("cmd /c test.bat", null, new File("D:\\test"));


2. "cmd /c dir"中的/c是啥意思?

	cmd /c 执行结束后,关闭cmd进程.
	cmd /k 执行结束后,不关闭cmd后台进程.


3. Runtime提供了几个exec()方法,里面的参数都是啥意思?

	public Process exec(String command);
	public Process exec(String command, String[] envp);
	public Process exec(String command, String[] envp, File dir);
	
	public Process exec(String cmdarray[]);
	public Process exec(String[] cmdarray, String[] envp);
	public Process exec(String[] cmdarray, String[] envp, File dir);
	
	a. command
		一个命令。可包含命令和参数。
		
	b. envp
		一组环境变量的设置。
		格式:name=value 或 null.
		
	c. dir
		子进程的工作目录。
	
	e. cmdarray
		包含多个命令的数组。其中每个命令可包含命令和参数。

4. 一个比较完整的使用示例,见下面代码。
import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.junit.Test;

public class Demo {

    @Test
    public void testName() throws Exception {
        // 调用命令
        Runtime runtime = Runtime.getRuntime();

        Process process = null;
        process = runtime.exec("javac"); // 用法1:调用一个外部程序
        // process = runtime.exec("cmd /c dir"); // 用法2:调用一个指令(可包含参数)
        // process = runtime.exec("cmd /c test.bat", null, new File("D:\\test")); // 用法3:调用一个.bat文件

        // 存放要输出的行数据
        String line = null;

        // 输出返回的报错信息
        System.out.println("=================ErrorStream===================");
        BufferedReader inErr = new BufferedReader(new InputStreamReader(process.getErrorStream()));
        while ((line = inErr.readLine()) != null) {
            System.out.println(line);
        }

        // 输出正常的返回信息
        System.out.println("=================InputStream===================");
        BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }

        // 获取退出码
        int exitVal = process.waitFor(); // 等待进程运行结束
        System.out.println("exitVal = " + exitVal);
    }
}

 

以上是关于Runtime.getRuntime.exec()执行java进程失败的主要内容,如果未能解决你的问题,请参考以下文章

Android Runtime.getRuntime().exec

如何与 Runtime.getRuntime().exec(command) 程序进行交互?

在循环中运行“Runtime.getRuntime()。exec()”

Runtime.getRuntime.exec()执行java进程失败

无法从 Java 进程(Runtime.getRuntime().exec() 或 ProcessBuilder)读取 InputStream

Runtime.getRuntime.exec()执行linux脚本导致程序卡死有关问题