2013-03-26 4 views
1

я пытаюсь создать связанный список ведьму содержит байтовые массивы:байт [] связанный список в Java

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(); 
} 

проблема является в commant q.add (BUF) ;. Буфер загружен с правильными байтами, но список загружает нули. Любая помощь? :)

+0

Вы уверены, что его нет просто все, кроме первого байта, который является нулями. –

+0

Избегайте изобретать колесо. http://trove4j.sourceforge.net/javadocs/gnu/trove/list/array/TByteArrayList.html –

ответ

0

Каждый член вашей очереди - это тот же байт [] arrray.

Когда вы вызываете q.add(buf), вы добавляете ссылку buf в очередь - это не копия массива. Поскольку ссылка никогда не изменяется, ваша очередь заполняется несколькими копиями ссылки buf, все указывающие на тот же массив.

Возможно, что конец вашего файла содержит буфер, заполненный байтами '\ 0'.

Попробуйте переместить это в вашем цикле:

byte buf[] = new byte[1024]; 
0

Вы используете один и тот же экземпляр массива для каждой записи в LinkedList. Это означает, что каждый вызов MyFile.read (buf) изменит содержимое всех ваших записей LinkedList. Вы должны создать новый байт [] для каждой записи, которую вы собираетесь добавить в связанный список.

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 байта ... что вы хотите сделать в этом случае?

(Кроме того, зачем ищет, или даже с помощью RandomAccessFile? Если вы хотите прочитать первую 90k в 1К куски, вы можете сделать это последовательно, с не ищет вообще.)

Смежные вопросы