代码之家  ›  专栏  ›  技术社区  ›  ken

将管道应用程序的控制台文本捕获到另一个应用程序

  •  0
  • ken  · 技术社区  · 16 年前

    我很抱歉如果标题很混乱,但我想知道是否有可能得到一个应用程序的STDUT,它被用JAVA传送到另一个应用程序中。

    这是命令行。

    sox -d -t wav - | lame - test.mp3
    

    如果这是在bash中执行的,那么这就是输出。

    Input File     : '/dev/dsp' (ossdsp)
    Channels       : 2
    Sample Rate    : 48000
    Precision      : 16-bit
    Sample Encoding: 16-bit Signed Integer PCM
    
    In:0.00% 00:00:25.00 [00:00:00.00] Out:1.20M [     -|=-    ]        Clip:0
    

    最后一行由SOX更新,直到用户发送sigint。

    问题是,在Java中,来自该进程的输入流不会产生任何数据。但如果我忽略了从SOX到LAME的管道, sox -d -t wav test.wav ,inputstream获取数据。我的问题是,控制台出了什么事?我怎样才能接触到它。

    1 回复  |  直到 16 年前
        1
  •  1
  •   hlovdal    16 年前

    当bash开始执行时 sox -d -t wav - | lame - test.mp3 ,因为管道字符bash将分叉两个进程来执行每个命令,然后用stdin将stdout从第一个进程连接到第二个进程。bash不会对任何进程的stderr执行任何特定操作,因此从sox中看到的屏幕输出( Input File ... )不是管道操作的一部分。

    从你的问题我可以理解,你有一个Java程序启动这两个SOX和LAME进程。关于你是如何做到这一点的更多细节将是好事。但在任何情况下,要获得屏幕输出,您必须从SOX进程中读取stderr。