【问题标题】:Capture console text of piped app to another app将管道应用程序的控制台文本捕获到另一个应用程序
【发布时间】:2010-02-28 13:00:34
【问题描述】:

很抱歉,如果标题很混乱,但我想知道是否有可能获取一个应用程序的标准输出,该应用程序通过管道传输到 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 中,来自该进程的 InputStream 不会产生任何数据。但是,如果我省略了 sox 的管道,sox -d -t wav test.wav,InputStream 会获取数据。我的问题是,控制台出了什么问题?我怎样才能访问它。

【问题讨论】:

  • 你是如何使用 Java 来执行这个命令的? Runtime.exec()? ProcessBuilder?

标签: java exec pipe external-process


【解决方案1】:

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

根据我从您的问题中了解到的情况,您有一个 java 程序可以启动这两个 sox 和 lame 进程。有关您如何执行此操作的更多详细信息会很好。但无论如何,要获得您展示的示例屏幕输出,您必须从 sox 进程中读取 stderr。

【讨论】:

  • hmmm,现在我可以从 stderr 读取控制台,我必须使用 CMD /C 从中流式传输。我想这回答了我的问题
  • 哦,跟进问题。现在我不能杀死产生的sox。 process.destroy 不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多