JAVA图书管理系统(I/O流实现)
目录
前言
一.项目需求
1.1 项目的具体功能:
二.项目设计
2.1登录系统
2.2用户管理模块
2.3读者管理模块
2.4借阅管理
2.5基本信息维护
总结:
前言
长期以来,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较烦琐。在借书时,读者首先将要借的书和借阅证交给工作人员,然后工作人员将每本书的信息卡片和读者的借阅证放在一个小格栏里,最后在借阅证和每本书贴的借阅条上填写借阅信息。在还书时,读者首先将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填好相应的还书信息。太过于繁琐了!所以,我们需求设计一个图书管理系统来方便学生的借书和图书馆管理书籍。
一.项目需求
1.1 项目的具体功能:
(1)读者信息管理:包括读者信息添加和读者信息查询与修改功能。用户登录成功之后,可以浏览所有读者的信息,也可以检索特定读者的信息;同时,可以对读者信息进行维护,包括增加、删除及修改。具体信息包括读者类型(读者的类型决定着他可以借到书的最大数量和最大归还天数)、读者姓名、出生日期、性别、电话、所在院系、注册日期等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(2)图书信息管理:包括图书信息添加和图书信息查询与修改功能。用户登录成功之后,可以浏览所有图书信息和检索特定图书的信息;也可以对图书信息进行维护。包括添加图书、删除图书以及修改图书信息。具体信息包括:图书ISBN、图书名称、作者、出版社、出版日期、印刷次数、单价、图书类别等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(3)图书借阅管理:包括图书借阅和图书归还功能。图书借阅功能,先输入读者的编号,然后输入要借阅的图书的信息,记录系统当前时间即借阅时间;图书归还功能,输入读者的编号,选择其名下已借阅的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限,计算罚金,从而进行图书的归还操作。具体信息包括:借阅日期、归还日期、罚金。由于要计算罚金,故需要知道该读者的读者类型,根据类型判断其可借图书天数、可借图书数量等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(4)基础信息维护:包括图书类别设置、读者类别设置及罚金设置。图书类别设置,可以对图书的类别进行增加、删除、修改和查询;读者类别设置可以对读者的类别进行增加、删除、修改和查询;罚金设置,可以指定超期一天的罚金标准。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(5)用户管理:包括修改密码、用户添加和删除。修改密码,是指当前用户修改自己的密码;用户添加和删除,是对新增和去除系统用户时对用户信息的维护。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
二.项目设计
2.1登录系统
博主首先完成的是登录系统这个模块,程序先从文件中读取账户,读取账户我用的是字符流去写,将账户从文件中读取出来,如果账户不存在就注册。注册账户其实就是将内容写入到文件中。读取账户:先把文件里的内容一行一行的到集合里,集合我选用的是ArrayList。然后遍历集合通过分片拿到账户名,密码同理。以下是博主写的登录代码可以参考一下。
public static void Login() throws IOException, InterruptedException, ClassNotFoundException {while (true) {System.out.println("请先输入你的登录账户名称:");userAccount = TSUtility.readKeyBoard(6, false);TSUtility.Reader(array,FilenameTeamp);for (int i = 0; i < array.size(); i++) {String account = array.get(i).split(",")[0].split("=")[1];num=i;if (userAccount.equals(account)) {System.out.println("请输入你的密码:");String LoginPassword = TSUtility.readKeyBoard(6, false);String password = array.get(i).split(",")[1].split("=")[1];if (LoginPassword.equals(password)) {String log=userAccount+"在"+TSUtility.regionsTime()+"登录了图书管理系统";TSUtility.Writer(log,FilenameTeamp1);//LibraryManageView.LibraryManage();} else {System.out.println("你输入的密码有误,请重新输入!!!");Login();}}else {flag=1;}}if (flag==1) {System.out.println("账号不存在!!!");System.out.println("是否需要注册(Y/N)");char c = TSUtility.readConfirmSelection();if (c == 'Y') {registAccount(userAccount);//注册账户} else {Login();}}}}
此图是存账户的文件:
2.2用户管理模块
这个模块因为跟密码账户这些东西挂钩所以我先选择写他。其实这个模块还是比较简单的无非就是改密码,改密码:通过文件到集合,在分片(上面有代码),然后再set()方法修改,再把集合的内容写进文件里,注册账户也是一样,其实就是文件到集合。集合到文件相互用起来就行了。附上关键代码:修改密码
if (newPassword.equals(newPasswordpro)){String account = array.get(getNum()).split(",")[0].split("=")[1];String newUser="account="+account+",password="+newPassword;array.set(num,newUser);TSUtility.Writer(array,FilenameTeamp);System.out.println("修改密码成功!!!");
2.3读者管理模块
读者管理模块与图书管理模块非常相似,这里我就讲一下读者,图书就自己去完成。读者管理包括:增加读者,修改读者,查看读者,删除读者。写这段代码,我主要用的是,把对象读者放到集合里,然后把集合序列化。因为这样拿读者的属性非常的方便。直接反序列化,遍历集合就可以拿到。反序列化这里有一个点:如果文件为空反序列化会有异常,我的解决方法:字符流去读那个文件,看是否为空。肯定也有简单的方法自行百度。当然增添你的考虑账户名不能重名。
关键代码:
System.out.println("请输入读者的姓名:");String Name = TSUtility.readKeyBoard(4, false);System.out.println("请输入读者的出生日期:");System.out.println("年:");String year = TSUtility.readKeyBoard(4, false);System.out.println("月:");String moth = TSUtility.readKeyBoard(2, false);System.out.println("日:");String day = TSUtility.readKeyBoard(2, false);System.out.println("请输入读者的性别(男/女):");char Sex = TSUtility.readMenuSelectionpro1();System.out.println("请输入读者的电话号码:");int num = TSUtility.readInt();System.out.println("请输入读者的学院:");String Department = TSUtility.readKeyBoard(5, false);String regintime = TSUtility.regionsTime();ReaderInformation r1 = new ReaderInformation(ID, Name, new Date(year, moth, day), Sex, num, Department, true, regintime, new ReaderType("A", 2, 2));TSUtility.ObjectOutput(r1, ReaderList, FilenameTeamp);String log=Loginservice.userAccount+"在 "+TSUtility.regionsTime()+"添加了一个读者:"+Name;TSUtility.Writer(log,FilenameTeamplog);System.out.println("添加成功!!!");
修改读者:
将文件的内容读到集合,遍历拿到集合里的内容修改就行,最后别忘了把修改后的集合序列化存放到文件里去。
查看读者:
查看是最简单的。将文件的内容读到集合,遍历集合就行。
删除读者:
删除要考虑的是,读者是否存在,读者是否借阅了图书等,
2.4借阅管理
这个模块是最核心的模块,稍微复杂一些。借书你要考虑,图书存在不,数量是否足够,还有就是读者他最多能借几本书,图书数量的变化,读者的属性变化等等。因为这个模块牵涉到读者和图书两个类,你用了他们哪些属性,改了哪些东西,你都得把这些新内容重新写入文件中去。归还图书:跟借阅一样,注意属性变化,及时更新文件内容。重点是你的判断读者是否逾期,再根据读者的类别,借阅时间,计算罚金。借阅记录很简单,跟读者查看方法一样。
借阅的关键代码:
boolean isnull = TSUtility.isnull(FilenameTeamp);boolean isnull1 = TSUtility.isnull(FilenameTeamp1);if (!isnull) {try {throw new Aexception("没有读者,请先添加");} catch (Aexception aexception) {System.out.println(aexception.getMessage());}} else {ReaderInfomationservice.lookReaderInfomation();System.out.println("请输入读者的ID: ");String ID = TSUtility.readKeyBoard(5, false);ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FilenameTeamp));Object o = ois.readObject();ReaderList = (ArrayList) o;boolean bb = true;for (int i = 0; i < ReaderList.size(); i++) {ReaderInformation r = (ReaderInformation) ReaderList.get(i);if (ID.equals(r.getID())) {bb = false;BookInformationservice.lookBook();System.out.println(ANSI_GREEN);System.out.println("===================================");System.out.println("类型 可借数量 可借天数 ");System.out.println(r.getType());System.out.println("===================================");System.out.println(ANSI_BLUE);if (r.getType().getMaxbook() == 0) {System.out.println("你借的书太多了,请及时归还!!!");break;}if (!isnull1) {break;}System.out.println("请输入你要借的图书名称: ");String bookname = TSUtility.readKeyBoard(10, false);ObjectInputStream ois1 = new ObjectInputStream(new FileInputStream(FilenameTeamp1));Object oo = ois1.readObject();BookList = (ArrayList) oo;boolean flag = true;for (int j = 0; j < BookList.size(); j++) {BookInformation b = (BookInformation) BookList.get(j);if (bookname.equals(b.getBookName())) {flag = false;if (b.getBookcount() <= 0) {try {throw new Aexception("图书数量不足,请联系管理员!!!");} catch (Aexception aexception) {System.out.println(aexception.getMessage());}break;} else {b.setBookcount(b.getBookcount() - 1);r.setStatus(false);r.getType().setMaxbook(r.getType().getMaxbook() - 1);TSUtility.ObjectOutput(ReaderList, FilenameTeamp);TSUtility.ObjectOutput(BookList, FilenameTeamp1);boolean isnull2 = TSUtility.isnull(FilenameTeamp3);if (isnull2) {ObjectInputStream ooo = new ObjectInputStream(new FileInputStream(FilenameTeamp3));Object O = ooo.readObject();BorrowPeopleList = (ArrayList) O;}String time = TSUtility.regionsTime();String borrowpeople = r.getID() + " " + r.getName() + " " + time + " " + b.getBookName() + " " + b.getAnthor() + " " + b.getPress() + " " + b.getDate() + " " + b.getPrice();BorrowPeopleInformation bpi = new BorrowPeopleInformation(r.getID(), r.getName(), r.getPhoneNumber(), time, b.getBookName(), b.getAnthor(), b.getPress(), b.getPrice());TSUtility.ObjectOutput(bpi, BorrowPeopleList, FilenameTeamp3);BorrowList.add(borrowpeople);TSUtility.Writer1(BorrowList, FilenameTeamp2);String log = Loginservice.userAccount + "在 " + TSUtility.regionsTime() + "借出了图书" + b.getBookName() + " 借书人:" + r.getName() + " ID:" + r.getID();TSUtility.Writer(log, FilenameTeamplog);System.out.println("借书成功!!!");break;}}}if (flag) {try {throw new Aexception("目前没有这本图书");} catch (Aexception aexception) {System.out.println(aexception.getMessage());}}//图书不存在break;}}if (bb) {try {throw new Aexception("没有找到该读者!!! ");} catch (Aexception aexception) {System.out.println(aexception.getMessage());}}//读者不存在ois.close();}
归还的代码:
boolean isnull = TSUtility.isnull(FilenameTeamp3);if (isnull) {ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FilenameTeamp3));Object oo = ois.readObject();returnList = (ArrayList) oo;if (returnList.size() == 0) {System.out.println("没有记录!!!");} else {System.out.println("所有记录");Lookbook();System.out.println("请输入读者ID:");String name = TSUtility.readKeyBoard(5, false);boolean flag = true;String BorrowTime = null;int price = 0;for (int i = 0; i < returnList.size(); i++) {BorrowPeopleInformation b = (BorrowPeopleInformation) returnList.get(i);if (name.equals(b.getID())) {flag = false;System.out.println("你借的书有:");System.out.println("=========================================");System.out.println("书名 作者 借书日期 ");for (int j = 0; j < returnList.size(); j++) {BorrowPeopleInformation b1 = (BorrowPeopleInformation) returnList.get(j);if (b.getID().equals(b1.getID())) {System.out.println(b1.getBorrowBookName() + " " + b1.getBorrowBookAnthor() + " " + b1.getBorrwTime());BorrowTime = b1.getBorrwTime();flag = false;}}System.out.println("请输入要归还的图书名称:");boolean flag1 = true;String Bookname = TSUtility.readKeyBoard(8, false);for (int j = 0; j < returnList.size(); j++) {BorrowPeopleInformation b2 = (BorrowPeopleInformation) returnList.get(j);if (Bookname.equals(b2.getBorrowBookName())) {ObjectInputStream oi = new ObjectInputStream(new FileInputStream(FilenameTeamp1));Object ob = oi.readObject();returnList1 = (ArrayList) ob;//归还后图书数量+1for (int k = 0; k < returnList1.size(); k++) {BookInformation bb = (BookInformation) returnList1.get(k);if (Bookname.equals(bb.getBookName())) {bb.setBookcount(bb.getBookcount() + 1);price = bb.getPrice();break;}}//归还后读者可借阅数量+1ObjectInputStream oio = new ObjectInputStream(new FileInputStream(FilenameTeamp));Object obo = oio.readObject();returnList2 = (ArrayList) obo;String Readerinfo = null;String typeName = null;int maxday = 0;for (int k = 0; k < returnList2.size(); k++) {ReaderInformation bbb = (ReaderInformation) returnList2.get(k);if (name.equals(bbb.getID())) {bbb.getType().setMaxbook(bbb.getType().getMaxbook() + 1);Readerinfo = "你的类型是" + bbb.getType().getTypeName() + "你最久只能借" + bbb.getType().getMaxday() + "天";typeName = bbb.getType().getTypeName();maxday = bbb.getType().getMaxday();break;}}String log = "ID为:" + name + "的读者" + "在 " + TSUtility.regionsTime() + "归还了图书" + Bookname;TSUtility.Writer(log, FilenameTeamplog);//算钱================================================================System.out.println(ANSI_YELLOW);FileReader fir = new FileReader(FilenameTeampmony);MonyList.load(fir);String a = MonyList.getProperty(typeName);Long aa = Long.parseLong(a);fir.close();System.out.println("========================================================");System.out.println("注意:");System.out.println("如果逾期了: 罚金=逾期天数*类型罚金*图书价格");System.out.println("========================================================");System.out.println(Readerinfo);String nowTime = TSUtility.regionsTime();long l = TSUtility.calculateTime(BorrowTime);System.out.println("图书价格 借书时间 还书时间 借用时间(秒) ");System.out.println(" " + price + " " + BorrowTime + " " + nowTime + " " + l);if (l > maxday) {System.out.println("你逾期了!!!" + (l - maxday) + "秒");System.out.println("罚款:" + (l - maxday) * aa * price + "元");} else {System.out.println("你没有逾期!!!!很好!!");}TSUtility.ObjectOutput(returnList1, FilenameTeamp1);TSUtility.ObjectOutput(returnList2, FilenameTeamp);returnList.remove(i);TSUtility.ObjectOutput(returnList, FilenameTeamp3);System.out.println("归还成功");System.out.println(ANSI_CYAN);flag1 = false;break;}}if (flag1) {System.out.println("没有借阅该图书!!!");}break;}}if (flag) {System.out.println("没有找到该读者!!!");}}} else {System.out.println("没有借书记录!!!");}
2.5基本信息维护
这个模块涉及到读者类别,图书类别的添加,罚金的设置,如果没有读者类别,图书类别,是无法添加读者,图书的。
添加读者类别的关键代码如下:
需要注意的是读者类别变化带来的其他模块的变化,比如罚金设置,读者添加等,都要考虑。
boolean isnull = TSUtility.isnull(FilenameTeamp1);System.out.println("请输入你要添加的类别ID:");String TypeID = TSUtility.readKeyBoard(3, false);if (isnull) {System.out.println("当前类别有:");lookReaderType();ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FilenameTeamp1));Object o = ois.readObject();ReaderList3 = (ArrayList) o;}boolean b = true;for (int j = 0; j < ReaderList3.size(); j++) {ReaderType rd = (ReaderType) ReaderList2.get(j);if (TypeID.equals(rd.getID())) {System.out.println("该类别已经存在!!!");b = false;break;}}if (b) {System.out.println("请输入你要添加的类别名称:");String TypeName = TSUtility.readKeyBoard(5, false);System.out.println("请输入" + TypeName + "类型最大借阅数量:");int TypeNumber = TSUtility.readInt();System.out.println("请输入" + TypeName + "类型最大借阅天数:");int TypeTime = TSUtility.readInt();ReaderType r = new ReaderType(TypeID, TypeName, TypeNumber, TypeTime);TSUtility.ObjectOutput(r, ReaderList2, FilenameTeamp1);FileReader ff=new FileReader(FilenameTeamp2);pro.load(ff);pro.setProperty(TypeName,"0");FileWriter f=new FileWriter(FilenameTeamp2);pro.store(f,null);f.close();System.out.println("添加类别成功!!!");}
罚金设置:这个模块我用的是Properties与IO流结合起来,设置值就是根据键获取值
,到时候归还图书的时候计算借阅时间,在自定义罚金公式就行了。非常的方便。 罚金的计算在归还图书那里已经写好了。
总结:
这个小项目多次用到文件的读写,所以可以吧文件读写写成方法调用,注册时间我用的是
public static String regionsTime(){
/* Calendar c=Calendar.getInstance();int year=c.get(Calendar.YEAR);int moth=c.get(Calendar.MONTH)+1;int day=c.get(Calendar.DATE);return year+"年"+moth+"月"+day+"日";*/Date d=new Date();SimpleDateFormat sdf=new SimpleDateFormat();String format = sdf.format(d);return format;}//当前时间
如果文件更新了注意,及时通过写入的方法去重新写入。这篇博客主要讲的是我的一些思路,没有太多的具体代码写入。注意:写之前多思考各个模块之间的联系,免得后面更改代码,有些打脑壳。
JAVA图书管理系统(I/O流实现)相关推荐
- Java图书管理系统练习程序(四)
2019独角兽企业重金招聘Python工程师标准>>> Java图书管理系统练习程序(四) 本部分主要介绍List的基本操作与Java中泛型的使用. 一.Java中泛型的使用 泛型, ...
- java图书管理系统技术难度_Java图书管理系统练习程序(一)
Java图书管理系统练习程序 第一部分 该部分主要实现命令行方式的界面与无数据库访问的练习,通过本练习.主要掌握Java的基础知识与面向对象程序设计思想.面向接口编程技术的知识与运用. 一.练习程序功 ...
- 视频教程-手把手实现Java图书管理系统(附源码)-Java
手把手实现Java图书管理系统(附源码) 南京大学软件工程硕士,曾就职于擎天科技.中软国际.华为等上市公司,擅长Java开发.Web前端.Python爬虫.大数据等领域技术. 全栈工程师,从事软件开发 ...
- [附源码]计算机毕业设计JAVA图书管理系统
[附源码]计算机毕业设计JAVA图书管理系统 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(Intell ...
- java图书管理系统源码
java图书管理系统源码 系统主要功能 读者:登录注册,借阅还书,查询书籍,查看当前借阅信息以及历史借阅信息,查看.查询读者借阅榜以及借阅书籍借阅榜,问题反馈以及查询反馈结果等功能. 管理员:对图书. ...
- 用JAVA实现图书管理系统(IO流)
前言 长期以来,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较烦琐.在借书时,读者首先将要借的书和借阅证交给工作人员,然后工作人员将每本书的信息卡片和读者的借阅证放在一个小 ...
- 我的第一个项目----Java图书管理系统
项目参考自:http://www.java1234.com/a/yuanchuang/swing2/ 项目视频及代码下载地址:链接:http://pan.baidu.com/s/1pLpQw2J 密码 ...
- MySQL+Java 图书管理系统
一.设计目的 通过对图书管理系统的系统分析.系统设计.编码和调试等工作的实践,熟悉管理信息系统的开发过程.设计方法及相关编程技术,熟练掌握数据库设计的基本理论及方法. 二.设计任务 要求完成一个具有一 ...
- java图书管理系统目的_java_图书管理系统java版,本文的目的就是通过图书管理 - phpStudy...
图书管理系统java版 本文的目的就是通过图书管理系统掌握数据库编程技术,能正确连接数据库,能对数据库中信息进行查询.插入.删除.修改. 内容:在数据库中创建一张书目信息表,包括书名.作者.出版社.出 ...
最新文章
- Accurate self-correction of errors inlong reads using de Bruijn graphs LoRMA使用de Bruijn图对长read中的错误
- 自定义弹出框控件制作及示例
- 为 protocol 中属性添加默认值
- 每日一皮:雷神索尔的锤子为什么这么重?
- 10分钟白嫖我常用的20个在线工具类网站清单。
- 【机器学习基础】逻辑回归 + GBDT模型融合实战!
- CodeForces - 817F MEX Queries(线段树lazy序)
- 把 SAP UI5 应用部署到 SAP Kyma
- 期待已久的VS2008 SP1 和.NET FRAMEWORK 3.5 SP1都出来了
- C++程序代码:利用【函数】——画正三角形、倒三角形
- C#中Abstract和Virtual的区别
- Python socket – network programming tutorial
- 苹果傲慢,售后服务中外有别
- LordPE找不到进程
- Retrofit完美封装
- win7序列号(可激活所有版本)
- Python format 使用实例
- 【图像压缩】连续比特率自适应《Asymmetric Gained Deep Image Compression With Continuous Rate Adaptation》
- linux 系统管理员l,系统管理员的 SELinux 指南
- PL-VIO学习+注释
热门文章
- 单机安装oracle,单机安装oracle系统
- 我的Go+语言初体验——(5)Go+ 基本语法之 Switch
- 重新下载python以前下的包还用重新安装吗_强制“pip”在切换到其他Python二进制文件后重新编译以前安装的包(numpy)...
- python一个函数调用另一个函数的返回值_在另一个函数中使用返回值
- 【Jmeter篇】你有Fiddler、Charles抓包,我有Jmeter录制Web和App端
- modifying的博客
- PyCharm安装与配置,python的Hello World
- 四.Windows I/O模型之重叠IO(overlapped)模型
- JAVA Web学习篇--Servlet
- 多個不同格式文件如何合並至一個PDF檔