java - Java 进程对象的问题

标签 java netbeans process outputstream linphone

我对 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/

相关文章:

node.js - NodeJS 子进程在 SIGINT 上终止

java - Openfire 因 Java 错误而崩溃

java - Spring Bean 到底是什么?

java - Android Collections.compare() 更改标准

java - 如何让 netbeans 启动得更快

node.js 子进程 - spawn 和 fork 之间的区别

java - 我如何在 Java 中监听 UDP 端口?

java - 网络应用程序迁移

java - 如何分析和理解 Java Web 应用程序的输出

delphi - 如何等待异步 CopyHere(Shell API 命令)完成 ZIP 压缩?