此代码返回EOFException,有关添加内容或如何处理问题的任何建议?
public AbstractBlock readBlock(int blockNum, AbstractDBFile f)
throws IOException {
DBFile dbf = (DBFile) f;
byte[] data2 = new byte[4096];
RandomAccessFile file = new RandomAccessFile(dbf.fileName, "r");
file.seek(4096+blockNum*4096);
Block b = new Block();
for (int i = 0; i < 4096; i++){
data2[i] = file.readByte();
}
file.close();
b.setData(data2);
return b;
}
答案 0 :(得分:1)
您可以尝试这样做:
public AbstractBlock readBlock(int blockNum, AbstractDBFile f)
throws IOException {
DBFile dbf = (DBFile) f;
byte[] data2 = new byte[4096];
RandomAccessFile file = new RandomAccessFile(dbf.fileName, "r");
file.seek(4096+blockNum*4096);
Block b = new Block();
for (int i = 0; i < 4096; i++){
try{
data2[i] = file.readByte();
}catch(EOFException ex){
System.out.println("End of file reached!");
//break the loop
break;
}
}
file.close();
b.setData(data2);
return b;
}
答案 1 :(得分:0)
函数readByte
可以抛出IOException
和EOFException
例外
public final byte readByte()抛出IOException
抛出:
EOFException - 如果此文件已到达结尾。
IOException - 如果发生I / O错误。
所以如果在分配到 data2 [i] 变量
之前你真的读过一些东西,你必须把它放在试试集团中。答案 2 :(得分:0)
说blockNum==1
...这是否意味着您应该阅读文件中的第一个块?如果是这样,您希望将0
传递给file.seek()
,但实际上您传递的是4096 + 4096 * 1 = 8192.这意味着对于给定的blockNum,您实际上是读过第二个街区。
如果是这样,那么对于n块文件,如果您将n
或n-1
传递给此函数,则会收到EOFException。
如果第一个块编号为0而不是1,那么您只关闭了一个块,但基本问题仍然是相同的。
答案 3 :(得分:0)
如果你的意思是“当我抓住它时我该怎么办?”,你应该停止阅读和休息。如果你的意思是'为什么我得到它?',你的块编号应该从零开始,假设你对块的数量是正确的。