1

我正在尝试创建一个包含字节数组的链表:

static Queue<byte[]> q = new LinkedList<byte[]>();
static byte buf[] = new byte[1024];

static void queueInit() throws IOException{
    ByteArrayInputStream bis= new ByteArrayInputStream(buf);
    DataInputStream ois= new DataInputStream(bis);

    RandomAccessFile MyFile = new RandomAccessFile ("keys", "rw");
    for(int r=0;r<90;r++){
        MyFile.seek(r*1024);
        MyFile.read(buf);
        q.add(buf);
    }
    MyFile.close();
}

问题出在命令 q.add(buf);。缓冲区加载了正确的字节,但列表加载了零。有什么帮助吗?:)

4

3 回答 3

1

不,您LinkedList只会对同一个数组有几个引用。您只需要创建一个字节数组,然后一次又一次地从文件中读取数据。

目前尚不清楚为什么您将声明buf为静态变量,但您需要为列表中的每个元素创建一个数组:

for (int r=0;r<90;r++) {
    byte[] buf = new byte[1024];
    MyFile.seek(r * 1024);
    MyFile.read(buf);
    q.add(buf);
}

另请注意,您忽略了 的返回值read(),该值指示已读取的字节数。您可能没有完全读取 1024 字节......在这种情况下您想做什么?

(另外,为什么还要寻找,或者确实使用 a RandomAccessFile?如果你想读取 1K 块中的前 90K,你可以按顺序进行,根本不需要寻找。)

于 2013-03-26T21:07:15.400 回答
0

队列中的每个成员都是相同的 byte[] 数组。

当您调用 时q.add(buf),您正在添加对buf队列的引用——而不是数组的副本。由于引用永远不会改变,因此您的队列中充满了引用的多个副本buf,所有副本都指向同一个数组。

文件末尾可能包含一个充满 '\0' 字节的缓冲区。

尝试将其移动到您的循环中:

byte buf[] = new byte[1024];
于 2013-03-26T21:06:34.860 回答
0

您为 LinkedList 中的每个条目使用相同的数组实例。这意味着每次调用 MyFile.read(buf) 都会更改所有 LinkedList 条目的内容。您应该为要添加到链表的每个条目创建一个新的 byte[]。

于 2013-03-26T21:07:01.680 回答