是否可以使InputStream
与基本InputStream
相同,除非基本流被阻止时,可以通过调用方法将字节插入到流中?草图:
public class HackInputStream extends InputStream {
public HackInputStream (InputStream base) { /* stuff */ }
public int read() throws IOException { /* stuff */ }
public void insertByte(byte b) { /* stuff */ }
}
我只会在基本流被明确阻止时插入字节,因此竞争条件不应成为问题。我试图使用一个线程来实现这个类,该线程从基本流中贪婪地读取字节到LinkedBlockingQueue
。 insertByte
将字节直接插入队列,read
只是从队列中读取字节,在队列为空时阻塞。
这几乎有效......但是当我使用Scanner
制作new Scanner(new HackInputStream(System.in)
时,nextLine
方法无效。不幸的是,我首先想要这个奇怪的课程的原因是取消阻止被阻止的Scanner
!
(这是我试图解决的问题,以防有人有更好的解决方案:
我的程序是一个“shell”,它在给定命令时启动任务(线程)。其中一些任务自行终止,有些则不然。我希望在任务终止时立即返回命令提示符,但是如果任务永远不会终止,我想通过输入换行符来终止它。
目前,主线程等待任务终止,而看门狗线程等待换行,如果收到任务则终止任务。现在,如果任务自行终止,我无法在不手动输入换行符的情况下输入命令。看门狗线程被不间断地阻塞,无论如何都会消耗下一行输入,可能导致下一个命令无法读取。我正在尝试更改System.in
,以便我可以通过编程方式提供换行符。)
答案 0 :(得分:0)
更新:如果任务仍在运行,我只需调用Scanner.nextLine()
即可以更简单的方式解决我的问题。