2013-06-11 42 views
1

我是一個真正的頭髮拉拉的java新手。希望有人能幫忙。從jar或目錄加載時文件的行爲不同

我有一個二進制文件,從applet的目錄 加載好,但只從applet的jar文件部分加載。

下面的代碼以兩種方式加載文件並比較它們。它們 應該是相同的,但輸出是「字節8181處的分歧」。

int spx_data_length = 158994; 
byte[] spx_buf = new byte[spx_data_length]; 
byte[] spx_buf2 = new byte[spx_data_length]; 

// binary file in jar 
InputStream is = Vocals.class.getResourceAsStream("0.raw"); 
is.read(spx_buf, 0, spx_data_length); 
is.close(); 

// same binary file in applet directory 
URL srcURL=new URL(getCodeBase(),"0.raw"); 
URLDataSource u_dat = new URLDataSource(srcURL); 
is=u_dat.getInputStream(); 
is.read(spx_buf2, 0, spx_data_length); 
is.close(); 

// compare them 
for(int i=0;ispx_data_length;i++){ 
    if(spx_buf[i] != spx_buf2[i]){ 
    Obj[0]="divergence at byte "+i; win.call("show_string", Obj); 
    i=spx_data_length; 
    } 
} 
+0

首先,從jar中解壓縮並與原始文件進行比較。 –

+0

你是怎麼得到'spx_data_length'的?沒有硬編碼? –

+0

從jar中提取的文件與源文件相同,文件長度是硬編碼的,大約300k。 – Brad

回答

0

InputStream.read(byte[], int, int)將讀取高達spx_data_length字節,但很可能會低一些。特別是在壓縮數據(即從JAR讀取)的情況下,它可能一次返回一個解壓縮緩衝區值的數據。您應該循環,直到讀取返回-1,或使用類似DataInputStream.readFully(byte[], int, int)的東西。你應該比較讀取的字節數:如果不同,比較這些計數中較小的字節幾乎沒有意義。

+0

這就是訣竅。謝謝。我不應該認爲這兩個閱讀功能表現相同。 – Brad

相關問題