![](/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.