用于存储字节和执行InputStream的通用FIFO类。read()[Java 5及以上版本]
我正在考虑使用一些FIFO(例如,来自Apache Commons的BoundedFifoBuffer)作为基础来组织我的应用程序中的IO任务(我正在寻找一种易于使用的临时缓冲区,用于同时从流和FIFO中读取数据:因此,我将从InputStream中读取数据,然后在以后使用数据;在我的情况下,使用代码将主要以固定大小的块吃掉数据,但我不能保证从流中以相同大小的块获取这些数据。)-所以为了适应这一部分,我想使用FIFO,它也可以很容易地用于InputStream。读取()以减少数据复制量)
但我偶然发现了FIFO集合的通用实现。在我看来,Java泛型只是一个隐藏对象引用的门面。让一个带有基元类型参数的泛型集合类(它的数据容器是T[]数组)怎么样?是否可能,或者我必须使用包装器类型
对我来说,最有趣的问题是:使用像BoundedFifoBuffer这样的泛型集合,将其与字节泛型类型参数一起使用,然后尝试使用其数组从流中读取数据:InputStream是否是一个好主意。读取(字节[]b,整数关闭,整数长度)?如果这里的泛型集合指的是对盒装字节的大量引用,我怀疑我是否希望这样。。。有什么比创建绑定到字节类型的特殊集合更好的建议吗
PS:我当时在使用Java 2,但在4年多前就换成了C#2。现在我想更新我的Java知识。因此,至少在Java泛型方面,我可能会犯一些错误:)
更新:
我仍然喜欢Apache Commons*FifoBuffer类。我正在考虑重写其中一个,使用基本字节类型而不是泛型类型参数,然后添加一些逻辑,使用其数组从InputStream读取
GNU Trove展示了一种有趣的方法,可以为原始类型友好的集合生成简单的代码,但它缺少现成的FIFO。作为一个非常通用的解决方案,获得一些FifoBuffer并从中为GNU-Trove制作一个模板会很有趣。额外的逻辑很可能适合另外两个方法E[]getBufferArray()和int getBufferLength()(以了解如何直接在其数组上调用InputStream.read()。为了简单起见,我将跳过Trove步骤:)我检查了Mahout 0.2,到目前为止还没有找到任何FIFO集合。McDowell(基于ByteArrayStream)和java提供的示例。nio缓冲区非常接近我想要的。但是ByteArray*流只能重置为0,您无法方便地从中获取一些数据(不是所有缓冲区的数据),我只想删除那些我确定已准备好处理和丢弃的部分(例如,在传入数据中的下一个有效数据包之前的完整数据包或垃圾)。JAVA尼奥。ByteBuffer无法丢弃已读取的数据
总而言之:目前,循环FIFO看起来是最好的选择,我可能会从Apache Commons资源中获得一个,以适应我的需要(基本字节类型+使其适合read()调用)
对更新有什么评论吗
# 1 楼答案
首先,你不能说BoundedFifoBuffer<;字节>;。编译器不允许这样做
如果使用原始类型,就会得到自动装箱,其中
byte
会自动升级为Byte
,而您也不希望这样# 2 楼答案
根本不能将基元类型用作类型参数:
因此,您需要编写一个专门用于
byte
的类