Java-ByteBuffer或ArrayList<;字节>;?

Java-ByteBuffer或ArrayList<;字节>;?,java,arraylist,bytebuffer,Java,Arraylist,Bytebuffer,最近,我创建了一个包装器,用于将数据读写到字节数组中。为此,我一直在使用ArrayList,但我想知道这是否是最有效的方法,因为: addAll()不适用于byte数组(甚至使用arrays.asList(),它返回我List)。为了修复它,我只是循环并在每个循环中添加一个字节,但我认为这需要大量的函数调用,因此会带来性能成本 从ArrayList获取字节[]时也会发生同样的情况。我不能从字节[]转换到字节[],所以我必须使用循环 我想存储字节而不是字节会占用更多内存 我知道ByteArra

最近,我创建了一个包装器,用于将数据读写到
字节
数组中。为此,我一直在使用
ArrayList
,但我想知道这是否是最有效的方法,因为:

  • addAll()
    不适用于
    byte
    数组(甚至使用
    arrays.asList()
    ,它返回我
    List
    )。为了修复它,我只是循环并在每个循环中添加一个
    字节
    ,但我认为这需要大量的函数调用,因此会带来性能成本
  • ArrayList
    获取
    字节[]
    时也会发生同样的情况。我不能从
    字节[]
    转换到
    字节[]
    ,所以我必须使用循环
  • 我想存储字节而不是字节会占用更多内存
我知道
ByteArrayInputStream
ByteArrayOutputStream
可以用于此,但它有一些不便之处:

  • 我想实现以不同字节顺序读取不同数据类型的方法(例如,
    readInt
    readLEInt
    readUInt
    ,等等),而这些类只能读取/写入字节或字节数组。这不是一个真正的问题,因为我可以在包装器中修复它。但第二个问题来了
  • 我希望能够同时写和读,因为我用它来解压一些文件。因此,要为它创建包装器,我需要同时包含
    ByteArrayInputStream
    ByteArrayOutputStream
    。我不知道这些数据是否可以以某种方式进行同步,或者每次写入包装器时,我都必须将其中一个的全部数据写入另一个

因此,我的问题来了:使用
ByteBuffer
会更有效吗?我知道你可以从中获取
整数
浮点数
,甚至可以更改字节顺序。我想知道的是,在使用
ByteBuffer
ArrayList
之间是否有真正的性能变化,肯定ByteBufferByteArrayOutputStream。就你的情况来说似乎没问题。检查Javadoc,因为它有很好的方法,对于putInt/getInt等,您可能需要设置(这4个字节的)顺序

对于文件,您可以使用
getChannel()
或变体,然后使用
MappedByteBuffer


ByteBuffer可以包装字节数组或进行分配。

请记住,每个对象都有与其相关的开销,包括每个对象的内存位和超出范围后的垃圾收集


使用
List
意味着每字节创建/垃圾收集一个对象,这是非常浪费的。

ByteBuffer是一个围绕字节数组的包装类,它不像ArrayList那样具有动态大小,但它每字节消耗的内存更少,速度更快。 如果您知道需要的大小,那么可以使用ByteBuffer,如果您不知道,那么可以使用ByteArrayOutputStream(也可以使用ObjectOutputStream包装,它有一些方法来写入不同类型的数据)。要读取已写入ByteArrayOutputStream的数据,可以扩展ByteArrayOutputStream,然后可以访问字段buf[]和count,这些字段受保护,因此可以通过扩展类访问它们,如下所示:

public class ByteArrayOutputStream extends OutputStream {

    /**
     * The buffer where data is stored.
     */
    protected byte buf[];
    /**
     * The number of valid bytes in the buffer.
     */
    protected int count;
...
}


public class ReadableBAOS extends ByteArrayOutputStream{
    public byte readByte(int index) {
        if (count<index) {
            throw new IndexOutOfBoundsException();
        }
        return buf[index];
    }
}
公共类ByteArrayOutputStream扩展了OutputStream{
/**
*存储数据的缓冲区。
*/
受保护字节buf[];
/**
*缓冲区中的有效字节数。
*/
保护整数计数;
...
}
公共类ReadableBAOS扩展ByteArrayOutputStream{
公共字节读取字节(整数索引){

if(count
ArrayList
听起来不是一个好主意。如果您需要动态大小的缓冲区,请查看我的评论,使用ByteArrayOutputStream,扩展它,并使用files buf和count,以创建一些快速读取方法。它有一个优点,即它具有动态大小;
ByteBuffer
不是
字节[]的包装类
尽管您可以用它包装一个
字节[]
。如果您使用
allocateDirect
您将获得本机内存,而不是
字节[]
public class ByteArrayOutputStream extends OutputStream {

    /**
     * The buffer where data is stored.
     */
    protected byte buf[];
    /**
     * The number of valid bytes in the buffer.
     */
    protected int count;
...
}


public class ReadableBAOS extends ByteArrayOutputStream{
    public byte readByte(int index) {
        if (count<index) {
            throw new IndexOutOfBoundsException();
        }
        return buf[index];
    }
}