【问题标题】:How do I read and write from an external process in Java?如何在 Java 中从外部进程读取和写入?
【发布时间】:2014-06-26 19:45:55
【问题描述】:

我想从 Java GUI 运行 PianoBar(PianoBar 是一个从命令行运行 Pandora 的程序)。我以为这会又快又脏,但我想我对程序之间的交互了解不够。

我使用 ProcessBuilder 来启动 PianoBar 的实例,如下所示:

    private Process createPianoBarProcess() throws IOException {
        String[] command = {"CMD", "/C", "pianobar"};
        ProcessBuilder probuilder = new ProcessBuilder( command );
        probuilder.redirectErrorStream(true);
        probuilder.directory(new File("~~location where pianobar.exe is~~"));
        Process process = probuilder.start();
        return process;
    }

创建进程后,我创建一个 BufferedReader 以读取 PianoBar 输出:

    Process pianoBar = createPianoBarProcess();

    InputStream inS = pianoBar.getInputStream();
    InputStreamReader isr = new InputStreamReader(inS);
    BufferedReader br = new BufferedReader(isr);

但是当我通过这个阅读器读取 PianoBar 的输出时,它会吐出 PianoBar 的第一行(“Welcome to Pianobar (2013.05.19-win32)!Press ? for a list of commands.”),然后它吐出下一行(“[?] 电子邮件:”)。然后它就挂了。

显然,它正在等待用户输入他们的电子邮件。但无论我尝试什么,我都无法让我的 Java 程序在出现提示时将电子邮件写入 PianoBar 进程 - 它只会在读出最后一个字符时挂起。

有可能做我想做的事吗?我认为在互联网上寻找这将是一件容易的事情,但我一直无法找到任何东西。我想要的只是一种在出现提示时写入外部进程的简单方法。看起来这应该很容易......

【问题讨论】:

    标签: java process processbuilder


    【解决方案1】:

    您可以使用以下代码 sn-p 开始工作:

    String s;
    //s = email
    BufferedWriter bufferedwriter = new BufferedWriter(new OutputStreamWriter(pianoBar.getOutputStream()));
    bufferedwriter.write(s);
    bufferedwriter.flush();
    

    完成! 记得用适当的 try/catch 包围代码块

    【讨论】:

    • 所以这段代码比我用来写的代码要好,但问题是现在我写完电子邮件后,只要我尝试在下一行阅读(应该是“[ ?] 密码:"),它挂起。当我尝试使用调试模式查看 BufferedReader 缓冲区中的字符时,它只显示它已读取的字符,然后显示缓冲区中的一堆空槽。一旦它尝试读取其中两个空插槽,它就会挂起,不会抛出任何异常。缓冲区也没有显示“[?] password:”的迹象。
    • 您可以在相同的字符串中输入密码,并用“\n”分隔电子邮件和密码。
    • 即使尝试这样做,当我再次尝试使用 BufferedReader 时,它仍然会挂起。就好像缓冲区中有无法克服的东西。考虑到这一点,也许我可以刷新缓冲区?但似乎没有办法做到这一点,如果我关闭阅读器,如果不抛出 IOException,我将无法再次打开它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多