2

我正在尝试创建一个 InputStream 类,它的行为类似于 System.in 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]);
            }
        }

    }

我在正确的轨道上吗?还是我尝试这样做完全错了?如果您想让我解释更多,请随时询问

4

2 回答 2

4

管道输入流

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

字节数组输入流

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

于 2012-10-29T03:21:42.203 回答
3

你的方法有一些优雅,但不是围绕时序逻辑。您应该通过 a 来支持您的流,BlockingQueue这样您就不必进行令人讨厌的睡眠。如果您调用take()阻塞队列,则调用将阻塞,直到有输入。

但是您可能已经可以使用一些实用程序。一种选择是使用PipedInputStreamand 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);
    }
}
于 2012-10-29T03:27:17.660 回答