繁体   English   中英

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

[英]Java Runtime.exec() program won't output to file

我有一个程序,它接受一个文件作为输入并生成一个 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),但无济于事。 这个问题似乎不是我能在网上找到答案的任何东西。 希望这里有人能告诉我发生了什么。 :)

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

例如:

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

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

对我来说,我写了一个 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);
    }

不确定我是否真的需要这里的一切,但是,嘿,它有效。 注意:在我的情况下似乎不需要等待。

您是否尝试从 Java 外部启动该进程?

在等待进程终止之前,必须处理进程输入(实际上是进程的输出!)和错误流。 这应该会更好

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

         BufferedReader outSt = new BufferedReader(new InputStreamReader(proc.getInputStream()));
         BufferedReader errSt = new BufferedReader(new InputStreamReader(proc.getErrorStream()));

         String line;

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

         while ((line = errSt.readLine()) != null) 
         {
             System.err.println(line);
         }

         proc.waitFor();

     } 
     catch (final IOException e) 
     {
         e.printStackTrace();
     }
     

但是为了更好地理解 Runtime exec 的工作原理,值得阅读经典文章

当 Runtime.exec() 不会

它提供了有用的示例代码(比上面的更好!)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM