Java Runtime.exec()程序不会输出到文件

时间:2011-04-23 15:59:05

标签: java runtime.exec

我有一个程序将文件作为输入并生成一个xml文件作为输出。当我从命令行调用它时,它完美地工作。我尝试使用以下代码从Java程序中调用它。

    try
    {
        Process proc = Runtime.getRuntime().exec(c);

        try
        {
            proc.waitFor();
        }
        catch(InterruptedException e)
        {
            System.out.println("Command failed");
        }
    }
    catch(IOException e)
    {
        System.out.println("Command failed");
        e.printStackTrace();
    }

该程序似乎运行正常,因为它创建了一个xml文件;但是,当我打开它时,xml文件是空的。我在Java程序中没有遇到任何异常,所以我对这个问题可能会感到困惑。为什么命令行程序正常工作,但是当从Java调用时,不会向它创建的文件输出任何内容。我想也许这是某种权限的事情。我尝试将程序作为sudo运行(我正在使用Linux),但无济于事。这个问题似乎不是我能找到的在线答案。希望有人在这里可能能够分辨出发生了什么。 :)

3 个答案:

答案 0 :(得分:4)

从您的流程中获取输出和错误流并阅读它们以查看发生的情况。这应该告诉你你的命令有什么问题。

例如:

try {
    final Process proc = Runtime.getRuntime().exec("dir");

    try {
        proc.waitFor();
    } catch (final InterruptedException e) {
        e.printStackTrace();
    }

    final BufferedReader outputReader = new BufferedReader(new InputStreamReader(proc
            .getInputStream()));
    final BufferedReader errorReader = new BufferedReader(new InputStreamReader(proc
            .getErrorStream()));

    String line;

    while ((line = outputReader.readLine()) != null) {
        System.out.println(line);
    }

    while ((line = errorReader.readLine()) != null) {
        System.err.println(line);
    }
} catch (final IOException e) {
    e.printStackTrace();
}

如果任一流中没有输出,那么我接下来会检查外部程序和发送的命令来执行它。

答案 1 :(得分:0)

您是否尝试从外部java启动该过程?

答案 2 :(得分:0)

对我来说,我编写了一个jar文件,该文件输出一个文件,并在另一个Java程序中从命令行运行该文件。事实证明,我的jar文件中有一个基本检查,我忘记了输入字符串中的字符数(不好)。如果字符数小于8,则没有输出文件。如果字符数大于8,则使用以下代码可以毫无问题地输出输出文件:

    String cmdStr = "java -jar somejar.jar /home/username/outputdir 000000001";
    try
    {
        Runtime.getRuntime().exec(cmdStr);
        Runtime.getRuntime().runFinalization();
        Runtime.getRuntime().freeMemory();
        log.info("Done");
    }
    catch (IOException e)
    {
        log.error(System.err);
    }

不知道我是否真的需要这里的一切,但是,嘿,它能用。注意:在我的情况下,似乎没有必要使用waitFor。