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

     2023-03-06     141

关键词:

【中文标题】使用超类和扩展类方法写入随机访问文件【英文标题】: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()

【讨论】:

使用返回超类对象的超类方法-java

我正在使用jar文件中的SimpleMatrix类(如果您碰巧知道它,则使用EJML)。我想实现一个与该类一起使用的新方法,因此决定通过创建MyMatrix类来扩展SimpleMatrix。但是,当我使用静态超类方法时,我遇到了问题。例如,如果我尝试:... 查看详情

java中基类和超类的区别

java中基类和超类是相同的么,如果不是,那他们有什么区别?本章介绍Java的实用工具类库java.util包。在这个包中,Java提供了一些实用的方法和数据结构。例如,Java提供日期(Data)类、日历(Calendar)类来产生和获取日期及时间,提供随... 查看详情

PHP trait:是不是有适当的方法来确保使用 trait 的类扩展包含特定方法的超类?

】PHPtrait:是不是有适当的方法来确保使用trait的类扩展包含特定方法的超类?【英文标题】:PHPtrait:isthereaproperwaytoensurethatclassusingatraitextendsasuperclasswhichcontainscertainmethod?PHPtrait:是否有适当的方法来确保使用trait的类扩展包含特... 查看详情

在读取/写入文件到内部/外部存储android时使用啥类和方法?

】在读取/写入文件到内部/外部存储android时使用啥类和方法?【英文标题】:Whatclassandmethodtousewhilereading/writingafiletointernal/externalstorageandroid?在读取/写入文件到内部/外部存储android时使用什么类和方法?【发布时间】:2013-09-0122:5... 查看详情

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

...可以有多个超类 B)一个超类可以有多个子类C)子类可以使用超类的所有方法 D)子类一定比超类有更多的成员方法超类故基类,父类。java语言中只能单一的继承,所以排除A,子类可以使用超类的方法要看超类的方法修饰符(publi... 查看详情

如何在两个文件中有一个类和超类(Typescript)

】如何在两个文件中有一个类和超类(Typescript)【英文标题】:howtohaveaclassandsuperclassintwofiles(Typescript)【发布时间】:2016-06-1423:59:00【问题描述】:如何在TypeScript中将一个类+子类拆分为两个文件?//MongoModel.jsclassMongoModel...export=... 查看详情

使用java反射将派生对象传递给想要超类的方法?

】使用java反射将派生对象传递给想要超类的方法?【英文标题】:Passderivedobjectintomethodwantingsuperclassusingjavareflection?【发布时间】:2011-12-0306:03:46【问题描述】:编辑:我不清楚。我必须使用反射,因为我是从命令行解释的。我... 查看详情

使用 Share 扩展共享类和数据库

】使用Share扩展共享类和数据库【英文标题】:SharingclassanddatabasewithShareextension【发布时间】:2016-04-2207:45:43【问题描述】:我正在尝试将类和数据库从我的应用程序共享到应用程序扩展。我试图从TARGETMembership中添加类,但在添... 查看详情

java多态父类和子类方法的访问控制权限

Java多态父类和子类方法的访问控制权限@authorixenos  父类和子类方法的访问控制权限 继承是为了扩展类的功能,而这种扩展显然就是对一个原始类的扩展,目的还是向上转型来调用,所以这就是一个对象多态的问题。&... 查看详情

oo面向对象———扩展类与被扩展类

扩展类与被扩展类超类:被扩展类、基类、父类。被final修饰的类不可以做超类。子类:扩展类、子类。为了描述自己的独特性为,要重写超类的方法。如果不重写就默认继承了父类的方法。方法重载:同一个类中有多个名称相... 查看详情

使用“this”调用超类方法的子类

】使用“this”调用超类方法的子类【英文标题】:Subclasscallingasuperclassmethodusing"this"【发布时间】:2020-03-0213:07:42【问题描述】:如果超类有一个使用关键字“this”的方法,子类调用这个方法,那么使用“this”的超类方... 查看详情

当子类使用object变量实例化时,无法从超类访问方法(代码片段)

...thod3()System.out.println("Bite3");我试图通过创建Bite类的对象(使用三种不同类型的引用:Object,Bite和Gulp)来调用方法method2(),如下所示:publicclassMainpublicstaticvoidmain(String[]args)ObjectvarObj=newBite();BitevarBite=newBite();GulpvarGulp=newBite();if(varBi... 查看详情

javaooc7

...{}这种形式来继承已有类的属性和行为,称为继承。2java使用的是单继承(清晰)。3方法重写:①派生类访问修饰符不能比超类小②数据类型一致③方法名一致④参数列表一致⑤派生类异常不能比超类多4this();调用本类其他构造... 查看详情

十密封类和密封方法

...不能继承的类,因此sealed关键字和abstract关键字不能同时使用。密封类除了不能被继承外,其他与非密封类一样。C#中声明密封类时需要使用sealed关键字。访问修饰符sealedclass类名:基类或接口{//类成员}publicsealedclas 查看详情

随机访问

...进行随机文件I/O(在字节层次上)的类。这个类提供一个seek方法,和C/C++中的相似,移动文件指针到任意的位置,然后从那个位置字节可以被读取或写入。seek方法访问底层的运行时系统因此往往是消耗巨大的。一个更好的代替是在Ra... 查看详情

输入输出下

...OutputStream都是抽象类不能实例化,因此在实际的应用中都使用的是它们的子类,这些子类在实现其超类方法的同时又定义了特有的功能,用于不同的场合。FileInputStream用于顺序访问本地文件,从超类继承read、close方法,对文件进... 查看详情

访问子类中的超类变量/方法

】访问子类中的超类变量/方法【英文标题】:Accessingsuperclassvariables/methodsinsubclass【发布时间】:2017-08-2218:09:16【问题描述】:既然子类可以访问父类定义为受保护的变量和方法,为什么下面的代码会出现编译错误?publicclassAnima... 查看详情

李瑞红201771010111(代码片段)

实验六继承定义与使用实验时间2018-9-2第一部分:理论知识第五章1.类、超类和子类5.2Object:所有类的超类5.3泛型数组列表5.4对象包装器和自动打包5.5参数数量可变的方法5.6枚举类5.7继承设计的技巧5.1类、超类和子类5.2Object:所... 查看详情