有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于存储字节和执行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()调用)

对更新有什么评论吗


共 (2) 个答案

  1. # 1 楼答案

    首先,你不能说BoundedFifoBuffer<;字节>;。编译器不允许这样做

    如果使用原始类型,就会得到自动装箱,其中byte会自动升级为Byte,而您也不希望这样

  2. # 2 楼答案

    根本不能将基元类型用作类型参数:

    found   : int
    required: reference
        List<int> l = new ArrayList<int>();
             ^
    

    因此,您需要编写一个专门用于byte的类