【案例二】 继续完成FindBook类的编写
大部分都是一样的,不同在于:添加图书需要先从文本中读取信息到内存,然后最后还要写入到文本里。查询图书不需要进行写入文本,只需要按照图书查询后输出文本中已经有的文本信息即可,下面给出思维导图:
相似的代码 package Book; import java.io.*; import java.util.Scanner; import java.util.ArrayList; import java.util.List; public class BorrowBook { Scanner sc= new Scanner(System.in); public void borrowBook() throws IOException{ System.out.println("请输入想借阅的图书"); String bookName=sc.next(); File file =new File("书籍信息.txt"); FileInputStream input= new FileInputStream(file); BufferedReader reader= new BufferedReader(new InputStreamReader(input)); String tempString; List<String>list =new ArrayList<>(); while((tempString=reader.readLine())!=null){ list.add(tempString); } boolean flag=false; String [] book_name= new String[13]; for(String user:list){ book_name=user.split(","); if(bookName.equals(book_name[0])){ //有此书 flag=true; System.out.println("查到此书"); //输出书的信息(分割后的)book_name[0]是名称,book_name[1]是作者 System.out.println("书籍信息如下: 书籍名称"+book_name[0]+"作者"+book_name[1]+"价格"+book_name[2]+"书籍类型"+book_name[3]+"出版社"+book_name[4]+"状态"+book_name[5]); break;//跳出 } } if(flag==false) //表明flag没变过,即本来就没有这本书 { System.out.println("这里没有这本书"); //接下来应该不进行下面的修改文本数据的步骤,直接返回(return) return ; }
下面才是重量级!!!! 怎么修改文件文本?
关键在于: 怎么修改文本中特殊字符串的内容?
有两个需修改点 :1 修改借阅状态
2 修改数量
修改的对象: bookName.equals(book_name[0])为真并且book_name[5].equals("false")为真的,
【知识点】创建当前类(BorrowBook)下的对象modifyFile对象,调用它的
writeFile(path, modifyFile.readFileContent(book_name,path,"false","true"))方法 ,使得后面的true会替换前面的false,然后把它返回一个boolean值
因此,在前面需要加上:
String filePath="书籍信息.txt";
BorrowBook modifyFile= new BorrowBook();
File bookFile= new File("书籍信息.txt"); //这里File的对象不要再写file
改写目标文件中的内客有 几个步骤:
首先判断 书是否在库内有(已实现,即bookName . equals(book_name[0])
然后,根据条件:if (bookName.equals(bookinf[0]) && bookinf[5].equals("false")),把 modify file下的 writeFile(path, modifyFile.readFileContent(book_name,path,"false","true"))方法给result(相当于flag),如果result的值一直为false,书已借出,提示用户。
我们在前面定义了一个modifyFile对象,还需要修改的方法:
1 写入 2 读文件
读文件,和之前的都差不多: 创建BufferedReader对象----new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF-8"));------(line = br.readLine()) != null)-----StringBuffer buf = new StringBuffer()(一行行读入的信息写入buf)(StringBuff是缓冲字符串,可以防止中文乱码)。 欲修改相关内容,先分割:String book_name2[]= line.split(","); 然后选择将line追加到buf后面,即buf.append(line). 追加完后,就可以进行交换了:
【知识点:】
int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
int indexOf(String str, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。 int indexOf= line.indexOf(oldString); //返回原信息出现的索引
buf.replace(indexOf, indexOf + oldString.length(), newString);// 修改内容
换行符:buf.append(System.getProperty("line.separator"));
bufAll.append(buf); //把局部修改的追加到(StringBuffer)bufAll,保存所有更改
最后,关闭br流,br.close()
读完就是写了,新建.Bufferedwriter流
bw = new BufferedWriter(new OutputStreamWriter(newFileOutputStream(filePath), "UTF-8")); bw.write(content);
bw.flush(); ∥强制清空缓冲区