有没有简单有效的方法来复制InputStreamReader?
最佳答案
答案是,对于这个问题,没有简单而有效的通用解决方案……并且始终有效。根本问题是任意InputStream或Reader可能会传送无限量的数据。当然,要在内存中缓冲的数据要多于您想缓冲的数据。 (大量数据==> OutOfMemoryError
。)
如果您想要一个非常简单的解决方案,则只需使用InputStreamReader读取整个InputStream并将其内容写入CharArrayWriter。然后打开两个(或多个)CharArrayReaders ...,您已经有效地复制了InputStream。有两个明显的问题:
整个流被缓存在内存中。
必须先读取和缓冲整个流,然后才能将Readers分发给数据使用者。
为了避免使用过多的内存,“复制” InputStream / Reader需要能够将未读取的数据写入临时文件,然后再从同一文件中读取。这变得相当复杂,而且很快。即使没有临时文件,实现一个不必先读取整个流的版本仍然有些棘手,并且不存在不读取其中一个Reader会阻塞另一个Reader的问题。
我想您可以通过创建两个PipeInputStream
/ PipeOutputStream
对和一个pipeSize
参数来实现此目的,该参数与两个Reader可能会失步的数量一样大。但是在最坏的情况下,您需要足够大的缓冲区来容纳流内容大小的两倍...而这种方法将导致大量额外的数据复制。换句话说,这种方法几乎不算有效。
关于java - Java InputStreamReader,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3253356/