我正在尝试创建一个类似于System.in InputStream的InputStream类,但可以以编程方式添加到(可以动态添加到的无限InputStream中)
如果你无法理解我的意思,这就是我写的和尝试的内容
public class QueuedInputStream extends InputStream {
private LinkedList<Character> list;
public QueuedInputStream() {
list = new LinkedList<Character>();
}
@Override
public int read() throws IOException {
while (list.isEmpty()) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int value = (byte)list.get(0).charValue();
list.remove();
return value;
}
public void queue(String s) {
char[] chars = s.toCharArray();
for(int i = 0; i < chars.length; i++) {
list.add(chars[i]);
}
}
}
我是否在正确的轨道上?或者我试图这样做完全错了? 如果您希望我解释更多,请随时提出
答案 0 :(得分:3)
管道输入流应连接到管道输出流;该 管道输入流然后提供写入的任何数据字节 管道输出流。
ByteArrayInputStream包含一个包含字节的内部缓冲区 可以从流中读取。 (在构造期间给出一个数组,流将从中读取。)
答案 1 :(得分:3)
你的方法有一些优雅,但不是时间逻辑。你应该用BlockingQueue
来支持你的流,这样你就不必做那令人讨厌的睡眠了。如果您在阻塞队列上调用take()
,则呼叫将阻止,直到输入为止。
但是你可以使用它们。一种选择是使用PipedInputStream
和PipedOutputStream
,然后像其他任何PipedOutputStream
一样写入OutputStream
。这是一个完整的例子:
public static void main(String[] args) throws IOException, InterruptedException {
PipedOutputStream pipedOutputStream = new PipedOutputStream();
final PipedInputStream in = new PipedInputStream(pipedOutputStream);
PrintWriter writer = new PrintWriter(pipedOutputStream, true);
new Thread(new Runnable() {
@Override
public void run() {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
try {
for (String line; (line = reader.readLine()) != null; ) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
for (int i = 0; i < 1000; i++) {
writer.println(i);
Thread.sleep(1000);
}
}