如何创建一个像System.in一样的InputStream

时间:2012-10-29 03:15:03

标签: java

我正在尝试创建一个类似于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]);
            }
        }

    }

我是否在正确的轨道上?或者我试图这样做完全错了? 如果您希望我解释更多,请随时提出

2 个答案:

答案 0 :(得分:3)

PipedInputStream

  

管道输入流应连接到管道输出流;该   管道输入流然后提供写入的任何数据字节   管道输出流。

ByteArrayInputStream

  

ByteArrayInputStream包含一个包含字节的内部缓冲区   可以从流中读取。   (在构造期间给出一个数组,流将从中读取。)

答案 1 :(得分:3)

你的方法有一些优雅,但不是时间逻辑。你应该用BlockingQueue来支持你的流,这样你就不必做那令人讨厌的睡眠了。如果您在阻塞队列上调用take(),则呼叫将阻止,直到输入为止。

但是你可以使用它们。一种选择是使用PipedInputStreamPipedOutputStream,然后像其他任何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);
    }
}