如何在Java中声明无限大小/动态的字节数组?

New*_*der 11 java bytearray

我正在声明一个字节数组,由于它不断更新,我的大小未知,所以如何声明无限大小/可变大小的字节数组?

Ste*_*ker 11

你不能声明一个无限大小的数组,因为这需要无限的内存.此外,所有分配调用都处理数字,而不是无限数量.

您可以分配一个按需调整大小的字节缓冲区.我相信最简单的选择是ByteArrayOutputStream.

ByteBuffer有一个API,可以更容易地操作缓冲区,但你必须自己构建调整大小功能.最简单的方法是分配一个新的,更大的数组,复制旧内容,并交换旧缓冲区.

其他答案提到List<Byte>了某种使用.值得注意的是,如果创建一堆new Byte()对象,则可以大大增加内存消耗. Byte.valueOf回避这个问题,但你必须确保在整个代码中始终如一地使用它.如果你打算在很多地方使用这个列表,我可能会考虑编写一个简单的List装饰器来实现所有元素.例如:

public class InterningList extends AbstractList<Byte>
{
    ...
    @Override
    public boolean add(Byte b) {
        return super.add(Byte.valueOf(b));
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

这不是一个完整的(甚至是经过测试的)示例,只是一些开始......


Juv*_*nis 8

Java中的数组不是动态的.您可以改用列表.

List<Byte> list = new ArrayList<Byte>();
Run Code Online (Sandbox Code Playgroud)

由于自动装箱功能,您可以自由地将字节对象或原始字节添加到此列表中.

  • 请注意,虽然内存使用仍然不会与`byte []`竞争.使用装箱时,您仍然需要每个元素的完整引用(字大小:大多数体系结构为32位或64位),而不是每个元素8位.你需要4倍到8倍的空间.对于某些应用程序可以忽略,但对于其他应用程序,它会受到很大伤害. (5认同)
  • @StevenSchlansker字节范围内的整数= -128..127.所有256个Byte值和相应的Integer值都需要由JLS缓存 (3认同)
  • 对此解决方案要非常小心.我可能会确保对阵列的所有写入都转到Interner - http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Interners.html - 如果您创建每个元素一个新的字节,你的内存使用量将是天文数字. (2认同)

小智 5

要定义可变长度的字节数组,只需使用 apachecommons.io.IOUtils库,而不是像这样分配手动长度

byte[] b=new byte[50];
Run Code Online (Sandbox Code Playgroud)

您可以将输入流传递给IOUtils函数,该函数将对此输入流执行读取功能,因此字节数组将具有所需的确切字节长度。前任。

byte[] b = IOUtils.toByteArray(inpustream);
Run Code Online (Sandbox Code Playgroud)

混乱..