我有一个Book类和一个扩展Book的Library Book类。我将信息存储在随机访问文件中。我有一个writeToFile方法,它将Book对象写入随机访问文件。我的LibraryBook类的方法writeToFile调用super.writeToFile然后我希望它将特定于LibraryBook的字段写入文件。这样做的正确方法是什么?见代码:
书中的方法:
public void writeToFile(String fileName, long location) throws Exception {
try {
RandomAccessFile invFile = new RandomAccessFile(fileName, "rw");
// seek to correct record in file
invFile.seek(location);
// now write out the record
// write out the data in fixed length fields
// String fields must be truncated if too large
// or padded with blanks if too small
//write out all Book variable to file
invFile.writeLong(ISBN);
//etc.....
} catch (FileNotFoundException notFound) {
throw new FileNotFoundException();
} catch (IOException io) {
throw io;
}
}
来自LibraryBook类的方法扩展了Book:
public void writeToFile(String fileName, long location) throws Exception {
try {
super.writeToFile(fileName, location);
RandomAccessFile invFile = new RandomAccessFile(fileName, "rw");
// seek to correct record in file
invFile.seek(location);
// now write out the record
// write out the data in fixed length fields
// String fields must be truncated if too large
// or padded with blanks if too small
//write library book variables to file
invFile.writeLong(branchID);
//etc....
invFile.close();
} catch (FileNotFoundException notFound) {
throw new FileNotFoundException();
} catch (IOException io) {
throw io;
}
}
如何对其进行编码,以便LibraryBook writeToFile方法可以调用超类方法并将LibraryBook保存到文件中?
答案 0 :(得分:0)
您所做的主要是将记录存储到文件中;有许多机制可用于将结构化数据存储到文件中。如果你有兴趣为学习做这件事,那么一定要继续 - 但如果你只是想解决这个问题,可以考虑使用像SQLite3这样的东西来为你提供存储空间。
如果您想继续这种方法,您需要确定每个方法将使用多少大小,将文件的一部分分配给每个要更新的方法,并确保每个方法确切地知道该文件是它的位置。
如果这只是一个C程序,我建议计算每个方法负责的字段,#define
这些大小和#define
每个方法添加到location
的偏移量
但这并不觉得非常“Java” - 你应该能够修改父母,孩子或者完全添加新课程,而不知道其他课程的细节。
因此,您可能希望让一个类负责将结构化数据写入文件并查询涉及其数据的每个类。让每个类返回一个他们想要编写的byte
数组 - 并让一个主类执行 all 写作。
通过将所有文件IO合并到一个类中,您可以在以后更轻松地更改为其他存储格式,或者保持程序的两个或三个以前版本的兼容性,或者提供多个数据库后端以满足部署时的不同需求。
答案 1 :(得分:0)
将writeToFile()
方法设为最终版。
然后添加一个受保护的writeExtraData()
方法,该方法在书籍的情况下不执行任何操作,但会被覆盖以在LibraryBook
类中编写额外字段。从writeToFile()
中Book
方法的中间调用此方法。显然,您需要实现一组对称的读取方法。
更好的是,停止重新发明轮子并编写令人讨厌的样板代码,并使用语言提供的内置ObjectOutputStream
和ObjectInputStream
类来完成此类操作。然后你可以去readObject()
。