使用超类和扩展类方法写入随机访问文件

Posted

技术标签:

【中文标题】使用超类和扩展类方法写入随机访问文件【英文标题】:Write to random access file using superclass and extended class methods 【发布时间】:2011-11-24 01:16:27 【问题描述】:

我有一个 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 保存到文件中?

【问题讨论】:

请您将您的代码示例缩短到所需的最低限度...(请参阅sscce.org) 【参考方案1】:

您所做的实际上是将记录存储到文件中;已经有许多机制可用于将结构化数据存储到文件中。如果您有兴趣这样做是为了学习,那么一定要继续 - 但如果您只是想解决这个问题,请考虑使用 SQLite3 之类的东西来为您提供存储空间。

如果您想继续使用这种方法,您需要确定每个方法将使用多少大小,将文件的一部分分配给每个要更新的方法,并确保每个方法都知道确切的位置该文件是它的位置。

如果这只是一个 C 程序,我建议计算每个方法负责的字段,#define 这些大小和#define 每个要添加到 location 的偏移量。

但这感觉不是很“Java”——你应该能够完全修改父类、子类或添加新类,而无需了解其他类的详细信息。

因此,您可能希望让一个类负责将结构化数据写入文件并查询所涉及的每个类以获取其数据。让每个班级返回他们想要写入的 bytes 数组 - 并让一个大师班执行所有写作。

通过将所有文件 IO 整合到一个类中,您可以在以后更轻松地更改为另一种存储格式,或者保持与您的程序的两个或三个先前版本的兼容性,或者提供多个数据库后端以满足部署时的不同需求。

【讨论】:

【参考方案2】:

使您的 writeToFile() 方法最终化。

然后添加一个受保护的writeExtraData() 方法,该方法在书籍的情况下什么都不做,但会被覆盖以在LibraryBook 类中写入额外的字段。从Book 中的writeToFile() 方法的中间调用它。您显然需要实现一组对称的读取方法。

更好的是,停止重新发明***和编写讨厌的样板代码,只需使用该语言提供的内置 @987654321@@987654322@ 类来执行此类操作。然后你可以去readObject()

【讨论】:

以上是关于使用超类和扩展类方法写入随机访问文件的主要内容,如果未能解决你的问题,请参考以下文章

----特质

当子类使用Object变量实例化时,无法从超类访问方法

Java超类对象引用访问子类对象

Java语言中,下面关于类的描述正确的是()。(选择一项) 解释一下超类和子类。

Java核心技术-继承

爪哇 |父类和子类中的静态变量|从父类访问子 var 值