使用带有管道流的普通流编写器/读取器

时间:2013-01-22 09:14:17

标签: java

考虑以下测试代码。

我试图找出是否可以使用像“普通”I / O流这样的管道流,以及常用的Reader和Writer实现(具体来说,我正在处理的代码库的另一部分是我使用的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();
        }
    }
}
}

1 个答案:

答案 0 :(得分:0)

由于你从来没有读过阅读结尾,所以你不可能看到你如何得出这个结论,因此任何这样的结论都是毫无根据和无效的。

您所做的只是在任意时间点打印可用(),这不足以证明在读取结束时没有任何内容显示。