Java基礎之刪除文本文件中特定行的內容

一、問題的產生

基於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));
        String tempString;//定義一個字符串,每一次讀出該行字符串內容
        List<String> list = new ArrayList<>();//定義一個list字符串集合用來儲存每一行的字符串信息
        while ((tempString = reader.readLine()) != null) {
            list.add(tempString);
        }
        System.out.println("==========當前書籍有==========");
        //遍歷字符串集合
        for (String book : list) {
            bookinf = book.split(",");//將‘,‘作為分隔符,將字符串分隔開存放進入數組中
            System.out.print(bookinf[0] + " ");
        }
        System.out.println("");
        //輸入要刪除的內容
        System.out.println("請輸入要刪除的書籍名稱:");
        Scanner scanner = new Scanner(System.in);
        bookDelete = scanner.next();

        //查詢該用戶是否有未歸還的書籍,如果存在未歸還的書籍,將不能刪除該用戶的信息
        FileInputStream inputStream = new FileInputStream(file);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String bookString;
        List<String> bookList = new ArrayList<>();
        while ((bookString = bufferedReader.readLine()) != null) {
            bookList.add(bookString);
        }
        boolean have = false;//是否存在書籍
        for (String borrowUser : bookList) {
            bookinf = borrowUser.split(",");
            //判斷書籍是否存在
            if (bookDelete.equals(bookinf[0])) {
                have = true;
            }
            //若該書籍存在,判斷書籍對應用戶位是否存在用戶
            //若對應位用戶不為“無”,則表示該書籍有人借出,則無法刪除該書籍
            //同時告知管理員(打印)該書籍被哪位用戶借出尚未歸還
            if (!"無".equals(bookinf[6]) && have) {
                System.out.println("該書籍尚未被用戶“" + bookinf[6] + "”歸還,請在其歸還書籍後再進行操作!");
                return;
            }
        }
        //若書籍不存在,輸出相應信息後直接跳出程序
        if (have == false) {
            System.out.println("無法找到該書籍,請重新確認後再進行操作!");
            return;
        }
        for (String delBook : list) {
            bookinf1 = delBook.split(",");
            //找到即將刪除的書籍在集合中的位置,將該部分內容從集合中刪除,然後清空整個文件
            if (bookDelete.equals(bookinf1[0])) {
                list.remove(delBook);//在集合中刪除該行
                FileWriter fd = new FileWriter(file, false);//append傳入false表示寫入內容時將會覆蓋文件中之前存在的內容
                fd.write("");//執行刪除操作,寫入空內容覆蓋之前的內容
                fd.close();
                break;
            }
        }

        //重新遍歷一遍更改後的集合,將內容重新寫入文件內
        for (String user : list) {
            bookinf1 = user.split(",");
            FileWriter fw = new FileWriter(file, true);//append傳入true表示寫入內容時將不會覆蓋文件中之前存在的內容,將新的內容寫在之前內容的後面
            fw.write(bookinf1[0] + "," + bookinf1[1] +
                    "," + bookinf1[2] + "," + bookinf1[3] +
                    "," + bookinf1[4] + "," + bookinf1[5] +
                    "," + bookinf1[6] + "," + bookinf1[7]);//執行重新寫入內容的操作,將修改過的集合通過數組讀下標後,再重新存寫入文件中
            fw.write(System.getProperty("line.separator"));//在段落後添加一個換行符
            fw.close();
        }
        System.out.println("刪除成功!");
    }

我們添加一個main方法試運行一下:

public static void main(String[] args) throws IOException {
        DeleteBook db = new DeleteBook();
        db.deleteBook();
    }

運行前文件中的書籍信息:

運行前文件中的書籍信息

當我們輸入一本未被借出的書籍時:

輸入未借出的書籍

此時文件中的書籍信息:

刪除魔戒後文件中的書籍信息

可以看到,魔戒已經從文件中消失,在魔戒下一行的霍比特人頂上來瞭,並未出現空行的情況。

我們再輸入一本被借出的書籍,看一看會出現什麼情況:

輸入已被借出尚未歸還的書籍

可以看到,輸出結果是書籍未被用戶張三歸還,並且文件中的書籍紅樓夢沒有被刪除。

最後我們來輸入一本不存在於文件中的書籍:

輸入不存在的書籍

因為之前我們將魔戒從文件中刪除,此時無法找到該書籍。

四、總結

在java中想要直接通過I/O流中的方法將整個文件中的特定的某一行刪除是不行的,此時我們需要轉變思路,將I/O流中直接對文件的操作,轉換為通過將文件中的內容讀到集合中,再對集合進行操作,最後再將集合寫入文件中。

到此這篇關於Java基礎之刪除文本文件中特定行的內容的文章就介紹到這瞭,更多相關Java中刪除文本行的內容內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!