【案例二】 继续完成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(); ∥强制清空缓冲区
该博客介绍了一个Java实现的图书借阅系统,包括从文本文件中读取和写入图书信息。系统能查询图书并更新借阅状态,如找到图书则输出详细信息,否则提示未找到。关键操作涉及文件的读写,特别是如何修改文本中特定内容。借阅成功后,会使用BufferedReader和BufferedWriter修改文件,确保借阅状态更新并保存到文件。
1094

被折叠的 条评论
为什么被折叠?



