戈 俊 金定勇
基于模拟Properties持久属性集早操统计系统的设计与实现*
戈 俊1金定勇2
(1.南京林业大学体育部,江苏 南京 210037,2.南京莱斯信息技术股份有限公司,江苏 南京 210014)
依据Properties将流对象与集合相关联,通过集合键值对特点的键唯一、值覆盖的思想创建属性集配置文件。借鉴配置文件设计理念,围绕当下普通高校早锻炼出勤记录不实、查询繁琐、存储不便的实际问题展开思考,以期通过Java语言程序设计,借助于Eclipse集成开发环境,利用较为简单的手段模拟设计早操数据统计系统,规避数据库操作的复杂性,解决内存占用,操作繁琐等问题,方便体育学科成绩的评定、查询和持久化存储。
Properties;持久属性集;早操锻炼
Properties 是一个和IO流相结合的属性集合对象,Properties可以保存在流中或者从流中加载,属性列表中每一个键及其对应的值都是一个字符串[1]。Properties对象更多运用于软件开发中配置文件的设置,由于配置文件中的参数都是通过字符串键值对的形式进行体现,所以在保证键唯一的情况下,将其值进行修改覆盖原值,持久化存储以后,软件下一次启动时重新加载该配置文件,就能将参数进行可视化体现。市面上一些共享软件的使用次数限定,也可以通过Properties进行实现或者使用XML语言进行配置自定义文件描述并使其描述内容更丰富,更具体,同时可使用dom4j进行读取解析。Properties对象中提供了多种方法来将属性列表与输入输出流相结合,以便于完成配置文件的操作。本文结合Properties的特点,模拟制作MESS(MorningExerciseStatisticsSystem)早操数据统计系统。
Properties对象中提供了list方法来将属性列表输出到指定的输出流,此方法对调试很有用。在MESS早操数据统计系统设计方法中模拟了该list方法,我们也提供了一种将集合列表输出到指定流的方法:ergodicMapSets。该方法提供了两个参数,一个是本地存储的Map集合,在遍历集合时,可以将集合中的早操键值对数据信息全部通过流输出到指定盘符上,由于该功能是通过GUI图形化界面形式进行展现,最终会将数据通过对话框路径选择的形式存储到本地盘符的文件中,所以我们将流进行了内部封装,不对外暴露了。第二个参数是教师姓名,如果教师姓名参数传递的是具体值,那么就匹配具体教师的学生早操成绩,如果参数传递为null,那么就输出所有学生的早操个人信息和次数的键值对信息。
Properties对象中提供了load方法,从输入流中读取属性列表(键和元素对)。MESS模拟Properties设计时,也提供了从流中读取对象的方法:morningExerciseDataReadPersistedLocally。该方法读取本地持久化存储的文件,将Map集合对象读入内存中,参数传递的是本地被封装成File对象的文件。
Properties对象中提供了store方法,将此 Properties 表中的属性列表(键和元素对)写入输出流。MESS模拟Properties设计时,也提供了从内存中将存储了学生信息和早操次数的键值对信息的Map集合对象通过流写入本地硬盘中的方法:morningExerciseDataWritePersistedLocally。参数传递的是本地被封装成File对象的同一个文件,进行数据的覆盖。
Properties对象中提供了getProperty方法和setProperty方法,其功能是通过键在Properties集合中找对应的值,以及设置Properties集合中的键和值。以上的两种方法,在MESS模拟Properties设计时,将其合理的根据MESS功能特点,封装成了一个功能:morningExerciseStatistics。通过模拟读卡器在学生校园卡中读取的数据,分别拿到学生的学号、姓名、所属教师、项目、上课时间,并将其封装成学生对象,存储到TreeMap集合中。同时学生对象实现了Serializable接口以启用其序列化功能。以便于通过对象的持久化存储来反复获取数据, 即便是关闭计算机,内存清空也不怕数据丢失。
学生类的设计是方便创建学生对象用的。通过对学生不同的信息进行类描述和封装,通过指定的构造函数进行对象的初始化[2],以便于通过对象调用其方法,指挥对象做事情,充分的体现了Java的面向对象的特点。在本系统设计中将学生的(姓名,性别,学号,所在院系,体育课教师,体育课项目,体育课时间段)这些信息封装成对象,以便于存储到Map集合中,因为集合中只能存储对象。同时方便及时从Map集合中取出对象进行进一步操作,比如取出学生对象后,可以通过set和get方法进行学生对象成员字段的设置和获取,拿到每一个学生的信息。
设计学生类,封装字段(姓名,性别,学号,所在院系,体育课教师,体育课项目,体育课时间段),进行空参和带参的构造函数初始化,对每一个字段进行set和get方法的定义,最后对学生类,给出一个特有的字符串表现形式。学生类存入TreeMap集合中需要进行默认排序,应实现Comparable接口,并根据自身比较特点覆盖其compareTo方法。先根据学号进行排序,学号相同再根据姓名排序。学生类通过实现 java.io.Serializable 标记接口以启用其序列化功能,以便于通过ObjectInputStream和ObjectOutputStream进行对象的持久化存储和读写。
早操锻炼实现类的设计是将本设计步骤的每一个所需调用的方法进行了描述和封装,主要封装成了四个相对独立的方法,将多个方法进行封装,建立适合本系统设计的特有的方法,提高阅读性,方便自身内部调用,同时也体现Java的三大特征:封装、继承、多态。
3.2.1 早操统计数据持久化存储文件的描述
该文件在程序第一次运行时是不存在的,通过File对象将文件进行封装,判断文件是否存在,如果不存在通过File对象进行创建,保证文件一定存在,并且在文件存在时就通过ObjectOutputStream对象输出流,向其文件中写入一个新建的TreeMap对象,以此保证对象读取流在读取文件时,能够顺利读取Map集合对象。否则,当数据输入过程中意外到达文件或流的末尾时,抛出EOFException异常。
3.2.2 早操统计数据实时更新原理描述
通过模拟读卡器读取学生校园卡上的个人信息,创建每一个学生对象。通过ObjectInputStream读取的对象是用Object来接收的,所以要通过强制转换将其转成Map集合。通过Map集合,存储学生对象和早操锻炼次数,由于学生对象存在学号的顺序,以便于今后的查找,所以使用TreeMap集合。由于录入个人信息的人数不确定,所以使用循环进行反复读取,在进行GUI图形化界面设计时,将退出菜单作为结束录入的操作。学生对象作为键通过TreeMap集合的get方法,在集合中查找相对应的值,如果值存在,通过定义变量记录住学生出早操的次数再+1,再次存入Map集合,如果值不存在,那么直接将键和1存入Map集合,最终达到键唯一,值覆盖的效果。以此保证了早操出勤次数的累计。由于学号是唯一的,所以键都是唯一的。基本数据类型和基本数据类型对象包装类之间的运算通过其自动拆箱,自动装箱的特点实现。
3.2.3 早操统计数据增删改查功能描述
早操数据写入本地进行持久化存储的方法建立:通过ObjectOutputStream对象输出流,将内存中的Map集合对象写入本地,进行持久化存储,最后将所有通过Windows底层创建并启动的流资源关闭。通过多线程技术将数据读写功能、数据查询功能进行分别封装到单个线程中,保证在持续录入学生早操信息的同时,可以有单独的线程来支持数据的修改、查询及导出,通过遍历可以导出符合要求的学生信息和对应的早操次数,如匹配到对应教师的学生早操成绩。为了避免匹配数据时出现空指针异常的情况,通过equals比较时将字符串常量数据作为调用equals方法的引用。如果教师姓名参数传递的是具体值,那么就匹配具体教师的学生早操成绩,如果参数传递为null,那么就导出所有学生的早操个人信息和次数的键值对信息。在该方法中加入字符输出流就可以实现数据的导出。文件最终被存储在本地,即软件所在盘符,以便于查找,关闭资源。
图1 系统设计执行流程
系统加载MESS.class文件,将该程序所需执行的所有类文件加载进内存。主线程从测试类的主方法作为入口进入,创建MorningExerciseTest对象,并调用早操操作测试方法(morningExerciseOperationTest)。通过this引用调用持久化存储文件是否存在方法(fileIsExists),用早操测试类中封装的私有文件字段来接收。该方法中通过File对象封装持久化存储文件路径。创建一个TreeMap集合,由于集合中存储的都是对象,所以泛型定义为学生对象和基本数据类型对象包装类
通过this引用调用早操数据读取持久化存储方法(morningExerciseDataReadPersistedLocally)将返回的File对象作为参数进行传递,再通过全局变量字段map进行接收。该方法中通过建立对象读取流(ObjectInputStream)和参数传递中的File对象进行关联。将持久化存储在本地File中的数据通过读取对象方法(readObject)读取进内存。由于该方法读取对象返回的是Object类型,而我们在对象序列化中存储的是Map集合,所以需要进行强制类型转换,这也是ObjectInputStream反序列化的过程,释放资源关闭流对象。返回强转后的map集合对象。通过this引用调用早操统计方法(morningExerciseStatistics),将返回的map集合对象作为参数进行传递,再通过全局变量字段map进行接收。通过读卡器读取学生校园卡中的个人信息数据,将学生的信息如:姓名、性别、学号、所在院系、所属教师、课程项目、课程时间等,进行学生对象的封装。将每一个学生对象作为键,通过Map集合的get方法进行值的获取。由于Map集合中存储的只能是对象,所以通过基本数据类型对象包装类的Integer对象来接收get方法返回的值。通过定义变量count赋值为0,来记录住每一个学生刷卡的次数。判断如果返回的值不为空,那么说明该学生对象在Map集合中已经存在并有相对应值的体现,将值取出并赋值给变量count,由于基本数据类型和对象不能直接运算,所以JDK升级到1.5以后提供了更为便捷的对象和基本数据类型的隐式转换,自动拆箱和自动装箱机制,以此保证了该运算的执行。学生对象每一次刷卡,都将通过变量count自增一次来体现,如果该学生对象在Map集合中存在那么将对应值取出自增一次,再将该学生对象和自增后的值存入Map集合,由于TreeMap集合的底层数据结构是二叉树结构,所以在保证键唯一的时候调用的是学生对象实现的Comparable接口中的compareTo方法来比较两个学生对象是否相同。同时通过该方法还能实现TreeMap集合中元素的默认排序。又由于学生的学号是唯一的,所以在比较方法中主要条件就是学生的学号。所以在成绩导出的时候是按照学号的升序体现的 (见图2) 。如果学生对象在集合中不存在,那么直接将学生对象和count+1(即1)的值存入Map集合。通过此方法实现学生对象键相同,值覆盖的效果,达到准确的记录学生出操次数的目的。在学生每一次刷卡时,通过GUI图形化界面展示学生目前出操次数,并且在达到基本合格次数时,给出提示,使其心中有数。由于学生人数不确定,所以使用循环来完成刷卡和读卡的任务。结束循环以后,返回存储了新的学生信息的Map集合。
通过this引用调用本类的早操数据写入本地持久化的方法,同时将被封装的File对象和返回的存有更新过学生早操信息键值对的Map集合作为参数进行传递。封装对象输出流,使其与File对象封装的本地文件相关联。由于Map集合通过实现Serializable 接口以启用其序列化功能。通过对象输出流的写入对象方法(writeObject)将存储有学生早操信息的Map集合写入本地文件,进行持久化存储,方便再次读取调用,更新数据。 释放资源,关闭流对象。主线程通过匿名内部类形式创建一条新的线程,进行手动的学生数据的增删改查。以保证在不断录入学生信息的同时进行部分问题学生信息的增删改查。
通过this引用调用遍历集合中数据的方法,导出指定教师的学生早操信息。将存储学生早操信息的Map集合和指定教师姓名作为参数进行传递。如果没有指定教师姓名则导出所有学生早操数据信息。封装导出文件存储位置的File对象。通过字符流缓冲区包装字符输出流关联File对象,达到高效写出的目的。
通过循环反复读写,获取Map集合中的每一个键,即学生对象,通过字符串的equals方法匹配通过参数传递进来的教师姓名,将对应的学生对象键的字符串表现形式和值写入本地文件中,已达到持久化存储,随时查阅的效果。如果没有教师姓名的参数传递,那么将导出所有学生信息和对应早操次数的值(见图2)。
图2 未传递教师参数的所有早操数据导出结果
通过系统测试结果表明:早操数据统计系统的设计可以解决处理体育学科早操出勤记录不实,查询繁琐,存储不便的实际问题,极大的方便体育学科成绩的评定、查询和持久化存储。该设计利用较为简单的手段解决了通过数据库操作的复杂性,解决了现有技术中存在的问题。其有益效果体现在易操作的早操数据统计系统的设计简明,内存占用率低,数据准确率高,方便操作,借鉴配置文件设计特点,达到数据库设计的效果。
[1]侯卫红,刘金娥. Java语言程序设计[M].北京:高等教育出版社,2016:238.
[2]苏健.Java程序设计的教学实践与思考[J].计算机教育, 2008 (24):147-149.
[3]张敦华,刘建.Java动态类加载机制及其应用[J]. 计算机工程与设计,2004(3):432-435.
[4]蒋湘资.动态原理在高校早操管理中的运用[J].上海体育学院学报,1992.16(S1):67-69.
[5]杨丰萍,冯春华,王健. 基于Java和SVG的监控画面图形生成软件的设计[J].电力系统保护与控制,2008,36 (3):32-36.
[6]任浩,谭庆平.基于VRML和Java的物理建模方法与实现[J].计算机工程与科学, 2000,39(2):36-39.
[7]马东君,归明,潘月君.山东建材学院分院早操管理应用软件的程序设计[J].体育科技, 1998(3):49-52.
[8]WILLIAM J. COLLINS. Data Structures and the Java Collections Framework[M] John Wiley & Sons,2011:68-109.
On the Design and Development of the Morning Exercise Statistical System Based on the Properties Set
GE Jun, etal.
(Nanjing Forestry University, Nanjing 210037,Jiangsu, China)
江苏省体育局体育科技项目局管课题(ST14401207)。
戈俊(1983—),硕士,讲师,研究方向:体育工程。