是否可以制作InputStream
与 base 相同的an 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
使用 using时new Scanner(new HackInputStream(System.in)
,该nextLine
方法不起作用。不幸的是,我首先想要这个奇怪的类的原因是为了解锁一个被阻止的Scanner
!
(这是我要解决的问题,以防有人有更好的解决方案:
我的程序是一个“shell”,它在给定命令时启动任务(线程)。其中一些任务会自行终止,而有些则不会。我想在任务终止时立即返回到命令提示符,但如果任务永远不会终止,我想通过输入换行符来终止它。
目前,主线程等待任务终止,而看门狗线程等待换行符,如果接收到则终止任务。现在,如果任务自行终止,我无法在不手动输入换行符的情况下输入命令。看门狗线程被不间断地阻塞,无论如何它都会消耗下一行输入,可能导致下一个命令未读。我正在尝试进行更改System.in
,以便可以以编程方式为其提供换行符。)