IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【Java实战项目】——图书管理系统(基于文件IO流) -> 正文阅读

[Java知识库]【Java实战项目】——图书管理系统(基于文件IO流)

看完的朋友们如果觉得还不错,给博主一个赞吧,你的一个赞,会给博主很大的支持~蟹蟹!
在这里插入图片描述
项目代码链接,提取码: 35xa

项目梳理

【项目前提】

掌握java基本语法
熟悉使用流程控制
理解面向对象思想
熟练封装,继承,多态 熟悉使用接口,异常
熟悉使用集合 熟悉掌握I/o流相关操作

?

【项目内容】

项目功能结构图:
在这里插入图片描述

项目功能如下:
(1)读者信息管理:包括读者信息添加和读者信息查询与修改功能。用户登录成功之后,可以浏览所有读者的信息,也可以检索特定读者的信息;同时,可以对读者信息进行维护,包括增加、删除及修改。具体信息包括读者类型(读者的类型决定着他可以借到书的最大数量和最大归还天数)、读者姓名、出生日期、性别、电话、所在院系、注册日期等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据

(2)图书信息管理:包括图书信息添加和图书信息查询与修改功能。用户登录成功之后,可以浏览所有图书信息和检索特定图书的信息;也可以对图书信息进行维护。包括添加图书、删除图书以及修改图书信息。具体信息包括:图书ISBN、图书名称、作者、出版社、出版日期、印刷次数、单价、图书类别等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据

(3)图书借阅管理:包括图书借阅和图书归还功能。图书借阅功能,先输入读者的编号,然后输入要借阅的图书的信息,记录系统当前时间即借阅时间;图书归还功能,输入读者的编号,选择其名下已借阅的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限,计算罚金,从而进行图书的归还操作。具体信息包括:借阅日期、归还日期、罚金。由于要计算罚金,故需要知道该读者的读者类型,根据类型判断其可借图书天数、可借图书数量等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据

(4)基础信息维护:包括图书类别设置、读者类别设置及罚金设置。图书类别设置,可以对图书的类别进行增加、删除、修改和查询;读者类别设置可以对读者的类别进行增加、删除、修改和查询;罚金设置,可以指定超期一天的罚金标准。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据

(5)用户管理 :包括修改密码、用户添加和删除。修改密码,是指当前用户修改自己的密码;用户添加和删除,是对新增和去除系统用户时对用户信息的维护。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据

?

【项目注意】

1、注意命名(类名,包名,方法名,注释等),请严格遵循Java命名规则完成项目。
参考文献:https://blog.csdn.net/yang_best/article/details/42169549
?
2、每一个业务逻辑操作需要加上日志打印功能(用I/o流实现,比如什么时候进行了增删改等操作,需要有记录,或者发现异常了也需要将信息同步在日志文件里)
?
3、每个功能模块,如果有异常抛出,需要自定义异常来进行处理

?

【结构设计】

首先结合功能设计,设计6个实体类(存放在Entity_class文件夹):

图书实体:图书编号ISBN、图书名称、作者、出版社、出版日期、印刷次数、单价、图书类型
图书类型:图书类型编号、图书类型名称
读者实体:读者编号、读者姓名、出生日期、性别、电话、所在院系、注册日期
读者类型:读者类型编号、读者类型名称、可借阅天数、可借阅数量 用户:用户编号、用户名、密码
用户类型:用户账号、用户密码
借阅类型:读者编号、书籍编号、借阅日期、归还日期、罚金

?
然后根据操作设计,创建操作类(存放在operate文件夹里

图书信息操作:BookDao
图书类型操作:BookTypeDao
读者信息操作:ReaderDao
读者类型操作:ReaderTypeDao
用户管理操作:UserDao
借阅管理操作:BookBorrowDao

?
然后创建工具包Tool_class,存放自己创建的异常 BookException 和工具类 TSUtility

?
再创建一个包存放我们进行读写的txt文件
?
最后创建我们的视图包view,里面存放了有关界面的类

图书操作界面类:BookView
读者操作界面类:ReaderView
用户操作界面类:UserView
主界面类:Menu

?
?

创建后的大致结构如下:

在这里插入图片描述
在这里插入图片描述

信息管理

用户管理

方法创建

(一)先将 User 类补充完整,创建了三个成员变量 id、name、password,然后创建构造方法和set/get方法

(二)再补充 UserDao 类,这里我创建了如下方法:(注意:这里的异常都是后面写代码时补充上去的,开始创建时不用添加

    //判断账号和密码是否有效
    public static Users check(String name, String password) throws IOException, ClassNotFoundException{}
    
    //存入默认账号和密码(初始化)
    public static void initialization() throws IOException{}

    //查询所有信息
    public static List<Users> selectUser() throws IOException, ClassNotFoundException{}

    //添加用户信息
    public static int insertUser(String name, String password) throws IOException, ClassNotFoundException, BookException{}

    //修改用户信息
    public static int updateUserPWD(Integer id, String pwd) throws IOException, ClassNotFoundException, BookException{}

    //删除用户信息
    public static int deleteUser(Integer id) throws IOException, ClassNotFoundException, BookException{}

(三)最后补充 LoginView 类,因为系统是需要登录的,所以我们需要创建两个界面:loginusersManagement

    //登录界面
    public static void login() throws IOException, ClassNotFoundException, EOFException, InterruptedException{}
    
    //用户管理界面
    public static void usersManagement() throws IOException, ClassNotFoundException, BookException{}

?

设计思路(整个项目都适用)

敲黑板了!!!重点来了,这是贯穿整个项目的中心思想

(一)读写数据

因为该项目主要是基于文件IO流进行读写的,所以我在工具类中写了两个新的方法,用于从文件中读取和存储数据到文件,这样就避免了代码的重复使用。

而在该项目里我读写数据用的文件IO流主要是对象序列化流,先将所有数据存储到一个集合中,然后将集合存入文件中,因为需要与所有实体类相匹配,我们返回和传入的对象都是设计的Object对象

下列代码就是工具类TSUtility中新建的两个方法

    //从文件读数据
    public static Object readFile(File file) throws IOException, ClassNotFoundException {
        ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
        Object o=ois.readObject();
        ois.close();
        return o;
    }

    //向文件写数据
    public static void returnFile(Object obj,File file) throws IOException {
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
        oos.writeObject(obj);
        oos.close();
    }

但是这样使用序列化存储数据后,就发现了一个问题,若文件内容为空,就会报 EOFException 异常,我的解决方法是:先用 try/catch 将该异常捕获并抛出,然后存入初始数据值,这样后面存入其他数据时就不会再报这个异常

(二)增删改查

后面的增删改查操作,都是差不多的一个结构(如下代码),为什么要这么写呢,因为需要判断该成员的数据是否存在于文件中,根据对应的情况作异常的抛出

      boolean flag=false;
      for{
          if(){
              flag=true;
          }else{
          
          }
      }

      if(flag){

      }else{
          throw new BookException();
      }

?

运行界面

(一)登录界面:(------>LoginView类中的Login方法

该图将账号输入错误、密码输入错误、账号密码正确三种情况都展现出来了
?
在这里插入图片描述

?
(二)用户管理界面----->LoginView中的usersManagement方法

具体怎么实现的代码就不说了,上面设计思路已经讲了大部分结构

?
在这里插入图片描述
?
?

图书管理

方法创建

(一) 先将实体类 BookType 和 Book 补充完整,创建成员变量、构造方法和set/get方法

Book的成员变量:

    private String ISBN;
    private String bookname;
    private String author;
    private String publish;//出版社
    private String publishdate;//出版日期
    private int printtime;//印刷次数
    private double unitprice;//单价
    private BookType typename;//图书类型

BookType的成员变量:

    private String typeid;//图书类型编号
    private String typename;//图书类型名称

?
(二)为 BookTypeDao创建方法

//打印输出
    public static void printInfor(List<BookType> list){}

    //初始化
    public static void initialization() throws IOException {}

    //查询全部信息
    public static List<BookType> selectBookType() throws IOException, ClassNotFoundException {}

    //添加图书类型
    public static int insertBookType(Integer id, String typename) throws IOException, ClassNotFoundException, BookException {}

    //删除图书类型
    public static int deleteBookType(Integer id) throws IOException, ClassNotFoundException, BookException {}

?
为BookDao创建方法

    //打印输出
    public static void printInfor(List<Book> list){}

    //初始化
    public static void initialization() throws IOException, ClassNotFoundException {}

    //添加图书信息
    public static int insertBook(String ISBN, String bookname, String author, String publish, String publishdate, String  printtime, String  unitprice, BookType bt) throws IOException, ClassNotFoundException, BookException {}

    //查询所有图书信息
    public static List<Book> selectBook() throws IOException, ClassNotFoundException {}

    //根据其他信息查询图书信息
    public static List<Book> selectBookByISBN(String ISBN) throws IOException, ClassNotFoundException, BookException {}

    public static List<Book> selectBookByName(String bookname) throws IOException, ClassNotFoundException, BookException {}

    public static List<Book> selectBookByType(String type) throws IOException, ClassNotFoundException, BookException {}

    public static List<Book> selectBookByAuthor(String author) throws IOException, ClassNotFoundException, BookException {}

    public static List<Book> selectBookByPublish(String Publish) throws IOException, ClassNotFoundException, BookException {}

    //修改图书信息
    public static int update(String ISBN, String bookname, String author, String publish, String publishdate, int printtime, double unitprice, BookType bt) throws IOException, ClassNotFoundException, BookException {}

    //删除图书信息
    public static int delete(String ISBN) throws IOException, ClassNotFoundException, BookException {}

(三)为BookView创建方法

这里的借阅方法会在后面借阅时用到,它属于图书视图的一部分,故在这里就进行创建

    //图书类别设置
    public static void bookTypeManagement() throws IOException, ClassNotFoundException{}

    //图书信息管理
    public static void bookInforManagement() throws IOException, ClassNotFoundException{}

     //图书借阅管理
    public static void bookBorrowingManagement() throws IOException, ClassNotFoundException, ParseException, BookException{}

?

设计思路(补充)

这里的增删改查操作的设计跟上面用户管理的设计原理是一样的,这里我们对它进行补充

在设计BookDao之前要先把BookTypeDao设计好,因为Book实体类的成员变量中有一个是BookType的对象,关系到BookType的调用,如果不先设计好,后面就无法对BookDao进行测试

在项目注意的内容里面有一点,要求每一个业务逻辑操作需要加上日志打印功能,所以我在工具类里写了一个新的方法,每做一次逻辑操作就调用一次这个方法,就能随时更新日志了,代码如下:

    public static void logging(String op) throws IOException {
        SimpleDateFormat sdf=new SimpleDateFormat();
        String s=sdf.format(new Date());
	    String ss=s+"——"+op;

	    FileWriter fw=new FileWriter("D:\\JavaSE_Code\\Java_SE_Practice project2\\src\\txtFile\\journal.txt",true);

	    fw.write(ss);
	    fw.flush();
	    fw.write("\r\n");
	    fw.close();
    }

截取文件内一部分日志如下图:
?
在这里插入图片描述

运行界面

(一)图书类型管理系统

???????????第一步:
在这里插入图片描述
???????????第二步:
在这里插入图片描述
???????????最终界面:
在这里插入图片描述
?
(二)图书信息管理系统

?
在这里插入图片描述

?
?

读者管理

方法创建

(一)先补充 Reader类和 ReaderType类的内容

Reader类的成员变量

    private String readerid;
    private String name;
    private String sex;
    private int age;
    private String phone;
    private String depart;//所在院系
    private String regdat;//注册日期
    private ReaderType type;

ReaderType类的成员变量

    private String typeid;
    private String typename;//读者类型名称
    private int limit;//可借阅天数
    private int maxborrownum;//可借阅数量

?
(二)再补充 ReaderDao 类和 ReaderTypeDao 类的方法

ReaderTypeDao的方法:

注意这里的罚金设置将在图书借阅和信息维护处用到,且是与读者类型相关联的

    //打印信息
    public static void printInfor(List<ReaderType> list){}

    //初始化
    public static void initialization() throws IOException, ClassNotFoundException {}

    //查询全部读者类型信息
    public static List<ReaderType> selectReaderType() throws IOException, ClassNotFoundException {}

    //查询指定类型名的读者类型信息
    public static List<ReaderType> selectReaderType(String type) throws IOException, ClassNotFoundException, BookException {}

    //添加读者类型
    public static int insertReaderType(Integer id, String typename, Integer num, Integer limit) throws IOException, ClassNotFoundException, BookException {}

    //修改读者类型
    public static int updateReaderType(Integer id, String typename, Integer num, Integer limit) throws IOException, ClassNotFoundException, BookException {}

    //删除读者类型
    public static int deleteReaderType(Integer id) throws IOException, ClassNotFoundException, BookException {}

    //罚金设置
    public static Properties fineInsert(String typename,Double fine) throws IOException {}

?
ReaderDao的方法:

//打印信息
    public static void printInfor(List<Reader> list){}

    //初始化
    public static void initialization() throws BookException, IOException, ClassNotFoundException {}

    //读者信息添加
    public static int insertReader(String id, List<ReaderType> list,String name,String age,String sex, String phone, String dept, String reg) throws BookException, IOException, ClassNotFoundException {}

    //查询读者信息
    public static List<Reader> selectReader() throws IOException, ClassNotFoundException {}

    public static List<Reader> selectReaderById(String id) throws IOException, ClassNotFoundException, BookException {}

    public static List<Reader> selectReaderByName(String name) throws IOException, ClassNotFoundException, BookException {}

    public static List<Reader> selectReaderByType(String type) throws IOException, ClassNotFoundException, BookException {}

    public static List<Reader> selectReaderByDept(String dept) throws IOException, ClassNotFoundException, BookException {}

    //修改读者信息
    public static int updateReader(String id, String typename, String name, Integer age,String sex, String phone, String dept, String reg) throws IOException, ClassNotFoundException, BookException {}

    //删除读者信息
    public static int deleteReader(String id) throws IOException, ClassNotFoundException, BookException {}

?
(三)补充ReaderView里面的方法

注意这里的罚金设置将在图书借阅和信息维护处用到,且是与读者类型相关联的

    //读者信息管理
    public static void readerManagement() throws IOException, ClassNotFoundException, BookException{}
    //读者类型设置
    public static void readerCategorySetting() throws BookException, IOException, ClassNotFoundException{}
    //罚金设置
    public static void fineSetting(){}

?

设计思路(补充)

设计思路与前面提到的相同,这里暂时无其他补充
?
?

运行界面

读者信息管理系统的界面:
?
在这里插入图片描述

?
?

操作执行

借阅操作

包括图书借阅图书归还功能。图书借阅功能,先输入读者的编号,然后输入要借阅的图书的信息,记录系统当前时间即借阅时间;图书归还功能,输入读者的编号,选择其名下已借阅的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限,计算罚金,从而进行图书的归还操作。具体信息包括:借阅日期、归还日期、罚金。由于要计算罚金,故需要知道该读者的读者类型,根据类型判断其可借图书天数、可借图书数量等

?

方法创建

(一)补充BookBorrowDao类中的方法(该类执行的借阅操作)

    //初始化
    public static void initialization() throws IOException, ParseException, BookException, ClassNotFoundException {}

    //查询指定编号读者的借书信息
    public static List<BorrowBook> selectBorrowByReaderId(String readerid) throws BookException, IOException, ClassNotFoundException {}

    //查看所有借阅信息
    public static void selectAllBorrow() throws IOException, ClassNotFoundException {}


    //图书借阅,(借阅者的编号,图书编号,借阅日期)
    public static int borrowBook(String readerid,String ISBN, String  borrowdate) throws IOException, ClassNotFoundException, BookException, ParseException {}

    //图书归还,(还书者的编号,图书编号,归还日期)
    public static int returnBook(String readerid,String ISBN,String returndate,List<BorrowBook> list) throws BookException, IOExceptio{}

?
(二)BookView中的借阅操作视图已创建好

?

设计思想(补充)

之前所讲所有设计思想均适用

这里要补充的一个点是:由于借阅和归还时,图书的数量是要跟着+1和-1的,所以在代码中是有通过ForEach对列表内容进行修改的,因此也发现了一个异常 ConcurrentModificationException,详情可以查看博主写的有关该异常的博客(点击此处,查看异常ConcurrentModificationException

修改前的代码:

       for (BorrowBook b:bbl){
            String readerid1 = b.getReaderid();
            String isbn = b.getISBN();
            Date borrowdate1 = b.getBorrowdate();
            if (readerid1.equals(readerid) && isbn.equals(ISBN)){

                if (b.getBorrowdate()!=null && b.getReturndate()!=null){

                    num++;
                }else {
                    num++;
                    flag=false;
                }
            }
        }

?
修改后的代码:(为何这样修改,可以参考迭代器的使用

//使用迭代器(防止异常ConcurrentModificationException)
        ListIterator<BorrowBook> iterator = bbl.listIterator();
        while (iterator.hasNext()){
            BorrowBook b=iterator.next();
            String readerid1 = b.getReaderid();
            String isbn = b.getISBN();
            Date borrowdate1 = b.getBorrowdate();
            if (readerid1.equals(readerid) && isbn.equals(ISBN)){

                if (b.getBorrowdate()!=null && b.getReturndate()!=null){

                    num++;
                }else {
                    num++;
                    flag=false;
                }
            }
        }

?

运行界面

图书借阅和归还管理界面:
?
在这里插入图片描述
?
?

信息维护

信息的维护主要是对图书类型、读者类型和罚金进行设置,这里就不作多的阐述,设计思想都是一致的,相比于信息管理,是较简单的。这里要注意的是,罚金的文件读写方式并不是用的对象序列化,而是采用的 Properties 类,想要了解该类,可以参考博主的文件IO流(点击该链接,查看文件IO流)博文
?
?

总结

写完整个项目下来,我最大的感受就是:一定要先把需要的类和方法都列出来,这样在后面写代码的时候,能有一个完整的架构让我们去设计。这个项目的内容比我上一个项目要更多和更复杂,但是我却只用了跟上次一样的时间就写完了,这都是因为我在刚开始的时候就列出了所有需要的类,后面写代码的时候一目了然

?
?
?
?

学无止境
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-29 10:06:28  更:2021-09-29 10:09:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:16:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码