2013-01-22 61 views
0

请考虑以下测试代码。使用带管道流的普通流写入器/阅读器

我想知道是否可以使用管道流,如“正常”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(); 
     } 
    } 
} 
} 

回答

0

正如你永远不会从读端读,这是不可能看到你可能得出这个结论,任何这样的结论是毫无根据的,因此和无效的。

您所做的只是在任意时间点打印available(),这不足以证明在读取结束时什么都没有出现。

+0

注意注释行: // message = reader.readLine(); 我一开始就试过这个,它一直在阻塞,所以为什么我现在加了那个电话。 – csvan