Java基礎(chǔ)day20筆記:Properties簡述|Properties存取|Properties存取配置文件|PrintWriter|合并流|切割文件

????11-IO流(Properties簡述)

? ? ? ? 到這里IO中的基本對(duì)象我們已經(jīng)學(xué)完了,接下來介紹一個(gè)單獨(dú)的對(duì)象,當(dāng)然前面也有接觸過,就是:Properties。

????????Properties是hashtable的子類,也就是說它具備map集合的特點(diǎn),而且它里面存儲(chǔ)的鍵值對(duì)都是字符串,是集合中和IO技術(shù)組合的集合容器。

? ? ? ? 該對(duì)象的特點(diǎn):可以用于鍵值對(duì)形式的配置文件。

? ??????那么在加載數(shù)據(jù)時(shí),需要數(shù)據(jù)有固定格式:鍵=值。

????????舉個(gè)例子,我們現(xiàn)在將文本顏色設(shè)置為紅色:

? ? ? ? 我們將軟件關(guān)閉,再重新打開,文本顏色依然是我們改動(dòng)后的樣子。

? ? ? ? 這是將配置信息進(jìn)行了實(shí)體化存儲(chǔ)導(dǎo)致的,它把這些信息存到一個(gè)文件中去了,每一次打開軟件它都會(huì)加載這個(gè)文件。

? ? ? ? 我們可以找到這個(gè)文件看一看:

? ? ? ? 發(fā)現(xiàn)它都是以鍵值對(duì)的形式存在的,比如colors它的值是DDDDDD......。

? ? ? ? 為什么寫成鍵值對(duì)的形式呢?

? ? ? ? 因?yàn)槿绻覀冎苯哟鎯?chǔ)紅色,這樣就無法分辨它到底是文本顏色還是背景顏色了,所以以鍵值對(duì)形式存儲(chǔ)非常直接明了。

? ? ? ? 可是很遺憾的是,這種鍵值對(duì)的信息通常都存在文件中,我們要想去獲取這個(gè)信息,就要先找到這個(gè)文件,而且要操作這些數(shù)據(jù)要用到IO流技術(shù),這就是Properties對(duì)象的由來,它的特點(diǎn)在于,不只可以操作鍵值對(duì),而且可以操作硬盤上的鍵值對(duì)信息(集合中的數(shù)據(jù)都在內(nèi)存中)。

????12-IO流(Properties存取)

? ? ? ? Properties中有一些特有的方法:

? ? ? ? 接下來我們對(duì)其中特有的方法進(jìn)行演示。

? ? ? ? 設(shè)置元素:

? ? ? ? 獲取元素值:

? ? ? ? 獲取鍵集:

????13-IO流(Properties存取配置文件)

? ? ? ? 剛剛只是演示了一下,用代碼設(shè)置了一下鍵值對(duì),實(shí)際中,鍵值對(duì)的數(shù)據(jù)一般已經(jīng)存在在文件中了。

? ? ? ? 那如何將流中的數(shù)據(jù)存儲(chǔ)到集合中呢?

? ? ? ? 步驟:

? ? ? ? 1,用一個(gè)流和info.txt文件關(guān)聯(lián)。

? ? ? ? 2,讀取一行數(shù)據(jù),將該行數(shù)據(jù)用“=”進(jìn)行切割。

? ? ? ? 3,等號(hào)左邊作為鍵,右邊作為值,存入到Properties集合中即可。

? ? ? ? 代碼:

? ? ? ? 但是,如果每一次獲取硬盤上的數(shù)據(jù)往里面存,用這個(gè)方法就太麻煩了。所以Properties結(jié)合為我們提供了一個(gè)load方法,可以直接加在一個(gè)字節(jié)流,或者字符流都行,但是加載字符流的load方法是1.6版本才有的,早期都是字節(jié)流:

? ? ? ? load方法演示:??

? ? ? ? 我們現(xiàn)在想要將其中wangwu的值改成39:??

? ? ? ? properties中改了:

? ? ? ? 可是文件中依然沒有變:

? ? ? ? setProperty方法只是改變了內(nèi)存的數(shù)據(jù),而下面我們要用到store這個(gè)方法,可以將內(nèi)存中的數(shù)據(jù)保存到流中:

? ? ? ? 演示:

? ? ? ? OK,文件中也保存了:

????14-IO流(Properties練習(xí))????????

? ? ? ? 做一個(gè)練習(xí):做一個(gè)程序,用于記錄應(yīng)用程序運(yùn)行次數(shù),如果使用次數(shù)已到,那么給出注冊(cè)提示。

? ? ? ? 很容易想到的是:計(jì)數(shù)器。

? ? ? ? 可是該計(jì)數(shù)器定義在程序中,隨著程序的運(yùn)行而在內(nèi)存中存在,并進(jìn)行自增。隨著該應(yīng)用程序的推出,該計(jì)數(shù)器也在內(nèi)存中消失了。

? ? ? ? 下一次再啟動(dòng)該程序,又重新開始從0計(jì)數(shù)。這樣不是我們想要的。

? ? ? ? 我們想要的效果是:程序即使結(jié)束,該計(jì)數(shù)器的值也在。下次程序啟動(dòng)會(huì)先加載該計(jì)數(shù)器的值并加1后再重新存儲(chǔ)起來。

? ? ? ? 所以要建立一個(gè)配置文件,用于記錄該軟件的使用次數(shù)。該配置文件使用鍵值對(duì)的形式,這樣便于閱讀數(shù)據(jù),并操作數(shù)據(jù)。鍵值對(duì)數(shù)據(jù)是Map集合,數(shù)據(jù)是以文件形式存儲(chǔ),使用IO技術(shù)。

????????那么Map+IO---->properties。

? ? ? ? 也就是說,配置文件可以實(shí)現(xiàn)應(yīng)用程序數(shù)據(jù)的共享。

? ? ? ? 代碼:

? ? ? ? 注意,操作文件要養(yǎng)成先將文件封裝成對(duì)象的習(xí)慣,不要直接拿著文件名使用,封裝成對(duì)象后,就可以對(duì)這個(gè)對(duì)象進(jìn)行判斷等操作了,比如上面的判斷它是否存在,如果不存在則建立一個(gè)新的,就避免了一些報(bào)錯(cuò)。

? ? ? ? 上面的代碼忘記寫使用次數(shù)到了給注冊(cè)提示的功能,補(bǔ)上:

? ? ? ? 了解內(nèi)容:

? ? ? ? 配置文件中的信息要么是properties的,要么是xml的。它們有什么區(qū)別呢?

? ? ? ? properties:

? ? ? ? 這種方式描述信息其實(shí)是有限的,數(shù)據(jù)關(guān)系不能太復(fù)雜,如果太復(fù)雜了,就無法描述了,即使能描述了,操作起來也費(fèi)勁。

? ? ? ? 比如現(xiàn)在我們想要加入10個(gè)人的信息,這時(shí)候用xml是最方便的:

? ? ? ? 這時(shí)候用鍵值對(duì)描述就超麻煩,寫一大堆還不利于區(qū)分,而用xml封裝完之后則有利于區(qū)分。

? ? ? ? 那用xml封裝之后怎么取呢?

? ? ? ? Java本身具有專門取這個(gè)數(shù)據(jù)的對(duì)象:

? ? ? ? 可以通過這個(gè)對(duì)象來拿到文檔中的數(shù)據(jù),但是沒想到還是好麻煩,Java想要拿到這個(gè)文檔中的數(shù)據(jù),要用到好多種對(duì)象和好多種方法來完成。

? ? ? ? 后來有一幫牛人們又做了一個(gè)更簡單的工具:dom4j。

? ? ? ? 取名的含義就是:dom for java,因?yàn)閒our和for諧音,為了方便書寫,就簡寫成了dom4j。

? ? ? ? 這個(gè)工具在開發(fā)xml的時(shí)候就會(huì)用到。

????15-IO流(PrintWriter)

? ? ? ? 接下來說一下IO包中的其他流。

? ? ? ? 打印流:PrintWriter(字符流)和PrintStream(字節(jié)流)??梢灾苯硬僮鬏斎肓骱臀募?。

? ? ? ? 我們先看一下字節(jié)流PrintStream:

? ? ? ? 我們看一下它的厲害:

? ? ? ? 它可以對(duì)這些基本數(shù)據(jù)類型進(jìn)行直接操作。

我們看看字節(jié)打印流PrintStream的其中一個(gè)構(gòu)造函數(shù):

? ? ? ? 發(fā)現(xiàn)它可以直接操作文件。

? ? ? ? 凡是能和文件相關(guān)的流對(duì)象都是比較重要的流對(duì)象。

? ? ? ? 還有其他構(gòu)造函數(shù):

? ? ? ? 而我們?cè)倏匆幌伦址敵隽鱌rintWriter,這個(gè)對(duì)象確實(shí)非常的常用,到了Web開發(fā)的時(shí)候,都用這個(gè)對(duì)象,把數(shù)據(jù)一條一條的打到客戶端去,讓客戶端的瀏覽器對(duì)它進(jìn)行解析執(zhí)行。

? ? ? ? 我們看一下它的構(gòu)造函數(shù),發(fā)現(xiàn)可以接收的參數(shù)類型比字節(jié)輸出流還要多一個(gè):

????????總結(jié)一下:

? ??????打印流:該留提供了打印方法,可以將各種數(shù)據(jù)類型的數(shù)據(jù)都原樣打印。

? ??????它又分為兩種:

? ??????字節(jié)打印流:PrintStream

? ??????????????構(gòu)造函數(shù)可以接收的參數(shù)類型:

? ? ? ? ? ??? ??1,file對(duì)象。File

? ? ? ? ??? ????2,字符串路徑。String

? ? ? ??? ??????3,字節(jié)輸出流。注意只有OutputStream,其他類型不行哦。

? ? ? ? 字符打印流:PrintWriter

? ??????????????構(gòu)造函數(shù)可以接收的參數(shù)類型:

? ??????????????1,file對(duì)象。File

????????????????2,字符串路徑。String

????????? ? ? ? 3,字節(jié)輸出流。OutputStream

????????? ? ? ? 4,字符輸出流。Writer

????????代碼示例:

? ? ????????? ? PrintWriter中有一個(gè)構(gòu)造函數(shù)傳了boolean類型的參數(shù)autoFlush,它有自動(dòng)刷新的功能:

????????接下來我們不想將數(shù)據(jù)在控制臺(tái)上輸出,想存到文件中去。

? ? ? ? 代碼:

? ? ? ? 運(yùn)行,沒有輸入over之前txt文件中沒有存入數(shù)據(jù),輸入over之后,txt文件中存入了數(shù)據(jù):

? ? ? ? 之所以輸入over之前文件中沒有存入數(shù)據(jù),是因?yàn)闆]有刷新。

? ? ? ? 我們想要有自動(dòng)刷新,很簡單,將文件封裝到流中,就可以使用自動(dòng)刷新了:

? ? ? ? 這樣一來,就實(shí)現(xiàn)了邊輸入文件中邊存入的功能了。

????16-IO流(合并流)

? ? ? ? 說完了打印流,我們說序列流:SequenceInputStream。

? ? ? ? 這個(gè)對(duì)象沒有對(duì)應(yīng)的OutputStream。

? ? ? ? 這個(gè)對(duì)象表示其他輸入流的邏輯串聯(lián)。它從輸入流的有序集合開始,并從第一個(gè)輸入流開始讀取,直到到達(dá)文件末尾。接著從第二個(gè)輸入流讀取,以此類推,直到到達(dá)包含的最后一個(gè)輸入流的文件末尾為止。

? ? ? ? 什么意思呢,可以將多個(gè)流對(duì)象拼接成一個(gè)流對(duì)象。

? ? ? ? 我們看看這個(gè)構(gòu)造方法,可以進(jìn)行兩個(gè)流的合并:

? ? ? ? 而另一個(gè)構(gòu)造方法就更厲害了,可以進(jìn)行多個(gè)流的合并:

? ? ? ? 只要它是InputStream的子類就好了,這里用到了泛型的限定。

? ? ? ? 接下來我們練習(xí)一下,把這三個(gè)文件中的數(shù)據(jù)變成一個(gè)文件:?

? ? ? ? 成功:

????17-IO流(切割文件)

? ? ? ? 能合并自然也能切割。

? ? ? ? 演示:

? ? ? ? 這三個(gè)文件看不了了。。。因?yàn)橐恢圾喿颖磺谐扇龎K之后就不再是一只鴨子了。

? ? ? ? 再將這三個(gè)文件合并起來:

? ? ? ? 哦哦,這個(gè)方法還沒有寫完,續(xù)上:?

? ? ? ? 注意拋出異常哦:

? ? ? ? 運(yùn)行之后,出現(xiàn)了0.bmp文件:

? ? ? ? 除了bmp文件,我們切mp3也是沒有問題的。

? ? ? ? 當(dāng)然切更大的文件就需要分成多個(gè)流對(duì)象來操作了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容