Java runtime.exec无法正确执行

时间:2014-02-20 09:21:26

标签: java windows-server-2008-r2 runtime.exec java-6

我正在获取一个exe-File,我必须在Windows Server 2008 R2上使用Java(版本6)执行。现在有一个我不太懂的问题。使用命令行

执行文件时
"C:\test.exe param1 param2" 

它可以正常工作,但是当我用

执行文件时
Process proc = Runtime.getRuntime().exec("C:\\test.exe param1 param2");
proc.waitFor();

我可以在Windows任务管理器中看到test.exe并且它开始运行(它会创建一个说明该情况的日志),但之后它就不再做任何事了。 test.exe以0%无限运行,我必须手动终止进程。完成后,java程序继续并

proc.exitValue()

是“1”,因此java认识到我已经杀死了这个进程。我还尝试在批处理文件中编写命令行并使用.exec()执行它,但它没有改变任何内容。

让我感到困惑的是,它通过Windows命令行完美运行,但不通过.exec()。有谁知道什么可能导致这样的问题?或者test.exe是否更有可能导致问题?

最好的问候

编辑:写下.exec中的错误路径

3 个答案:

答案 0 :(得分:2)

由于你的程序产生了很多输出,我的假设是它试图写入标准输出(这是Linux下的管道,不知道Windows)。

试试这个:

final byte[] devnull = new byte[1024];

final ProcessBuilder builder = new ProcessBuilder("C:\\test.exe", "param1", "param2")
    .redirectErrorStream(true);
final Process p = builder.start();

final InputStream stdout = process.getInputStream();

// Purge stdout
while (stdout.read[devnull] != -1);

// Grab the process' exit code here

答案 1 :(得分:0)

"C:\test.exe param1 param2"

你有一个标签。试试这个:

"C:\\test.exe param1 param2"

如果进程在stdout或stderr上产生任何输出,则需要使用它。否则它会阻止。

答案 2 :(得分:0)

正如https://stackoverflow.com/a/21903969中指出的那样,消耗流程产生的所有输出非常重要 - 不仅在Linux上,而且在Windows上,不仅是标准输出,还有可能错误。

这种情况的一般模式可能如下所示:

private static void runCommand(String command) throws IOException
{
    Process process = Runtime.getRuntime().exec(command);
    String errorMessage = 
        new String(toByteArray(process.getErrorStream()));
    String outputMessage = 
        new String(toByteArray(process.getInputStream()));
    int exitValue = 0;
    try
    {
        exitValue = process.waitFor();
    }
    catch (InterruptedException e)
    {
        Thread.currentThread().interrupt();
    }
    System.out.println("Output message: "+outputMessage);
    System.out.println("Error message: "+errorMessage);
    System.out.println("Exit value: "+exitValue);
}

private static byte[] toByteArray(
    InputStream inputStream) throws IOException
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte buffer[] = new byte[8192];
    while (true)
    {
        int read = inputStream.read(buffer);
        if (read == -1)
        {
            break;
        }
        baos.write(buffer, 0, read);
    }
    return baos.toByteArray();
}