如何通过Runtime.getRuntime()。exec()从Java打开unix终端文本编辑器?

时间:2017-06-02 23:37:45

标签: java emacs

我尝试使用基于控制台的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 用于相同目的,而不是继续运行程序,只需在执行该行后挂起,但实际上两个编辑器都没有打开。

2 个答案:

答案 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();

这不会使你的命令工作,但它会让你看到出了什么问题。