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への参照がいくつかあるだけです。バイト配列を 1 つだけ作成し、ファイルから何度もデータを読み込みます。

静的変数として宣言した理由はまったく明らかではありませんが、リスト内の各要素に対して新しい配列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 バイトを完全に読み取っていない可能性があります...その場合はどうしますか?

(また、わざわざシークしたり、実際に を使用したりする必要があるのはなぜ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 に答える