欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > windows >内容正文

windows

JAVA图书管理系统(I/O流实现)

发布时间:2025/3/15 windows 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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流实现)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。