如何在Java中读取和写入外部进程?

如何在Java中读取和写入外部进程?,java,process,processbuilder,Java,Process,Processbuilder,我想从JavaGUI运行PianoBar(PianoBar是一个从命令行运行Pandora的程序)。我原以为这样做既快又脏,但我想我对程序之间的交互了解不够 我使用ProcessBuilder启动PianoBar实例,如下所示: private Process createPianoBarProcess() throws IOException { String[] command = {"CMD", "/C", "pianobar"}; ProcessB

我想从JavaGUI运行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的第一行(“欢迎使用PianoBar(2013.05.19-win32)!按?查看命令列表。”),然后它会吐出下一行(“[?]电子邮件:”)。然后它就挂了

显然,它正在等待用户输入他们的电子邮件。但是不管我怎么做,我都无法让我的Java程序在收到提示时将电子邮件写入PianoBar进程——它只是在读取最后一个字符时挂起


有可能做我想做的事吗?我原以为在互联网上找是件容易的事,但我什么也找不到。我想要的只是一种在提示时写入外部进程的简单方法。看起来这应该很容易…

您可以使用以下代码段开始工作:

String s;
//s = email
BufferedWriter bufferedwriter = new BufferedWriter(new OutputStreamWriter(pianoBar.getOutputStream()));
bufferedwriter.write(s);
bufferedwriter.flush();
完成了!
请记住用适当的try/catch来包围代码块

,因此此代码比我以前编写的代码要好,但问题是,现在在我编写电子邮件之后,只要我尝试阅读下一行(应该是“[?]password:”),它就会挂起。当我尝试使用调试模式查看BufferedReader的缓冲区中的字符时,它只显示它已读取的字符,然后显示缓冲区中的一组空插槽。一旦它尝试读取其中两个空插槽,它就会挂起,不会抛出任何异常。缓冲区也没有显示“[?]password:”。您可以在同一字符串中输入密码,并用“\n”分隔电子邮件和密码。即使尝试这样做,只要我再次尝试使用它,BufferedReader仍会挂起。这就好像缓冲区中有什么东西是它无法克服的。考虑到这一点,也许我可以冲洗缓冲区?但似乎没有办法做到这一点,如果我关闭阅读器,我无法再次打开它而不抛出IOException。