具体来说,问题是写一个这样的方法:
int maybeRead(InputStream in, long timeout)
Run Code Online (Sandbox Code Playgroud)
如果数据在'timeout'毫秒内可用,则返回值与in.read()相同,否则为-2.在方法返回之前,任何生成的线程都必须退出.
为了避免参数,这里的主题是java.io.InputStream,由Sun(任何Java版本)记录.请注意,这并不像看起来那么简单.以下是Sun的文档直接支持的一些事实.
in.read()方法可能是不可中断的.
将InputStream包装在Reader或InterruptibleChannel中没有帮助,因为所有这些类都可以调用InputStream的方法.如果可以使用这些类,则可以编写一个直接在InputStream上执行相同逻辑的解决方案.
in.available()返回0总是可以接受的.
in.close()方法可能会阻塞或不执行任何操作.
没有通用的方法来杀死另一个线程.
如果我通过Java的ProcessBuilder类启动一个进程,我可以完全访问该进程的标准输入,标准输出和标准错误流,如Java InputStreams和OutputStreams.不过,我不能找到一种方法,这些流无缝连接System.in,System.out和System.err.
可以用来redirectErrorStream()获取InputStream包含子进程的标准输出和标准错误的单个,然后循环遍历并通过我的标准输出 - 但是我找不到这样做的方法并让用户键入进程,如果我使用C system()调用他或她可以.
这在Java SE 7出现时似乎是可能的 - 我只是想知道现在是否有解决方法.如果isatty()子进程的结果通过重定向,则奖励积分.
我使用Runtime exec()方法在Java中创建子进程.但是,由于子进程是一个交互式程序,我需要在需要时为其提供输入.另外,我需要显示子进程的输出.我怎样才能以最简单的方式做到这一点?
我使用StreamGobbler使用process.getInputStream()显示程序输出.但是,我不知道如何识别程序何时等待输入以及何时使用proc.getOutputStream提供输入.我怎样才能做到这一点?
我希望能够与我的Java代码同时运行外部程序,即我想启动程序,然后将控制权返回给调用方法,同时保持外部程序同时运行.然后,Java代码将继续生成输入并将其发送到外部程序并接收输出.
我不想继续加载外部程序,因为它有很高的开销.完成此任务的最佳方法是什么?谢谢!