Java基礎(chǔ)之刪除文本文件中特定行的內(nèi)容
一、問題的產(chǎn)生
在最近使用I/O流寫圖書館管理系統(tǒng)中管理員對(duì)圖書和用戶的管理操作時(shí),遇到了需要刪除特定圖書和用戶的操作,在查詢資料和詢問老師后得知I/O流中沒有可以直接刪除單獨(dú)行的方法。
二、解決思路
同時(shí)也為我提供了新的思路:將整個(gè)文件中的全部內(nèi)容讀取出來,然后通過集合將每一行單獨(dú)存放,通過查找到集合內(nèi)特定的內(nèi)容后,將該行內(nèi)容刪除,此時(shí)list集合會(huì)自動(dòng)將后面的內(nèi)容填補(bǔ)上來,再重新寫入的時(shí)候不會(huì)出現(xiàn)空行的情況。這時(shí)再重新遍歷一次該集合,將現(xiàn)在的集合內(nèi)容寫入文件中,此時(shí)再看文件,已經(jīng)完成了刪除需要?jiǎng)h除的特定行內(nèi)容了!
三、具體解決方法
下面我以我項(xiàng)目中刪除書籍的方法為例,具體講解該如何解決該問題
先看一下我存入的書籍文件:
通過上圖可以看到,我在寫入文件時(shí),每一個(gè)屬性中間添加了一個(gè)“,”作為分隔符,這樣我們將文件中內(nèi)容讀取到集合之后可以通過split(","); 直接將文件中讀出的每行的內(nèi)容通過數(shù)組的形式將每一個(gè)屬性分隔開,方便我們通過數(shù)組下標(biāo)直接訪問相應(yīng)的屬性。
同時(shí)由上圖可知:此時(shí)我的書籍文件中存在7本書籍,除了紅樓夢(mèng)被“張三”借出外,其他書籍均未被借出。
那我們?cè)趧h除書籍的時(shí)候就會(huì)遇到一個(gè)問題,若我需要?jiǎng)h除的書籍是一本被用戶借出的書籍在邏輯上我們應(yīng)該不允許該書籍被刪除。所以在程序設(shè)計(jì)時(shí)我們應(yīng)該避免刪除被用戶借出后未歸還的書籍。
具體判斷邏輯如下:
/** * 對(duì)書籍.txt文件中特定的書籍進(jìn)行刪除: * 1.讀出文件中的內(nèi)容,將其存放在一個(gè)String類型的集合中 * 2.通過分隔符將集合的每一位分割開存放到數(shù)組中 * 3.通過數(shù)組下標(biāo)查找是否有該書籍 * 否: * 輸出信息,跳出程序return; * 是: * 4.通過數(shù)組下標(biāo)查找該書是否有人借閱 * 是: * 輸出信息,跳出程序return; * 否: * 5.通過遍歷刪除集合中該位所對(duì)應(yīng)的內(nèi)容 * 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;//定義一個(gè)字符串,每一次讀出該行字符串內(nèi)容 List<String> list = new ArrayList<>();//定義一個(gè)list字符串集合用來儲(chǔ)存每一行的字符串信息 while ((tempString = reader.readLine()) != null) { list.add(tempString); } System.out.println("==========當(dāng)前書籍有=========="); //遍歷字符串集合 for (String book : list) { bookinf = book.split(",");//將‘,‘作為分隔符,將字符串分隔開存放進(jìn)入數(shù)組中 System.out.print(bookinf[0] + " "); } System.out.println(""); //輸入要?jiǎng)h除的內(nèi)容 System.out.println("請(qǐng)輸入要?jiǎng)h除的書籍名稱:"); Scanner scanner = new Scanner(System.in); bookDelete = scanner.next(); //查詢?cè)撚脩羰欠裼形礆w還的書籍,如果存在未歸還的書籍,將不能刪除該用戶的信息 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; } //若該書籍存在,判斷書籍對(duì)應(yīng)用戶位是否存在用戶 //若對(duì)應(yīng)位用戶不為“無”,則表示該書籍有人借出,則無法刪除該書籍 //同時(shí)告知管理員(打印)該書籍被哪位用戶借出尚未歸還 if (!"無".equals(bookinf[6]) && have) { System.out.println("該書籍尚未被用戶“" + bookinf[6] + "”歸還,請(qǐng)?jiān)谄錃w還書籍后再進(jìn)行操作!"); return; } } //若書籍不存在,輸出相應(yīng)信息后直接跳出程序 if (have == false) { System.out.println("無法找到該書籍,請(qǐng)重新確認(rèn)后再進(jìn)行操作!"); return; } for (String delBook : list) { bookinf1 = delBook.split(","); //找到即將刪除的書籍在集合中的位置,將該部分內(nèi)容從集合中刪除,然后清空整個(gè)文件 if (bookDelete.equals(bookinf1[0])) { list.remove(delBook);//在集合中刪除該行 FileWriter fd = new FileWriter(file, false);//append傳入false表示寫入內(nèi)容時(shí)將會(huì)覆蓋文件中之前存在的內(nèi)容 fd.write("");//執(zhí)行刪除操作,寫入空內(nèi)容覆蓋之前的內(nèi)容 fd.close(); break; } } //重新遍歷一遍更改后的集合,將內(nèi)容重新寫入文件內(nèi) for (String user : list) { bookinf1 = user.split(","); FileWriter fw = new FileWriter(file, true);//append傳入true表示寫入內(nèi)容時(shí)將不會(huì)覆蓋文件中之前存在的內(nèi)容,將新的內(nèi)容寫在之前內(nèi)容的后面 fw.write(bookinf1[0] + "," + bookinf1[1] + "," + bookinf1[2] + "," + bookinf1[3] + "," + bookinf1[4] + "," + bookinf1[5] + "," + bookinf1[6] + "," + bookinf1[7]);//執(zhí)行重新寫入內(nèi)容的操作,將修改過的集合通過數(shù)組讀下標(biāo)后,再重新存寫入文件中 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)行前文件中的書籍信息:
當(dāng)我們輸入一本未被借出的書籍時(shí):
此時(shí)文件中的書籍信息:
可以看到,魔戒已經(jīng)從文件中消失,在魔戒下一行的霍比特人頂上來了,并未出現(xiàn)空行的情況。
我們?cè)佥斎胍槐颈唤璩龅臅匆豢磿?huì)出現(xiàn)什么情況:
可以看到,輸出結(jié)果是書籍未被用戶張三歸還,并且文件中的書籍紅樓夢(mèng)沒有被刪除。
最后我們來輸入一本不存在于文件中的書籍:
因?yàn)橹拔覀儗⒛Ы鋸奈募袆h除,此時(shí)無法找到該書籍。
四、總結(jié)
在java中想要直接通過I/O流中的方法將整個(gè)文件中的特定的某一行刪除是不行的,此時(shí)我們需要轉(zhuǎn)變思路,將I/O流中直接對(duì)文件的操作,轉(zhuǎn)換為通過將文件中的內(nèi)容讀到集合中,再對(duì)集合進(jìn)行操作,最后再將集合寫入文件中。
到此這篇關(guān)于Java基礎(chǔ)之刪除文本文件中特定行的內(nèi)容的文章就介紹到這了,更多相關(guān)Java中刪除文本行的內(nèi)容內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java實(shí)戰(zhàn)之基于I/O流設(shè)計(jì)的圖書管理系統(tǒng)
- Java 添加數(shù)字簽名到excel及檢測(cè),刪除簽名
- 解決Java Redis刪除HashMap中的key踩到的坑
- IDEA插件之快速刪除Java代碼中的注釋
- 詳解Java刪除Map中元素java.util.ConcurrentModificationException”異常解決
- java迭代器中刪除元素的實(shí)例操作詳解
- Java如何通過File類方法刪除指定文件夾中的全部文件
- Java File類的簡單使用教程(創(chuàng)建、刪除、遍歷與判斷是否存在等)
- Java中List遍歷刪除元素remove()的方法
- Java使用RedisTemplate模糊刪除key操作
相關(guān)文章
java正則表達(dá)式學(xué)習(xí)筆記之命名捕獲
這篇文章主要為大家詳細(xì)介紹了java正則表達(dá)式中的命名捕獲,感興趣的小伙伴們可以參考一下2016-02-02Spring Batch讀取txt文件并寫入數(shù)據(jù)庫的方法教程
這篇文章主要給大家介紹了Spring Batch讀取txt文件并寫入數(shù)據(jù)庫的方法,SpringBatch 是一個(gè)輕量級(jí)、全面的批處理框架。這里我們用它來實(shí)現(xiàn)文件的讀取并將讀取的結(jié)果作處理,處理之后再寫入數(shù)據(jù)庫中的功能。需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04SpringBoot集成Redisson實(shí)現(xiàn)分布式鎖的方法示例
這篇文章主要介紹了SpringBoot集成Redisson實(shí)現(xiàn)分布式鎖的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10MyBatis之foreach標(biāo)簽的用法及多種循環(huán)問題
這篇文章主要介紹了MyBatis之foreach標(biāo)簽的用法及多種循環(huán)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11hutool實(shí)戰(zhàn):IoUtil 流操作工具類(將內(nèi)容寫到流中)
這篇文章主要介紹了Go語言的io.ioutil標(biāo)準(zhǔn)庫使用,是Golang入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下,如果能給你帶來幫助,請(qǐng)多多關(guān)注腳本之家的其他內(nèi)容2021-06-06基于SpringMVC中的路徑參數(shù)和URL參數(shù)實(shí)例
這篇文章主要介紹了基于SpringMVC中的路徑參數(shù)和URL參數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02