【发布时间】:2013-08-14 04:43:24
【问题描述】:
考虑一个通用的字节读取器,它实现了以下简单的 API,以从无法访问的数据结构中读取未指定数量的字节:
public interface ByteReader
{
public byte[] read() throws IOException; // Returns null only at EOF
}
如何将上述内容有效地转换为标准Java InputStream,以便使用InputStream 类定义的所有方法的应用程序按预期工作?
一个简单的解决方案是将InputStream 子类化为
- 根据
InputStream的read(...)方法的需要调用ByteReader的read()方法 - 缓冲在 byte[] 数组中检索到的字节
- 按预期返回字节数组的一部分,例如,每当调用
InputStream read()方法时,一次返回 1 个字节。
但是,这需要更多的工作才能提高效率(例如,为了避免多字节数组分配)。此外,为了让应用程序扩展到较大的输入大小,将所有内容读入内存然后进行处理不是一种选择。
有什么可以使用的想法或开源实现吗?
【问题讨论】:
-
检查了BufferedInputStream 源代码。我认为它使用了类似的想法,也许您可以将其扩展为从您的数据结构中读取
-
是的,我在写问题之前已经检查过了。本质上需要一个类似fill()的函数,但是在ByteArrayInputStream实现中似乎太复杂了,所以我想知道是否有更简单的方法。
-
@PNS 您可以在
ByteInputStream的底层数组上使用Arrays.fill()。 -
这仅适用于将一个值设置为多个数组位置。 :-)
-
不,你不能,但这不是问题的主要主题。在检查效率之前,必须先将 ByteReader 转换为 InputStream。
标签: java byte bytearray inputstream