将Array的元素添加到ArrayList

时间:2012-03-17 21:51:00

标签: java arrays arraylist

我有一个非常小的线程应用程序,它在数组中收集小块数据(因为它是声音数据,Java希望它是一个数组)并试图将它放入ArrayList进行存储。所有这些实际上都是生产者/消费者模式的前半部分。

问题:它似乎不起作用。

在制作人端,我有这段代码:

  public synchronized void run() {
// do a whole bunch of audio set-up

try {
  // more audio stuff

  while (true) {
    if (producing) {
      byte[] data = new byte[line.getBufferSize() ];
      numBytesRead = line.read(data, 0, data.length);
      System.out.println("Producer:  Size of dat[] is " + data.length);

      // Save this chunk of data.
      buffer.addData(data);
    }

除了音频和簿记之外,这似乎很简单 在缓冲类中,我有:

public class Buffer {
  ArrayList list ;
  public void addData(byte[] data) {
    list.addAll(Arrays.asList(data));
  }

这似乎也很简单。 这是问题:如果我的数组长度(比方说)1024,并且元素都在那里(我已经验证了它们),我希望每次添加数据时ArrayList的大小都会增加1024。它没有。它增长了1,好像我正在制作ArrayLists的ArrayList或Arrays的ArrayList,而不是我想要的元素的Arraylist。

我怀疑我在翻转方面也会遇到这个问题,我可能会有一个数万字节的ArrayList,并希望检索前1024个元素的数组。

我不禁想到我错过了一些非常简单的事情。任何人都可以阐明为什么这不起作用? (或者,如果有一些根本上更好的方法来做我想做的事情?)

3 个答案:

答案 0 :(得分:4)

Arrays.asList()不会执行从byteByte的转换,它会返回包含1个元素的列表;你传递的byte[]

如果您的目标是为每个字节添加Byte个对象,则必须在循环中自行完成。请注意,这将比传递byte[]使用更多的内存。

另请注意,即使输入流剩余的数据足够多,也不会觉得每次都会读取data.length个字节(缓冲区大小,结果等等),因此您可以运行如果你读取的字节少于你要求的字节数,那么在缓冲区末尾传递一堆0个字节的风险。

答案 1 :(得分:1)

byte []数据应为Byte []。你必须使用object,而不是原始的。

答案 2 :(得分:0)

  

我不禁想到我错过了一些非常简单的事情。任何人都可以阐明为什么这不起作用? (或者,如果有一些根本上更好的方法来做我想做的事情?)

ArrayList<Byte>数组相比,在byte[]中存储字节数据会产生大量内存开销。如果您正在处理大量数据,则可能还需要使用byte[]数组进行存储。看一下ByteArrayOutputStream的源代码 - 我不知道是否会按原样为你工作,但你可能能够创建一个类似于管理扩展字节数组的类。