我尝试使用基于控制台的java程序中的emacs编辑器打开特定文件,方法如下:
int exitValue = Runtime.getRuntime().exec(commands).waitFor();
其中命令是两个元素的String数组:
commands[0] = "emacs";
commands[1] = "/home/test.txt"; // The actual path I'm using is different.
所以,当我运行它时,emacs不会打开,而是我的程序继续运行,而在exitValue中,我在上面的行(第一个)执行后得到 1 。我做错了什么?
此外,如果我尝试使用 vi 或 nano 用于相同目的,而不是继续运行程序,只需在执行该行后挂起,但实际上两个编辑器都没有打开。
答案 0 :(得分:0)
应该很简单:省略xterm,只需启动vi:
Process p = new ProcessBuilder("vi", "/home/test.txt").start();
如果你想要更多vi的命令行参数,可以将它们添加为单独的字符串,而不是在第一个参数的“”内。
启动像vi这样的终端程序自然要求你从可见终端启动java应用程序,所以vi有一个终端可以使用,但我认为是这样。
答案 1 :(得分:0)
该过程可能会针对其标准错误发出消息。读取标准错误需要调用Process对象的getErrorStream()方法,并在单独的Thread中读取返回的InputStream。
听起来很参与,不是吗?这是几年前由ProcessBuilder替换Runtime.exec的原因之一,这使得查看Process的输出变得更加容易:
ProcessBuilder builder = new ProcessBuilder("emacs", "/home/test.txt");
// Makes Process use Java program’s stdin, stdout and stderr.
builder.inheritIO();
int exitValue = builder.start().waitFor();
这不会使你的命令工作,但它会让你看到出了什么问题。