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

3
我希望从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的第一行(“欢迎来到pianobar(2013.05.19-win32)!按?获取命令列表。”),然后输出下一行(“[?]电子邮件:”)。然后就卡住了。
显然,它正在等待用户输入他们的电子邮件。但无论我尝试什么,都不能让我的Java程序在提示时将电子邮件写入PianoBar进程 - 一旦它读出最后一个字符,它就会卡住。
我正在尝试做的事情可能是可行的吗?我认为这应该是在互联网上容易寻找的东西,但我一直没有找到任何信息。我想要的只是一种在提示时轻松写入外部进程的方法。似乎这应该很容易...
1个回答

0
您可以使用以下代码片段来使其工作:
String s;
//s = email
BufferedWriter bufferedwriter = new BufferedWriter(new OutputStreamWriter(pianoBar.getOutputStream()));
bufferedwriter.write(s);
bufferedwriter.flush();

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


所以这段代码比我之前用来写的更好,但问题是现在在我写完电子邮件后,只要我尝试读取下一行(应该是“[?]密码:”),它就会挂起。当我尝试使用调试模式查看BufferedReader缓冲区中有哪些字符时,它只显示它已经读取的字符,然后是缓冲区中的一堆空槽。一旦它尝试读取其中两个空槽,它就会挂起,而没有抛出任何异常。缓冲区也没有显示“[?]密码:”的任何迹象。 - MaxStrange
您可以在同一字符串中使用'\n'分隔电子邮件和密码来输入密码。 - Aniruddha Sarkar
即使尝试了这样做,当我再次尝试使用BufferedReader时,它仍然会挂起。好像缓冲区里有些东西无法解决。考虑到这一点,也许如果我可以清空缓冲区?但似乎没有办法这样做,如果我关闭读取器,就无法重新打开它而不抛出IOException。 - MaxStrange

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接