2

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]);
            }
        }

    }

私は正しい方向に進んでいますか?それとも私はこれをやろうとして完全に間違っていますか?もっと説明してほしい場合は、お気軽にお問い合わせください

4

2 に答える 2

4

PipedInputStream :

パイプされた入力ストリームは、パイプされた出力ストリームに接続する必要があります。パイプされた入力ストリームは、パイプされた出力ストリームに書き込まれたデータ バイトを提供します。

ByteArrayInputStream :

ByteArrayInputStream には、ストリームから読み取ることができるバイトを含む内部バッファーが含まれています。(構築中に配列を指定すると、ストリームはそれから読み取ります。)

于 2012-10-29T03:21:42.203 に答える
3

あなたのアプローチにはある程度の優雅さがありますが、タイミングロジックについてはそうではありません。BlockingQueue厄介なスリープを行う必要がないように、ストリームを a でバックアップする必要があります。ブロッキング キューを呼び出した場合take()、呼び出しは入力があるまでブロックされます。

しかし、すでに使用できるユーティリティがおそらくあるでしょう。1 つのオプションは、 and を使用PipedInputStreamしてから、他PipedOutputStreamの と同様に書き込むことです。完全な例を次に示します。PipedOutputStreamOutputStream

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 に答える