2014-11-06 25 views
3

我有一個文件,並且該文件的前4個字節是魔術,例如LOL。 我將如何獲得這些數據?如何從知道偏移量和長度的文件中獲取特定字節?

我想象它會像:

byte[] magic = new byte[4]; 
RandomAccessFile raf = new RandomAccessFile(file, "rw"); 
raf.read(magic, 0, magic.length); 
System.out.println(new String(magic)); 

輸出:

LOL

可悲的是,這是不是爲我工作。我找不到獲取特定值的方法。

有沒有人看到任何方式來解決這個問題?

回答

5

使用RandomAccessFile.seek()定位到要讀取和RandomAccessFile.readFully()才能閱讀完整byte陣列。

byte[] magic = new byte[4]; 
RandomAccessFile raf = new RandomAccessFile(file, "rw"); 
raf.seek(0L); 
raf.readFully(magic); 
System.out.println(new String(magic)); 

您的代碼的問題是,當您以讀寫模式創建文件時,很可能文件指針指向文件的末尾。使用seek()方法進行定位。

而且可以使用RandomAccessFile.read(byte[] b, int off, int len)方法太多,但偏移量和長度對應於所述偏移陣列在哪裏開始存儲所讀取的字節,長度指定多少字節從文件中讀取。但數據仍將從文件的當前位置讀取,而不是從off位置讀取。

所以一旦你叫seek(0L);,這種讀取方式也適用:

raf.read(magic, 0, magic.length); 

還要注意的是,讀取和寫入方法將自動移動的當前位置,因此,例如尋求0L,然後讀4個字節(你的魔術字)將導致當前指針被移動到4L。這意味着您可以隨後調用讀取方法,而無需在每次讀取之前進行查找,並且它們將讀取文件的連續部分逐漸增加的位置,它們將不會從相同的位置讀取。

末注:

當從byte陣列創建String,從String(byte[] bytes) javadoc中引述:

構建通過使用指定的字節數組解碼一個新的String的平臺的默認字符集

因此,將使用平臺的默認字符集,這可能會在不同平臺上有所不同。總是指定一個像這樣的正確編碼:

new String(magic, StandardCharsets.UTF_8); 
+0

工程,非常感謝。我從來不是新來的,這是英國皇家空軍執行工作的方式謝謝;)我會在7分鐘內接受你的回答(計算器限制)。 – user3530525 2014-11-06 22:07:57

+0

感謝您的額外信息:) – user3530525 2014-11-06 22:24:10

+0

@ user3530525沒問題:) – icza 2014-11-06 22:24:28

相關問題