Java InputStreamReader

时间:2010-07-15 07:30:08

标签: java

有没有简单有效的方法来复制InputStreamReader?

2 个答案:

答案 0 :(得分:1)

根据评论,创建1个读取数据并将其发送给注册读者的对象不是更好吗?

class Reader {
   void registerReceiver(Receiver r) {
     // add reciever
   };
   void unRegisterReceiver(Receiver r) {
     // remove reciever
   };
   // do reading from inputstream in implementation 
   // and send read data to receivers
}
interface Reciever {
   void receive(byte [] data);
}

答案 1 :(得分:0)

答案是,这个问题没有一般解决方案既简单又有效......而且总是有效。根本问题是任意InputStream或Reader可能会传递无限大量的数据。当然比你想要在内存中缓冲的数据更多。 (很多数据==> OutOfMemoryError。)

如果你想要一个非常简单的解决方案,那么只需使用InputStreamReader读取整个InputStream并将其内容写入CharArrayWriter。然后打开两个(或更多)CharArrayReaders ......你已经有效地复制了InputStream。有两个明显的问题:

  • 整个流缓存在内存中。
  • 之前必须读取和缓冲整个流,您可以将读者分发给数据的使用者。

为避免使用太多内存,“复制”InputStream / Reader需要能够将未读数据写入临时文件,然后从同一文件中读回。这变得相当复杂,而且很快。即使没有临时文件,实现必须首先读取整个流的版本仍然有点棘手,并且没有读取其中一个读者的问题阻止另一个。

我认为您可以通过创建两个PipeInputStream / PipeOutputStream对,其pipeSize参数与两个读者可能离开的数量一样大,从而实现此目的。步。但在最糟糕的情况下,你需要足够大的缓冲区以容纳两倍流内容的大小......这种方法将导致大量额外的数据复制。换句话说,这种方法几乎没有效率。