首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java InputStreamReader

Java InputStreamReader
EN

Stack Overflow用户
提问于 2010-07-15 15:30:08
回答 2查看 1K关注 0票数 0

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-15 17:59:42

答案是,对于这个问题,没有既简单又有效的通用解决方案。这总能行得通。根本问题在于,任意的InputStream或读取器可能会传递无限大的数据量。当然比你想要在内存中缓冲的数据还要多。(大量的数据==> OutOfMemoryError。)

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

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

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

我假设您可以通过创建两个PipeInputStream / PipeOutputStream对来实现这一点,该对的pipeSize参数与两个读取器可能不同步的数量一样大。但在最坏的情况下,您需要足够大的缓冲区来容纳两倍于流内容的大小……这种方法将导致大量额外的数据复制。换句话说,这种方法很难算作是有效的。

票数 0
EN

Stack Overflow用户

发布于 2010-07-15 16:15:18

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3253356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档