我对 Java 进程对象有疑问。
我想打开名为 linphonec.exe 的进程来调用电话,在这个进程中我必须插入一些命令行来调用电话、接听...
当我必须插入多个命令行时,就会出现问题,因为当我调用 OutputStream 的 close() 方法时,Process 的 OutputStream 仅接受命令行。如果我不调用此方法,则不会执行命令行。
我想执行多个命令,但我不能。
示例:
“调用电话”,然后“终止”以随时结束通话。
但是我只能插入第一个命令行,如果不使用 close() 方法,则不会执行命令行。
代码:
启动一个进程:
ProcessBuilder builder = new ProcessBuilder(PROCESS);
builder.redirectErrorStream(true);
Process p = builder.start();
读取Process的InputStream:
InputStream i = p.getInputStream();
System.out.print((char)i.read());
while(i.available() > 0){
System.out.print((char)i.read());
}
将命令行插入OutputStream:
String command = com.nextLine();
OutputStream o = p.getOutputStream();
o.write(comando.getBytes());
o.flush();
o.close();
如果我删除“o.close()”,则不会执行命令行,但如果执行它,则无法执行其他命令行。
我在程序中尝试了代码,但是当我插入命令行时,我看不到该进程的下一个信息。
当我输入你的代码时:
Ready
Warning: video is disabled in linphonec, use -V or -C or -D to enable.
linphonec> Registration on sip:XX.XX.XX.XX successful.
linphonec> call XXX
以我的代码为例:
Ready
Warning: video is disabled in linphonec, use -V or -C or -D to enable.
linphonec> Registration on sip:XX.XX.XX.XX successful.
linphonec> call XXX
Establishing call id to sip:XXX@XX.XX.XX.XX, assigned id 1
With "Available > 0" I get "Establishing call id to sip:XXX@XX.XX.XX.XX, assigned id 1".
如果我使用这个循环,我看不到该过程的其他信息。
我认为问题在于,在执行 Close 方法之前,输出流无法获取命令行。
谢谢。
抱歉我的英语不好。
最佳答案
我怀疑问题出在这里:
InputStream i = p.getInputStream();
System.out.print((char)i.read());
while(i.available() > 0){
System.out.print((char)i.read());
}
如果通过输入流来自进程的字节流暂时暂停,则 available()
将返回零,并且读取循环将终止。游戏结束。
不要使用available()
...
循环应如下所示:
InputStream i = p.getInputStream();
int input;
while ((input = i.read()) != -1) {
System.out.print((char) input);
}
为什么会这样?
我们不是测试是否有字节要读取,而是直接读取。 read() 调用将阻塞,直到有字符要读取,或者“另一端”关闭管道。在后一种情况下,read()
将返回 -1
以指示已到达流末尾。
更新
所以这不是问题。 (或者至少,不是全部问题)。
另一种可能性是您没有将正确类型的行终止符写入输出流。这可能会导致外部进程在您关闭流之前无法获得“完整”命令。
第三种可能性是您需要与应用程序同步;即等待第一个命令的输出,然后再发送第二个命令,依此类推。
关于java - Java 进程对象的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30170800/