我有一个JAR文件,该文件一直在等待用户输入,处理和打印结果(以多行)为单词
>Input sentence 1
Result 1
Result 2
>Input sentence 2
Result 1
Result 2
Result 3
>
退出此JAR程序的唯一方法是按CTRL C。
现在,我想从我的Java程序中调用此JAR文件。我的代码看起来像这样:
processBuilder = new ProcessBuilder(PATH_TO_BIN);
Process process = processBuilder.start();
writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
writer.write(inputSentence);
writer.newLine();
writer.flush();
String line;
while ((line = reader.readLine()) != null){ //<<<< it hangs here
System.out.println(line);
}
我的程序可以成功打印出" JAR"程序返回的结果,但是它一直挂在下一个reader.readLine()
,我无法提供" JAR"程序的下一个输入。
有什么方法可以解决此问题?
预先感谢!
您可以使用一个线程读取和其他文字写,然后它不会阻止读取,如这样:
ProcessBuilder processBuilder = new ProcessBuilder(PATH_TO_BIN);
Process process = processBuilder.start();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
new Thread () {
public void run() {
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
do {
line = reader.readLine();
System.out.println(line);
} while (line != null); // <<<< it waits here for next line of input
}
}.start();
// and here you can write something to the process InputSteram...
writer.write(inputSentence);
writer.newLine();
writer.flush();
方法ready()来自bufferedreader -tells是否准备好读取此流。
您可以使用此方法检查是否准备好阅读流,如果是,则可以完成您的工作,
while (reader.ready()){
//Do the processing
}
看看这是否有效。
我要依靠 @krzystof的答案,但是我假设您将使用Java 7或8( )。
在这种情况下,您应该使用try-with-resources,如下:
public static void main (String[] args) throws java.lang.Exception {
ProcessBuilder prBuilder = new ProcessBuilder("/path/to/bin");
Process process = prBuilder.start();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())) | BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
// Process input
}
} catch (IOException ex) {
// Process IOException
} finally {
process.kill();
}
}