问题的产生
基于I/O流编写的图书馆管理系统
在最近使用I/O流写图书馆管理系统中管理员对图书和用户的管理操作时,遇到了需要删除特定图书和用户的操作,在查询资料和询问老师后得知I/O流中没有可以直接删除单独行的方法。
解决思路
同时也为我提供了新的思路:将整个文件中的全部内容读取出来,然后通过集合将每一行单独存放,通过查找到集合内特定的内容后,将该行内容删除,此时list集合会自动将后面的内容填补上来,再重新写入的时候不会出现空行的情况。这时再重新遍历一次该集合,将现在的集合内容写入文件中,此时再看文件,已经完成了删除需要删除的特定行内容了!
具体解决方法
下面我以我项目中删除书籍的方法为例,具体讲解该如何解决该问题
先看一下我存入的书籍文件:
通过上图可以看到,我在写入文件时,每一个属性中间添加了一个“,”作为分隔符,这样我们将文件中内容读取到集合之后可以通过split(","); 直接将文件中读出的每行的内容通过数组的形式将每一个属性分隔开,方便我们通过数组下标直接访问相应的属性。
同时由上图可知:此时我的书籍文件中存在7本书籍,除了红楼梦被“张三”借出外,其他书籍均未被借出。
那我们在删除书籍的时候就会遇到一个问题,若我需要删除的书籍是一本被用户借出的书籍在逻辑上我们应该不允许该书籍被删除。所以在程序设计时我们应该避免删除被用户借出后未归还的书籍。
具体判断逻辑如下:
/**
* 对书籍.txt文件中特定的书籍进行删除:
* 1.读出文件中的内容,将其存放在一个String类型的集合中
* 2.通过分隔符将集合的每一位分割开存放到数组中
* 3.通过数组下标查找是否有该书籍
* 否:
* 输出信息,跳出程序return;
* 是:
* 4.通过数组下标查找该书是否有人借阅
* 是:
* 输出信息,跳出程序return;
* 否:
* 5.通过遍历删除集合中该位所对应的内容
* 6.将更新后的集合信息写入文件中,完成删除书籍操作
*/
有了程序的具体逻辑之后,我们就可以开始写代码了:
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class DeleteBook {
private String bookDelete;
String[] bookinf = new String[8];
String[] bookinf1 = new String[8];
public void deleteBook() throws IOException {
File file = new File("书籍.txt");
FileInputStream intput = new FileInputStream(file);
BufferedReader reader = new BufferedReader(new InputStreamReader(intput)