我正在尝试从Java代码执行程序。这是我的代码:
public static void main(String argv[]) {
try {
String line;
Process p = Runtime.getRuntime().exec(new String[]{
"/bin/bash", "-c", "executable -o filename.txt"});
BufferedReader input = new BufferedReader(
new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
} catch (Exception err) {
err.printStackTrace();
}
}
我的操作系统是Mac OS X 10.6。
现在,我尝试运行的可执行文件应该将输出吐出到filename.txt。如果我使用此命令并在终端上运行它,它工作正常,并且filename.txt也会填充。但是,从我的java程序中,不会创建该文件。
如果相反,我使用可执行文件> filename.txt然后创建filename.txt但是为空。不知道这里有什么问题。我试图运行的可执行文件是Xtide(如果有帮助的话)。
我真的很感激我能得到的任何帮助。
谢谢,
答案 0 :(得分:2)
您无法将输出重定向到文件并读取java中的输出。这是一个或另一个。你想要的是这个:
Process p = Runtime.getRuntime().exec(new String[]{
"/bin/bash", "-c", "executable -o filename.txt"});
p.waitFor();
BufferedReader input = new BufferedReader(
new InputStreamReader(new FileInputStream("filename.txt")));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
主要变化是:
p.waitFor()
,因为流程执行是异步的,所以你必须等待它完成。答案 1 :(得分:1)
mdma的答案有效(我投票了),但您可能还想考虑直接从executable
读取输出流的版本:
Process p = Runtime.getRuntime().exec(new String[]{
"/bin/bash", "-c", "executable"});
p.waitFor();
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())_;
while ((line = input.readLine()) != null) {
System.out.println(line);
}
答案 2 :(得分:0)
如果我错了,请纠正我,但症状如下:
exec("/usr/bash", "-c", "executable > filename.txt")
创建一个空文件。exec("/usr/bash", "-c", "executable -o filename.txt")
不会创建文件。255
。executable -o filename.txt
或executable > filename.txt
运行命令时,它会按预期工作。鉴于上述情况,我认为最可能的原因是/bin/bash
在从Java启动时找不到executable
。第一个示例创建一个空文件的事实意味着/bin/bash
正在做某事。但是如果你试图运行
$ unknown-command > somefile.txt
从bash shell提示符中,您将收到一条错误消息,指出无法找到该命令和一个空的“something.txt”文件。 (您不会在Java应用程序中看到错误消息,因为它正在写入stderr,而您没有捕获它。)创建空“something.txt”文件的原因是它由shell打开< em>在之前它尝试fork并执行“可执行文件”。
如果这是问题,那么简单的解决方案就是使用可执行文件的绝对路径名。
此外,如果您没有执行任何命令行重定向或其他shell魔术,则无需在新的bash
实例中运行可执行文件。相反,只需这样做:
Process p = Runtime.getRuntime().exec("executable", "-o", filename.txt");
然后在尝试读取文件内容之前等待进程完成并检查退出代码。