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