使用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);
工程,非常感謝。我從來不是新來的,這是英國皇家空軍執行工作的方式謝謝;)我會在7分鐘內接受你的回答(計算器限制)。 – user3530525 2014-11-06 22:07:57
感謝您的額外信息:) – user3530525 2014-11-06 22:24:10
@ user3530525沒問題:) – icza 2014-11-06 22:24:28