[零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[文件保存](2)

简介:
MIS信息管理系统实战开发之单独使用文件实现保存
image
开发背景
image
ID、姓名、年龄为公共信息,而学生有成绩,工人有工资
定义一个抽象类Person(ID、姓名、年龄),学生是其子类,有成绩,工人是其子类有工资
ID如何定义呢? 
ID最好可以自己生成,最好的方式是采用下面的编码方式: 
· 标记 + 时间戳 + 三位随机数 
· 例如:2009年3月22 20:10:10.345 
· 学生的标记为s,工人的标记为w 
· 生成的ID号: 学生 --> s20090322201010345023 
                           工人 --> w20090322201010345023 
因为现在的程序要满足文件和数据库的操作标准,所以此处应该定义出一个公共的标准 —— 接口 
查询信息的时候可以进行排序操作,可以使用Comparable接口完成。
整个代码中牵扯到数据层的操作 
· 数据层就是指真实的数据操作 --> CRUD。 
· 最终结果操作的肯定是一个人(人为工人和学生) 
应该进行分开,一个是全部的学生管理,一个是全部的工人管理。 
数据层操作标准定义完成之后,有两种选择,一种是直接使用子类实现,但是以后的修改不是很方便, 
所以此处最好使用代理设计的思路完成,做一个中间层。 
代码关系: 
Main --> Menu --> PersonOperate --> DAO
因为程序即要求使用文件保存,又要求使用数据库保存,所以此处可以设计出一个工厂,通过此工厂进行DAO的操作子类实例取得。
image
 
###################Michael分割线#####################
 
WorkerOperate.java 
package org.michael.demo.operate;    

import java.util.Iterator;    

import org.michael.demo.dao.PersonDAO;    
import org.michael.demo.factory.DAOFactory;    
import org.michael.demo.util.InputData;    
import org.michael.demo.util.TimeStamp;    
import org.michael.demo.vo.Person;    
import org.michael.demo.vo.Worker;    

public  class WorkerOperate  implements PersonOperate {    
         private PersonDAO dao =  null;    
         private InputData input =  null;    

         public WorkerOperate() {    
                 this.dao = DAOFactory.getPersonDAOInstance( "worker.ser");    
                 this.input =  new InputData();    
        }    

         public  void add() {    
                String id =  new TimeStamp( "w").getTimeStampRandom();    
                System.out.print( "输入工人姓名:");    
                String name =  this.input.getString();    
                System.out.print( "输入工人年龄:");    
                 int age =  this.input.getInt();    
                System.out.print( "输入工人工资:");    
                 float salary =  this.input.getFloat();    
                Worker w =  new Worker(id, name, age, salary);    
                 try {    
                         this.dao.doCreate(w);    
                }  catch (Exception e) {    
                        e.printStackTrace();    
                }    
        }    

         public  void delete() {    
                String id =  null;    
                System.out.print( "请输入要删除的工人ID:");    
                id = input.getString();    
                 try {    
                         this.dao.doDelete(id);    
                }  catch (Exception e) {    
                        e.printStackTrace();    
                }    
        }    

         public  void update() {    
                 // 更新之前需要先查询出来    
                String id =  null;    
                System.out.print( "请输入要修改的工人ID:");    
                id = input.getString();    
                Worker w =  null;    
                 try {    
                        w = (Worker)  this.dao.findById(id);    
                }  catch (Exception e1) {    
                         // TODO Auto-generated catch block    
                        e1.printStackTrace();    
                }    
                System.out.print( "输入工人姓名(原姓名:" + w.getName() +  "):");    
                String name =  this.input.getString();    
                System.out.print( "输入工人年龄(原年龄:" + w.getAge() +  "):");    
                 int age =  this.input.getInt();    
                System.out.print( "输入工人工资(原工资:" + w.getSalary() +  "):");    
                 float salary =  this.input.getFloat();    
                w.setName(name);    
                w.setAge(age);    
                w.setSalary(salary);    
                 try {    
                         this.dao.doUpdate(w);    
                }  catch (Exception e) {    
                        e.printStackTrace();    
                }    
        }    

         public  void findAll() {    
                Iterator<Person> iter =  null;    
                 try {    
                        iter =  this.dao.findAll().iterator();    
                }  catch (Exception e) {    
                        e.printStackTrace();    
                }    
                System.out.println( "ID\t\t\t姓名\t年龄\t工资");    
                 while (iter.hasNext()) {    
                        System.out.println(iter.next());    
                }    

        }    

         public  void findByLike() {    
                String keyWord =  null ;    
                System.out.print( "请输入查询关键字:") ;    
                keyWord =  this.input.getString() ;    
                Iterator<Person> iter =  null;    
                 try {    
                        iter =  this.dao.findByLike(keyWord).iterator();    
                }  catch (Exception e) {    
                        e.printStackTrace();    
                }    
                System.out.println( "ID\t\t\t姓名\t年龄\t工资");    
                 while (iter.hasNext()) {    
                        System.out.println(iter.next());    
                }    
        }    

 
PersonDAOProxyFile.java
package org.michael.demo.proxy;    

import java.util.Set;    

import org.michael.demo.dao.PersonDAO;    
import org.michael.demo.dao.impl.PersonDAOImplFile;    
import org.michael.demo.vo.Person;    

public  class PersonDAOProxyFile  implements PersonDAO {    
         private PersonDAO dao =  null;    

         public PersonDAOProxyFile(String fileName) {    
                PersonDAOImplFile.fileName = fileName;    
                 this.dao =  new PersonDAOImplFile();    
        }    

         public  boolean doCreate(Person person)  throws Exception {    
                 return  this.dao.doCreate(person);    
        }    

         public  boolean doDelete(String id)  throws Exception {    
                 return  this.dao.doDelete(id);    
        }    

         public  boolean doUpdate(Person person)  throws Exception {    
                 return  this.dao.doUpdate(person);    
        }    

         public Set<Person> findAll()  throws Exception {    
                 return  this.dao.findAll();    
        }    

         public Person findById(String id)  throws Exception {    
                 return  this.dao.findById(id);    
        }    

         public Set<Person> findByLike(String keyWord)  throws Exception {    
                 return  this.dao.findByLike(keyWord);    
        }    


 
InputData.java 
package org.michael.demo.util;    

//输入数据的操作类    
import java.io.BufferedReader;    
import java.io.IOException;    
import java.io.InputStreamReader;    

public  class InputData {    
         private BufferedReader buf =  null;    

         public InputData() {    
                buf =  new BufferedReader( new InputStreamReader(System.in));    
        }    

         public  int getInt() {    
                 int temp = 0;    
                 // 如果输入的不是数字,至少应该有一个提示,告诉用户输入错了    
                 // 可以使用正则验证    
                String str =  null;    
                 boolean flag =  true;    
                 while (flag) {    
                         // 输入数据    
                        str =  this.getString();    
                         if (!(str.matches( "\\d+"))) {    
                                 // 如果不是一个数字,则必须重新输入    
                                System.out.print( "输入的内容,必须是整数,请重新输入:");    
                        }  else {    
                                 // 是一个正确的数字,则可以进行转换    
                                temp = Integer.parseInt(str);    
                                 // 表示退出循环    
                                flag =  false;    
                        }    
                }    
                 return temp;    
        }    

         public String getString() {    
                String str =  null;    
                 try {    
                        str = buf.readLine();    
                }  catch (IOException e) {    
                        e.printStackTrace();    
                }    
                 return str;    
        }    

         public  float getFloat() {    
                 float f = 0.0f;    
                String str =  null;    
                 boolean flag =  true;    
                 while (flag) {    
                         // 输入数据    
                        str =  this.getString();    
                         if (!(str.matches( "\\d+.?\\d{1,2}"))) {    
                                 // 如果不是一个数字,则必须重新输入    
                                System.out.print( "输入的内容,必须是小数(小数点后只到两位),请重新输入:");    
                        }  else {    
                                 // 是一个正确的数字,则可以进行转换    
                                f = Float.parseFloat(str);    
                                 // 表示退出循环    
                                flag =  false;    
                        }    
                }    
                 return f;    
        }    

 
TimeStamp.java
package org.michael.demo.util;    

import java.util.Calendar;    
import java.util.GregorianCalendar;    
import java.util.Random;    

// 取得时间戳的类    
public  class TimeStamp {    
         private Calendar calendar =  null;    
         // 此标记有外部决定    
         private String flag =  null;    

         public TimeStamp() {    
                 this.calendar =  new GregorianCalendar();    
        }    

         public TimeStamp(String flag) {    
                 this() ;    
                 this.flag = flag;    
        }    

         public String getTimeStamp() {    
                StringBuffer buf =  new StringBuffer();    
                 if ( this.flag !=  null) {    
                        buf.append( this.flag);    
                }    
                buf.append( this.addZero(calendar.get(Calendar.YEAR), 4));    
                buf.append( this.addZero(calendar.get(Calendar.MONTH) + 1, 2));    
                buf.append( this.addZero(calendar.get(Calendar.DAY_OF_MONTH), 2));    
                buf.append( this.addZero(calendar.get(Calendar.HOUR_OF_DAY), 2));    
                buf.append( this.addZero(calendar.get(Calendar.MINUTE), 2));    
                buf.append( this.addZero(calendar.get(Calendar.SECOND), 2));    
                buf.append( this.addZero(calendar.get(Calendar.MILLISECOND), 3));    
                 return buf.toString();    
        }    

         public String getTimeStampRandom() {    
                StringBuffer buf =  new StringBuffer();    
                Random r =  new Random();    
                buf.append( this.getTimeStamp());    
                buf.append(r.nextInt(10));    
                buf.append(r.nextInt(10));    
                buf.append(r.nextInt(10));    
                 return buf.toString();    
        }    

         // 可以单独设置一个加“0”的操作    
         private String addZero( int temp,  int len) {    
                String str = temp + "";    
                 while (str.length() < len) {    
                        str =  "0" + str;    
                }    
                 return str;    
        }    

 
Person.java
package org.michael.demo.vo;    

import java.io.Serializable;    

public  abstract  class Person  implements Comparable,Serializable {    
         // 定义各公共属性    
         private String id ;    
         private String name ;    
         private  int age ;    
         public Person(String id,String name, int age){    
                 this.setId(id) ;    
                 this.setName(name) ;    
                 this.setAge(age) ;    
        }    
         public String getId() {    
                 return id;    
        }    
         public  void setId(String id) {    
                 this.id = id;    
        }    
         public String getName() {    
                 return name;    
        }    
         public  void setName(String name) {    
                 this.name = name;    
        }    
         public  int getAge() {    
                 return age;    
        }    
         public  void setAge( int age) {    
                 this.age = age;    
        }    
}
 
Student.java
package org.michael.demo.vo;    

public  class Student  extends Person {    
         private  static  final  long serialVersionUID = 1L;    
         private  float score;    

         public Student(String id, String name,  int age,  float score) {    
                 super(id, name, age);    
                 this.setScore(score);    
        }    

         public  int compareTo(Object arg0) {    
                Student s = (Student) arg0;    
                 if ( this.score < s.score) {    
                         return 1;    
                }  else  if ( this.score > s.score) {    
                         return -1;    
                }  else {    
                         if ( super.getAge() < s.getAge()) {    
                                 return -1;    
                        }  else  if ( super.getAge() > s.getAge()) {    
                                 return 1;    
                        }  else {    
                                 return 0;    
                        }    
                }    
        }    

         public String toString() {    
                 return  this.getId() +  "\t" +  this.getName() +  "\t" +  this.getAge() +  "\t" +  this.score;    
        }    

         public  float getScore() {    
                 return score;    
        }    

         public  void setScore( float score) {    
                 this.score = score;    
        }    


 
Worker.java
package org.michael.demo.vo;    

public  class Worker  extends Person {    
         private  static  final  long serialVersionUID = 1L;    
         private  float salary;    

         public Worker(String id, String name,  int age,  float salary) {    
                 super(id, name, age);    
                 this.setSalary(salary);    
        }    

         public  int compareTo(Object arg0) {    
                Worker w = (Worker) arg0;    
                 if ( this.salary < w.salary) {    
                         return 1;    
                }  else  if ( this.salary > w.salary) {    
                         return -1;    
                }  else {    
                         if ( super.getAge() < w.getAge()) {    
                                 return -1;    
                        }  else  if ( super.getAge() > w.getAge()) {    
                                 return 1;    
                        }  else {    
                                 return 0;    
                        }    
                }    
        }    

         public String toString() {    
                 return  this.getId() +  "\t" +  this.getName() +  "\t" +  this.getAge()    
                                +  "\t" +  this.salary;    
        }    

         public  float getSalary() {    
                 return salary;    
        }    

         public  void setSalary( float salary) {    
                 this.salary = salary;    
        }    


 
测试:
新增学生测试:
image
 
查询学生测试:
image
 
修改学生信息测试:
image
 
删除学生信息测试:
image
###################Michael分割线#####################
这季研究的是使用单独文件实现保存信息的MIS信息管理系统,下季研究使用数据库来保存信息哈~~~
###################Michael分割线#####################
###################Michael分割线#####################






本文转自redking51CTO博客,原文链接:http://blog.51cto.com/redking/142475 ,如需转载请自行联系原作者
相关文章
|
6月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
152 9
|
2月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
6月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
168 2
|
3月前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
|
3月前
|
Java API 数据处理
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
68 4
|
5月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
588 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
5月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
171 34
|
4月前
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
104 0
|
6月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
125 3
|
6月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
下一篇
oss创建bucket