有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

emacs如何通过运行时从Java打开unix终端文本编辑器。getRuntime()。exec()?

我试图通过执行以下操作,从基于控制台的java程序中使用emacs编辑器打开特定文件:

int exitValue = Runtime.getRuntime().exec(commands).waitFor();

其中命令是由两个元素组成的字符串数组:

commands[0] = "emacs";
commands[1] = "/home/test.txt"; // The actual path I'm using is different.

因此,当我运行这个程序时,emacs不会打开,但是我的程序会继续运行,在exitValue中,我会在上面的行(第一行)执行后得到1。我做错了什么

另外,如果我尝试使用vinano来达到相同的目的,而不是继续运行程序,那么程序在执行该行后会挂起,但实际上两个编辑器都没有打开


共 (2) 个答案

  1. # 1 楼答案

    该进程可能正在发出关于其标准错误的消息。读取标准错误需要调用Process对象的getErrorStream()方法,并在单独的线程中读取返回的InputStream

    听起来很复杂,不是吗?这就是运行时的原因之一。exec在几年前被ProcessBuilder取代,这使得查看流程的输出更加容易:

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

    这不会让你的命令生效,但会让你看到哪里出了问题

  2. # 2 楼答案

    应该很简单:去掉xterm,只需开始vi:

    Process p = new ProcessBuilder("vi", "/home/test.txt").start(); 
    

    如果您想要vi的更多命令行参数,请将它们作为单独的字符串添加,而不是添加到第一个参数的“”中

    启动像vi这样的终端程序自然需要从可视终端启动java应用程序,因此vi有一个终端可供使用,但我认为这是事实