0

次のテスト コードを検討してください。

一般的に使用される Reader および Writer の実装と一緒に、「通常の」I/O ストリームのようなパイプ ストリームを使用できるかどうかを調べようとしています (具体的には、OutputStreamWriter を使用するという要求に取り組んでいるコード ベースの別の部分)。

ここでの問題は、読み取り側に何も表示されないように見えることです。プログラムは少なくともメッセージをパイプの書き込み側に正しく書き込んでいるように見えますが、もう一方の端から読み取ろうとすると無期限にブロックするか、(この場合のように) 使用可能なバイトをチェックすると、呼び出しは 0 を返します.

私は何を間違っていますか?

public class PipeTest {

private InputStream input;
private OutputStream output;

public PipeTest() throws IOException {

    input = new PipedInputStream();
    output = new PipedOutputStream((PipedInputStream)input);

}

public void start() {

    Stuff1 stuff1 = new Stuff1(input);
    Stuff2 stuff2 = new Stuff2(output);

    Thread thread = new Thread(stuff1);
    thread.start();
    Thread thread2 = new Thread(stuff2);
    thread2.start();
}

public static void main(String[] args) throws IOException {

    new PipeTest().start();
}

private static class Stuff1 implements Runnable {

    InputStream inputStream;

    public Stuff1(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    @Override
    public void run() {

        String message;
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        try {
            //message = reader.readLine();
            System.out.println("Got message!");
            System.out.println(inputStream.available());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

private static class Stuff2 implements Runnable {

    OutputStream outputStream;

    public Stuff2(OutputStream outputStream) {
        this.outputStream = outputStream;
    }

    @Override
    public void run() {

        String message = "Hej!!\n";

        OutputStreamWriter writer = new OutputStreamWriter(outputStream);
        try {
            writer.write(message);
            System.out.println("Wrote message!");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
}
4

1 に答える 1

0

読む側から読んでいるわけではないので、どのようにしてその結論に到達できるかを理解することは不可能であり、したがって、そのような結論は根拠がなく無効です。

あなたがしているのは、任意の時点で available() を出力することだけです。これは、読み取り側に何も表示されないことを証明するには不十分です。

于 2013-01-22T09:19:26.017 に答える