【问题标题】:Issue with a Process Object of JavaJava 进程对象的问题
【发布时间】:2015-05-11 14:47:24
【问题描述】:

我对 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 方法之前,输出流没有获取命令行。

谢谢。

对不起,我的英语不好。

【问题讨论】:

    标签: java netbeans process outputstream linphone


    【解决方案1】:

    我怀疑问题出在这里:

        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 以指示已到达流的末尾。

    更新

    所以这不是问题。 (或者至少,不是整个问题)。

    另一种可能性是您没有将正确类型的行终止符写入输出流。这可能会导致外部进程在您关闭流之前无法获得“完整”命令。

    第三种可能是你需要与应用程序同步;即 wait 在发送第二个命令之前等待第一个命令的输出,依此类推。

    【讨论】:

    • 我在我的程序上尝试了代码,但是当我插入命令行时,我看不到进程的下一个信息。当我输入您的代码时:就绪警告:在 linphonec 中禁用了视频,请使用 -V 或 -C 或 -D 启用。 linphonec> sip:XX.XX.XX.XX 注册成功。 linphonec>呼叫XXX
    • 以我的代码为例:就绪警告:视频在 linphonec 中被禁用,使用 -V 或 -C 或 -D 启用。 linphonec> sip:XX.XX.XX.XX 注册成功。 linphonec> call XXX 建立呼叫 id 到 sip:XXX@XX.XX.XX.XX,分配 id 1 使用“可用 > 0”我得到“建立呼叫 id 到 sip:XXX@XX.XX.XX.XX,分配 id 1"。如果我使用这个循环,我看不到该过程的其他信息。我认为问题在于输出流在我执行 Close 方法之前没有得到命令行。谢谢。
    猜你喜欢
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多