JAVA基础(1)--I/O流--基于图书管理系统的使用分析(2)

【案例二】 继续完成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();   ∥强制清空缓冲区            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值