可以插入的InputStream

时间:2013-01-22 09:36:35

标签: java concurrency io

是否可以使InputStream与基本InputStream相同,除非基本流被阻止时,可以通过调用方法将字节插入到流中?草图:

public class HackInputStream extends InputStream {
    public HackInputStream (InputStream base) { /* stuff */ }
    public int read() throws IOException { /* stuff */ }
    public void insertByte(byte b) { /* stuff */ }
}

我只会在基本流被明确阻止时插入字节,因此竞争条件不应成为问题。我试图使用一个线程来实现这个类,该线程从基本流中贪婪地读取字节到LinkedBlockingQueueinsertByte将字节直接插入队列,read只是从队列中读取字节,在队列为空时阻塞。

这几乎有效......但是当我使用Scanner制作new Scanner(new HackInputStream(System.in)时,nextLine方法无效。不幸的是,我首先想要这个奇怪的课程的原因是取消阻止被阻止的Scanner

(这是我试图解决的问题,以防有人有更好的解决方案:

我的程序是一个“shell”,它在给定命令时启动任务(线程)。其中一些任务自行终止,有些则不然。我希望在任务终止时立即返回命令提示符,但是如果任务永远不会终止,我想通过输入换行符来终止它。

目前,主线程等待任务终止,而看门狗线程等待换行,如果收到任务则终止任务。现在,如果任务自行终止,我无法在不手动输入换行符的情况下输入命令。看门狗线程被不间断地阻塞,无论如何都会消耗下一行输入,可能导致下一个命令无法读取。我正在尝试更改System.in,以便我可以通过编程方式提供换行符。)

1 个答案:

答案 0 :(得分:0)

更新:如果任务仍在运行,我只需调用Scanner.nextLine()即可以更简单的方式解决我的问题。