[英]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 的工作原理,值得阅读经典文章
它提供了有用的示例代码(比上面的更好!)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.