繁体   English   中英

Java InputStreamReader

[英]Java InputStreamReader

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

根据评论,那么创建一个读取数据并将其发送给注册读者的对象会更好吗?

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

答案是,对于这个问题,没有简单而有效的通用解决方案……并且始终有效。 根本问题是任意InputStream或Reader可能会传送无限量的数据。 当然,要在内存中缓冲的数据要多得多。 (大量数据==> OutOfMemoryError 。)

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

  • 整个流被缓存在内存中。
  • 必须先读取和缓冲整个流, 然后才能将Readers分发给数据使用者。

为了避免使用过多的内存,“复制” InputStream / Reader需要能够将未读取的数据写入临时文件,然后再从同一文件中读取。 这变得相当复杂,而且很快。 即使没有临时文件,它仍然是一个有点棘手落实具有先阅读整个流的版本,而且不具有不读书的读者块之一的另一个问题。

我想您可以通过创建两个PipeInputStream / PipeOutputStream对来实现此目的, PipeOutputStream对的pipeSize参数的大小与两个Reader可能失步的数量一样大。 但是在最坏的情况下,您需要足够大的缓冲区来容纳流内容的两倍大小……而这种方法将导致大量额外的数据复制。 换句话说,这种方法几乎没有效率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM