![](/img/trans.png)
[英]Reading data from RandomAccessFile producing incorrect results - Java
[英]reading data from a randomaccessfile
這是我的功能:
// Read a record from the specified RandomAccessFile
public void read( RandomAccessFile file ) throws IOException {
account = file.readInt();
byte b1[] = new byte[ 15 ];
file.readFully( b1 );
firstName = new String( b1, 0 );
firstName = firstName.trim();
byte b2[] = new byte[ 15 ];
file.readFully( b2 );
lastName = new String( b2, 0 );
lastName = lastName.trim();
balance = file.readDouble();
}
我必須能夠從randomaccessfile中讀取一份我的考試,並且上面的代碼有些令人困惑。
這是我正在猜測的事情,如果我錯了,您可以糾正我,將不勝感激。
我們接收file
,並從file
中readInt
並將其分配給account
。 接下來,我想我們創建一個大小為15的新字節,並將文件中的名字讀入該字節,然后分配給firstname
。 現在這是我不了解的內容, readFully
做什么? 以及上面的代碼如何知道要移至lastName
的下一個值。 簡而言之,
byte b1[] = new byte[ 15 ];
file.readFully( b1 );
firstName = new String( b1, 0 );
firstName = firstName.trim();
VS
byte b2[] = new byte[ 15 ];
file.readFully( b2 );
lastName = new String( b2, 0 );
lastName = lastName.trim();
balance = file.readDouble();
為什么它沒有給出相同的值? 我們是否在猜測每個值(名字,姓氏等)多長時間?
正如api所說:
從當前文件指針開始,將b.length
個字節從此文件讀取到字節數組中。 此方法從文件重復讀取,直到讀取了請求的字節數。
public void write(RandomAccessFile file) throws IOException {
file.writeInt(account);
byte b1[] = new byte[15];
// set firstname to b1
file.write(b1);
byte b2[] = new byte[15];
// set lastname to b2
file.write(b2);
double balance =123.1;
file.writeDouble(balance);
}
如果您生成的文件與上面的文件完全一樣,則可以閱讀進度。
如果這是學校/大學考試,請記住,他們知道故意有荒唐之舉,以使您感到困惑。
考慮您發布的代碼中的注釋:
從指定的RandomAccessFile讀取記錄
我敢打賭,它定義為您正在讀取的二進制文件具有存儲在這樣的記錄中的數據:
我還打賭,應該假定數據已正確寫入-完全按照上述順序和長度表示。 如果不是這樣,例如,有一個字符串而不是整數,或者名字較大,則可能會導致錯誤或數據解釋錯誤-這就是您的代碼片段給出不同結果的原因。
無論如何,這是一個二進制文件 ,如果要讀取它,則現在必須准確編寫該文件的格式。 否則,就像解密外星人的信件一樣。
至於RandomAccessFile.readFullyMethod :
從當前文件指針開始,將b.length個字節從此文件讀取到字節數組中。 此方法從文件重復讀取 , 直到 讀取 了請求的字節數為止 。 該方法將阻塞,直到 讀取請求的字節數,檢測到流的末尾或引發異常 為止 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.