本程序包含三个包、共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(),就可以进入登录界面了,然后由接口对接到指定的功能模块,实现调用,完成对应的功能。