我有一个程序将文件作为输入并生成一个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),但无济于事。这个问题似乎不是我能找到的在线答案。希望有人在这里可能能够分辨出发生了什么。 :)
答案 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。