App下載

解析Java中如何刪除文本文件中指定行的內(nèi)容

流年絮語(yǔ) 2021-08-09 15:38:54 瀏覽數(shù) (4841)
反饋

一、問(wèn)題的產(chǎn)生

基于I/O流編寫(xiě)的圖書(shū)館管理系統(tǒng)

在最近使用I/O流寫(xiě)圖書(shū)館管理系統(tǒng)中管理員對(duì)圖書(shū)和用戶的管理操作時(shí),遇到了需要刪除特定圖書(shū)和用戶的操作,在查詢資料和詢問(wèn)老師后得知I/O流中沒(méi)有可以直接刪除單獨(dú)行的方法。

二、解決思路

同時(shí)也為我提供了新的思路:將整個(gè)文件中的全部?jī)?nèi)容讀取出來(lái),然后通過(guò)集合將每一行單獨(dú)存放,通過(guò)查找到集合內(nèi)特定的內(nèi)容后,將該行內(nèi)容刪除,此時(shí)list集合會(huì)自動(dòng)將后面的內(nèi)容填補(bǔ)上來(lái),再重新寫(xiě)入的時(shí)候不會(huì)出現(xiàn)空行的情況。這時(shí)再重新遍歷一次該集合,將現(xiàn)在的集合內(nèi)容寫(xiě)入文件中,此時(shí)再看文件,已經(jīng)完成了刪除需要?jiǎng)h除的特定行內(nèi)容了!

三、具體解決方法

下面我以我項(xiàng)目中刪除書(shū)籍的方法為例,具體講解該如何解決該問(wèn)題

先看一下我存入的書(shū)籍文件:

2021042014491021

通過(guò)上圖可以看到,我在寫(xiě)入文件時(shí),每一個(gè)屬性中間添加了一個(gè)“,”作為分隔符,這樣我們將文件中內(nèi)容讀取到集合之后可以通過(guò)split(","); 直接將文件中讀出的每行的內(nèi)容通過(guò)數(shù)組的形式將每一個(gè)屬性分隔開(kāi),方便我們通過(guò)數(shù)組下標(biāo)直接訪問(wèn)相應(yīng)的屬性。

同時(shí)由上圖可知:此時(shí)我的書(shū)籍文件中存在7本書(shū)籍,除了紅樓夢(mèng)被“張三”借出外,其他書(shū)籍均未被借出。

那我們?cè)趧h除書(shū)籍的時(shí)候就會(huì)遇到一個(gè)問(wèn)題,若我需要?jiǎng)h除的書(shū)籍是一本被用戶借出的書(shū)籍在邏輯上我們應(yīng)該不允許該書(shū)籍被刪除。所以在程序設(shè)計(jì)時(shí)我們應(yīng)該避免刪除被用戶借出后未歸還的書(shū)籍。

具體判斷邏輯如下:

 /**
     * 對(duì)書(shū)籍.txt文件中特定的書(shū)籍進(jìn)行刪除:
     * 1.讀出文件中的內(nèi)容,將其存放在一個(gè)String類型的集合中
     * 2.通過(guò)分隔符將集合的每一位分割開(kāi)存放到數(shù)組中
     * 3.通過(guò)數(shù)組下標(biāo)查找是否有該書(shū)籍
     * 否:
     * 輸出信息,跳出程序return;
     * 是:
     * 4.通過(guò)數(shù)組下標(biāo)查找該書(shū)是否有人借閱
     * 是:
     * 輸出信息,跳出程序return;
     * 否:
     * 5.通過(guò)遍歷刪除集合中該位所對(duì)應(yīng)的內(nèi)容
     * 6.將更新后的集合信息寫(xiě)入文件中,完成刪除書(shū)籍操作
     */

有了程序的具體邏輯之后,我們就可以開(kāi)始寫(xiě)代碼了:

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("書(shū)籍.txt");
        FileInputStream intput = new FileInputStream(file);
        BufferedReader reader = new BufferedReader(new InputStreamReader(intput));
        String tempString;//定義一個(gè)字符串,每一次讀出該行字符串內(nèi)容
        List<String> list = new ArrayList<>();//定義一個(gè)list字符串集合用來(lái)儲(chǔ)存每一行的字符串信息
        while ((tempString = reader.readLine()) != null) {
            list.add(tempString);
        }
        System.out.println("==========當(dāng)前書(shū)籍有==========");
        //遍歷字符串集合
        for (String book : list) {
            bookinf = book.split(",");//將‘,‘作為分隔符,將字符串分隔開(kāi)存放進(jìn)入數(shù)組中
            System.out.print(bookinf[0] + " ");
        }
        System.out.println("");
        //輸入要?jiǎng)h除的內(nèi)容
        System.out.println("請(qǐng)輸入要?jiǎng)h除的書(shū)籍名稱:");
        Scanner scanner = new Scanner(System.in);
        bookDelete = scanner.next();

        //查詢?cè)撚脩羰欠裼形礆w還的書(shū)籍,如果存在未歸還的書(shū)籍,將不能刪除該用戶的信息
        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;//是否存在書(shū)籍
        for (String borrowUser : bookList) {
            bookinf = borrowUser.split(",");
            //判斷書(shū)籍是否存在
            if (bookDelete.equals(bookinf[0])) {
                have = true;
            }
            //若該書(shū)籍存在,判斷書(shū)籍對(duì)應(yīng)用戶位是否存在用戶
            //若對(duì)應(yīng)位用戶不為“無(wú)”,則表示該書(shū)籍有人借出,則無(wú)法刪除該書(shū)籍
            //同時(shí)告知管理員(打?。┰摃?shū)籍被哪位用戶借出尚未歸還
            if (!"無(wú)".equals(bookinf[6]) && have) {
                System.out.println("該書(shū)籍尚未被用戶“" + bookinf[6] + "”歸還,請(qǐng)?jiān)谄錃w還書(shū)籍后再進(jìn)行操作!");
                return;
            }
        }
        //若書(shū)籍不存在,輸出相應(yīng)信息后直接跳出程序
        if (have == false) {
            System.out.println("無(wú)法找到該書(shū)籍,請(qǐng)重新確認(rèn)后再進(jìn)行操作!");
            return;
        }
        for (String delBook : list) {
            bookinf1 = delBook.split(",");
            //找到即將刪除的書(shū)籍在集合中的位置,將該部分內(nèi)容從集合中刪除,然后清空整個(gè)文件
            if (bookDelete.equals(bookinf1[0])) {
                list.remove(delBook);//在集合中刪除該行
                FileWriter fd = new FileWriter(file, false);//append傳入false表示寫(xiě)入內(nèi)容時(shí)將會(huì)覆蓋文件中之前存在的內(nèi)容
                fd.write("");//執(zhí)行刪除操作,寫(xiě)入空內(nèi)容覆蓋之前的內(nèi)容
                fd.close();
                break;
            }
        }

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

我們添加一個(gè)main方法試運(yùn)行一下:

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

運(yùn)行前文件中的書(shū)籍信息:

2021042014491022

當(dāng)我們輸入一本未被借出的書(shū)籍時(shí):

輸入未借出的書(shū)籍

此時(shí)文件中的書(shū)籍信息:

刪除魔戒后文件中的書(shū)籍信息

可以看到,魔戒已經(jīng)從文件中消失,在魔戒下一行的霍比特人頂上來(lái)了,并未出現(xiàn)空行的情況。

我們?cè)佥斎胍槐颈唤璩龅臅?shū)籍,看一看會(huì)出現(xiàn)什么情況:

2021042014491025

可以看到,輸出結(jié)果是書(shū)籍未被用戶張三歸還,并且文件中的書(shū)籍紅樓夢(mèng)沒(méi)有被刪除。

最后我們來(lái)輸入一本不存在于文件中的書(shū)籍:

輸入不存在的書(shū)籍

因?yàn)橹拔覀儗⒛Ы鋸奈募袆h除,此時(shí)無(wú)法找到該書(shū)籍。

四、總結(jié)

在java中想要直接通過(guò)I/O流中的方法將整個(gè)文件中的特定的某一行刪除是不行的,此時(shí)我們需要轉(zhuǎn)變思路,將I/O流中直接對(duì)文件的操作,轉(zhuǎn)換為通過(guò)將文件中的內(nèi)容讀到集合中,再對(duì)集合進(jìn)行操作,最后再將集合寫(xiě)入文件中。

到此這篇關(guān)于Java基礎(chǔ)之刪除文本文件中特定行的內(nèi)容的文章就介紹到這了,更多相關(guān)Java中刪除文本行的內(nèi)容內(nèi)容請(qǐng)搜索W3Cschool以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持W3Cschool!


以上就是關(guān)于Java IO流寫(xiě)入文件后,想要對(duì)文件中的單獨(dú)行進(jìn)行刪除操作的詳細(xì)內(nèi)容,想要了解更多關(guān)于Java IO流文件的其他操作內(nèi)容,請(qǐng)搜索W3Cschool以前的文章或繼續(xù)瀏覽下面的相關(guān)文章!也希望本篇文章能幫助大家加深對(duì)于Java語(yǔ)言的理解!


0 人點(diǎn)贊