2013-03-26 61 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

你確定它不是隻是第一個字節是零而已。 – 2013-03-26 21:05:55

+0

避免重新發明車輪。 http://trove4j.sourceforge.net/javadocs/gnu/trove/list/array/TByteArrayList.html – 2013-03-26 21:07:42

回答

0

您的隊列的每個成員是相同的byte [] 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在1K塊,你可以做到這一點順序,不求所有。)