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
之间是否有真正的性能变化,肯定ByteBuffer或ByteArrayOutputStream。就你的情况来说似乎没问题。检查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(countArrayList
听起来不是一个好主意。如果您需要动态大小的缓冲区,请查看我的评论,使用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];
}
}