这是我的功能:
// 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
和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();
为什么它没有给出相同的价值?我们猜测每个值(名字,姓氏等)有多长?
答案 0 :(得分:1)
正如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);
}
如果您生成的文件与上面完全相同,那么您可以阅读进度。
答案 1 :(得分:0)
如果这是学校/大学考试,请记住,他们故意知道荒谬,会让你感到困惑。
考虑您发布的代码中的评论:
从指定的RandomAccessFile
中读取记录
我敢打赌,你所定义的二进制文件的数据存储在这样的记录中:
我还打赌假设数据写得正确 - 完全按照上面的顺序和长度。如果不是,例如有一个字符串而不是整数,或者第一个名称更大,它可能会导致错误或误解数据 - 这就是为什么你的代码片段给出不同的结果。
这是你正在阅读的binary file,如果你想阅读它,你必须现在它的确切格式。否则就像破译外星人的信件一样。
至于RandomAccessFile.readFullyMethod:
从当前文件指针开始,将此文件中的b.length个字节读入字节数组。此方法从文件重复读取,直到读取所请求的字节数。此方法阻塞,直到读取请求的字节数,检测到流的末尾或抛出异常。