【问题标题】:How do I run nano from a Java program?如何从 Java 程序运行 nano?
【发布时间】:2018-12-02 15:07:28
【问题描述】:

我正在用 Java (https://gitlab.com/gitlabcyclist/secondmemory) 编写一个命令行程序,我希望能够运行 nano,以便用户可以在程序中编辑问题。我尝试像这样使用ProcessBuilder

new ProcessBuilder("nano", "myfile").inheritIO().start();

不过,这不起作用。显示nano,但无法编辑文件。

明确一点:我想打开nano,以便用户可以编辑临时文件。我正在寻找一种在 C 或 Ruby 中执行系统调用之类的方法。

如果这个问题已经有答案,我很抱歉。谷歌搜索没有任何帮助,因为所有结果都是关于使用 nano 编辑 Java 文件。

任何帮助将不胜感激。

【问题讨论】:

  • ProcessBuilder 命令对我有用。顺便说一句,对编辑器进行硬编码对于软件来说是一种粗鲁的行为。请考虑使用new ProcessBuilder(System.getenv().getOrDefault("EDITOR", "nano"), file)。几十年来,许多工具都使用 EDITOR 环境变量来指示用户首选的文本编辑器。
  • 您是否在等待该过程完成?你不表现出来,或者说出来。 C 的system() 函数确实在等待。如果您不等待,编辑器实际上会运行,但是当您手动保存已编辑的文件时,您的 Java 程序已经使用了原始文件。
  • 是的,我也试过.waitFor()。它并没有真正帮助。我几乎可以使用它,但是当我尝试使用箭头或按 Ctrl-O 保存时,它只是打印了代码(如 ^O 和 ^[OC)。

标签: java nano


【解决方案1】:

因为你需要捕捉命令并且你必须直接进入进程。想象一下,您在没有键盘的计算机上启动了一个进程。您需要编写向 nano shell 发送命令的代码。

您可以查看此线程以查看how to interact with ProcessBuilder。这是一个复制粘贴的示例代码,请点击链接了解更多详细信息:

public class TestMain {
    public static void main(String a[]) throws InterruptedException {

        List<String> commands = new ArrayList<String>();
        commands.add("telnet");
        commands.add("www.google.com");
        commands.add("80");
        ProcessBuilder pb = new ProcessBuilder(commands);
        pb.redirectErrorStream(true);
        try {

            Process prs = pb.start();
            Thread inThread = new Thread(new In(prs.getInputStream()));
            inThread.start();
            Thread.sleep(2000);
            OutputStream writeTo = prs.getOutputStream();
            writeTo.write("oops\n".getBytes());
            writeTo.flush();
            writeTo.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class In implements Runnable {
    private InputStream is;

    public In(InputStream is) {
        this.is = is;
    }

    @Override
    public void run() {
        byte[] b = new byte[1024];
        int size = 0;
        try {
            while ((size = is.read(b)) != -1) {
                System.err.println(new String(b));
            }
            is.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

【讨论】:

  • 我在问题中没有看到任何建议从 Java 程序向 nano 发送命令。看起来 H.A. Sanger 只想调用编辑器并等待用户完成文件编辑,就像许多命令行版本控制命令在提交时所做的那样。
  • Q 说“命令行”,这通常意味着终端可用,并使用inheritIO(),它将/将使用该终端。
猜你喜欢
  • 2015-09-26
  • 2011-11-27
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
相关资源
最近更新 更多