我有一个非常小的线程应用程序,它在数组中收集小块数据(因为它是声音数据,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个元素的数组。
我不禁想到我错过了一些非常简单的事情。任何人都可以阐明为什么这不起作用? (或者,如果有一些根本上更好的方法来做我想做的事情?)
答案 0 :(得分:4)
Arrays.asList()
不会执行从byte
到Byte
的转换,它会返回包含1个元素的列表;你传递的byte[]
。
如果您的目标是为每个字节添加Byte
个对象,则必须在循环中自行完成。请注意,这将比传递byte[]
使用更多的内存。
另请注意,即使输入流剩余的数据足够多,也不会觉得每次都会读取data.length
个字节(缓冲区大小,结果等等),因此您可以运行如果你读取的字节少于你要求的字节数,那么在缓冲区末尾传递一堆0
个字节的风险。
答案 1 :(得分:1)
byte []数据应为Byte []。你必须使用object,而不是原始的。
答案 2 :(得分:0)
我不禁想到我错过了一些非常简单的事情。任何人都可以阐明为什么这不起作用? (或者,如果有一些根本上更好的方法来做我想做的事情?)
与ArrayList<Byte>
数组相比,在byte[]
中存储字节数据会产生大量内存开销。如果您正在处理大量数据,则可能还需要使用byte[]
数组进行存储。看一下ByteArrayOutputStream
的源代码 - 我不知道是否会按原样为你工作,但你可能能够创建一个类似于管理扩展字节数组的类。