[java]基于I/O流的图书管理系统

本程序包含三个包、共13个类,能基本实现图书借阅、查询;用户登录、注册等多种功能。

 
上面左图是程序的结构,右面是程序的入口。
结构主要使用功能类实现相应的功能,test类提供接口函数,进入Library类,程序功能实现开始。

下面进行相关类的介绍:红色为标题

Library : 包含一个接口函数 Interface(),将各个类的功能进行综合,在此类中完成: 用户交互界面显示、用户登录、用户注册、管理员登录。 


举例: 用户的密码和文件中已有的密码进行比对:
File file = new File("用户信息") 
System.out.println("请输入您的密码:");
String password = sc.next();
//建立文件输入流通道
FileInputStream intput = new FileInputStream(file);
//缓冲读取输入流的内容
BufferedReader reader = new BufferedReader(new InputStreamReader(intput));
String tempString;
//建立字符串列表
List<String> list = new ArrayList<>();
while ((tempString = reader.readLine()) != null) {
    //当一行行读取的内容到底时,循环结束,把tempString的内容追加到list后面
    list.add(tempString);
}

……

if (password.equals(userinf[1])) 

[代码举例]

 AddBook、Book、BorrowBook、DeleteBook、FindBook、ReturnBook等 

     这几个类都是对应实现自己的功能的,比如AddBook类实现从硬盘中读入书籍信息,然后再写入硬盘信息,在创建新书的时候,使用了Book类的构造函数 Book book= new Book(……).

    部分代码如下;

System.out.println("请输入作者");
String author = sc.next();
System.out.println("请输入价格");
double price = sc.nextDouble();   //Double类型的price
System.out.println("请输入类型");
String category = sc.next();
System.out.println("请输入出版社");
String press = sc.next();
String state="false";
//构造
Book book = new Book(bookName, author, price, category, press, state);  //构建书
//下面涉及从内存写入硬盘的书籍信息文本
//1 调用file的creatNewFile()方法   2. FileWriter 对象fw构建 3 fw下的write()方法进行book对象的String的连接  4 每写入一行,插入换行符 5 关闭流,写入成功 6 提示写入成功
file.createNewFile();
FileWriter fw = new FileWriter(file, true);  //注: FileWriter(io,boolean),表示不覆盖型写入,即在原信息后面新建或者追加
fw.write(book.toString());  //连接
fw.write(System.getProperty("line.separator"));   //getProperty 是获取系统的属性,“line.separator”是line下的换行符separatpor
fw.close();  //关流后,文件就真正的被写入了
//提示写入成功
System.out.println("新加图书成功");

  再如借阅图书的时候,先告诉用户现在有什么书:

//遍历图书书籍,以便用户进行选择
System.out.println("当前可借阅书籍有:");
int i = 0;
for (String user : list) {
    bookinf = user.split(",");
    //遍历图书信息
    if (bookinf[5].equals("false")) {
        System.out.print(" | " + bookinf[0] + " |");
        i++;
        if (i % 5 == 0) {
            System.out.println("");
            System.out.println("==========================================================");
        }
    }
}
if (i % 5 != 0) {
    System.out.println("");
    System.out.println("==========================================================");
}
System.out.println("请输入要借阅的书籍名称:");
String bookName = scanner.next();

for (String user : list) {
    bookinf = user.split(",");
    if (bookName.equals(bookinf[0])) { //判断书籍是否存在
        flag = true;
        System.out.println("书名:" + bookinf[0] + ",作者:" + bookinf[1] + ",价格:" + bookinf[2] +………………
        break;
    }
}

借入和借出,都会写入日志:

xx时间(yyyy-MM-dd HH:mm:ss) +用户(operator)+"借走了书籍"+bookinf[0]

即什么时候,谁借走/还入了xx书

//获取借书人
modifyFile.writeFile(filePath, modifyFile.readFileContent(bookinf, filePath, "无", operator));
//获取借书时的时间
Date nowDate = new Date();
//标准时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String borrowTime = sdf.format(nowDate);  //以borrowTime记录

modifyFile.writeFile(filePath, modifyFile.readFileContent(bookinf, filePath, "null", borrowTime));
System.out.println("借阅成功!");
System.out.println("借阅时间:" + borrowTime + ",最多可借阅60天,请按时归还图书!");
//写日志
File file = new File("日志.txt");  //确定硬盘中file文件的位置
FileWriter fw = new FileWriter(file, true);
//日志格式: xx时间+xx+借走了+xx书
fw.write(borrowTime + "  " + operator + "借走了图书:" + bookinf[0]);
fw.write(System.getProperty("line.separator"));//在段落后添加一个换行符
fw.close(); //关流
return;

AddUser类

在这个类中,我定义了一个addUser函数,它负责新的用户对象的构建,即调用User类的构造函数,即

User u = new User(addName, sex, age, phone, password);

(注:User上面有一个抽象类Person类,User继承了Person类)

等待用户输入用户名,性别等信息,创建对象u,然后通过file.createNewFile()   和FileWriter fw= new FileWriter(file,append true) 和 fw.write(u.toString())的连接,fw.close() 。把这个新的用户加入到我们的用户信息库中

User类

这是在Interface()接口选择"1.普通用户"后会使用的部分,会提示用户以下功能:

1.查询书籍 2.借阅书籍 3.归还书籍 4.修改密码 5.返回

举个栗子:

如果我们想要查询书籍,那么需要创建一个FindBook的对象(fb),那么用对象去调用

public void findBook(String operator) throws IOException 

即        fb.findBook(operator)

再如: BorrowBook bb= new BorrowBook();

         bb.borrrowBook(operator);对应调用 BorrowBook类中的void borrowBook(operator) throws IOException{……}

为了提示用户密码修改正确,设定一个boolean,因为我们新建了一个User对象modifyFile,那么

result=modifyFile(filePath,modifyFile.readFileContent(userinf,filePath,oldString,newString));

这个readFileContent是我们自定义的一个函数,它包括了用户的信息,文件路径,旧密码,新密码,如果result=true,说明newString覆盖了oldString,提示用户密码修改成功。

为了实现修改密码的这个功能,我们的readFileContent()和writeFile()方法要写:

 readFileContent(),里面应该包括对"用户信息.txt"的读取,

br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF-8"));

读取条件

while ((line = br.readLine()) != null){……}
StringBuffer buf = new StringBuffer();   
 buf.append(line);  
这里用到了indexOf,它可以实现把传入的oldString保存为一个int 的indexOf,然后使用我们定义的动态缓存对象buf的replace方法,使得indexOf和newString,后面覆盖前面,实现密码的修改
int indexOf = line.indexOf(oldString);
buf.replace(indexOf, indexOf + oldString.length(), newString);// 修改内容
buf.append(System.getProperty("line.separator"));// 添加换行
bufAll.append(buf);

因为最后的修改完毕要返回至modify(filePath,modify.readFileContent(useinf,fileFile,oldString,newString)),所以最后

return bufAll.toString();

最后,在测试类Test中,我们调用Library的接口方法Interface(),就可以进入登录界面了,然后由接口对接到指定的功能模块,实现调用,完成对应的功能。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值