????01-IO流(File概述)
? ? ? ? 接下來說IO包中比較重要的一個(gè)對(duì)象惋嚎,也是比較特殊的一個(gè)對(duì)象:File類昵时。流在操作的只有數(shù)據(jù)爵赵,而數(shù)據(jù)最明顯的體現(xiàn)形式就是文件扛或。而文件又包含了很多屬性和行為信息瓤湘,所以Java中就用File類對(duì)文件這類事物進(jìn)行描述瓢颅。
? ? ? ? File類用于將文件或者文件夾封裝成對(duì)象,可以操作文件或者文件夾的屬性信息弛说。
? ? ? ? File類的出現(xiàn)彌補(bǔ)了流的不足挽懦。流可以操作文件,但是不能操作文件夾木人,也不能操作文件和文件夾的屬性信息信柿,比如說這個(gè)文件是可讀還是可寫的,流都不知道醒第,流只能操作數(shù)據(jù)渔嚷。而想要操作被數(shù)據(jù)封裝成文件的信息,必須用File對(duì)象稠曼。
? ? ? ? 接下來看一下File類:
? ? ? ? 分別用幾種構(gòu)造方法來創(chuàng)建一下File對(duì)象:
? ? ? ? 有一個(gè)小問題注意一下:
? ? ? ? 在Windows系統(tǒng)中文件分隔符是這樣的:"\\"形病,但是到了Linux系統(tǒng)中就不是這樣了。這句代碼到Linux系統(tǒng)中就不適用了霞幅。
? ? ? ? 這時(shí)漠吻,我們可以用這個(gè)分隔符:
? ? ? ? 這樣一來,這句代碼就是跨平臺(tái)的司恳,到了不同系統(tǒng)中都能用:
????02-IO流(File對(duì)象功能-創(chuàng)建和刪除)
? ? ? ? 接下來我們過一下File類的常見方法途乃。
? ? ? ? 1,創(chuàng)建文件扔傅。
? ? ? ? boolean createNewFile();
? ? ? ? 注意它會(huì)拋出異常哦:
? ? ? ? 代碼:
? ? ? ? 返回為真則代表創(chuàng)建成功:
? ? ? ? 我們?cè)龠\(yùn)行一次耍共,返回值就為假了:
? ? ? ? createNewFile的特點(diǎn)是:在指定位置創(chuàng)建文件烫饼,如果該文件已經(jīng)存在,則不創(chuàng)建划提,返回false。????????
? ? ? ? 和輸出流不一樣邢享,輸出流對(duì)象一建立創(chuàng)建文件鹏往,文件已經(jīng)存在時(shí),會(huì)覆蓋骇塘。
? ? ? ? 這里還有創(chuàng)建臨時(shí)文件的方法:
? ? ? ? 創(chuàng)建臨時(shí)文件的意思是伊履,當(dāng)我們的應(yīng)用程序在運(yùn)行的時(shí)候,我們利用某些文件來記錄這些數(shù)據(jù)信息款违,記錄完以后這個(gè)文件可以被刪掉唐瀑。這個(gè)創(chuàng)建臨時(shí)文件的方法制定了前綴名和后綴名,通常臨時(shí)文件的名字都是***.temp 插爹。這個(gè)我們就不演示了哄辣,先做了解即可。
? ? ? ? 2赠尾,刪除文件力穗。
? ? ? ? 第一個(gè)方法delete我們就 不講了,下面直接演示气嫁,看看第二個(gè)当窗,這個(gè)方法叫做退出時(shí)刪除:
? ? ? ? delete演示:
? ? ? ? 因?yàn)榍懊嬉呀?jīng)將file.txt文件創(chuàng)建了,所以這里我們將它注釋掉寸宵,然后寫刪除語句:
? ? ? ? 第一次刪除返回值為true崖面,第二次刪除返回值為false:
? ? ? ? 但是在實(shí)際應(yīng)用中可能出現(xiàn)這種情況:
? ? ? ? 程序結(jié)束了,但是沒有執(zhí)行最后一句delete語句梯影,所以這個(gè)程序還是存在在硬盤上巫员,變成了垃圾文件。
? ? ? ? 那如果將delete語句放在final中呢甲棍?這樣也刪不掉嗎?
? ? ? ? 也有可能刪不掉疏遏。
? ? ? ? 我們平時(shí)都有這樣的經(jīng)歷,一個(gè)文件正在被應(yīng)用的時(shí)候救军,我們關(guān)閉它就會(huì)有提示财异。
? ? ? ? 一個(gè)文件正在被流操作著,它是不能被刪掉的唱遭。
? ? ? ? 這時(shí)我們就可以用退出時(shí)刪除這個(gè)方法:
? ? ? ? 它的作用是戳寸,告訴虛擬機(jī),我們創(chuàng)建了一個(gè)文件拷泽,你退出的時(shí)候把它刪掉哦疫鹊。這樣即使后面程序出現(xiàn)異常袖瞻,發(fā)生中斷也沒有關(guān)系,它依然會(huì)被刪掉拆吆。
? ? ? ? 一般臨時(shí)文件會(huì)調(diào)用這個(gè)方法聋迎。
? ? ? ? 總結(jié)一下:
? ? ? ? delete方法:刪除失敗返回false。
? ? ? ? deleteOnExit方法:在程序退出時(shí)刪除指定文件枣耀。
? ??03-IO流(File對(duì)象功能-判斷)
? ? ? ? 3霉晕,判斷。
? ? ? ? 判斷應(yīng)用程序是否可以執(zhí)行此抽象路徑名表示的文件:
? ? ? ? 我們演示一下這個(gè)方法:
? ? ? ? 運(yùn)行結(jié)果為false:
? ? ? ? 我們換一個(gè)已存在的并且可以被應(yīng)用程序執(zhí)行的Java文件:
? ? ? ? 發(fā)現(xiàn)返回為true了:
? ? ? ? 還有此判斷是否可以讀/寫的方法:
? ? ? ? 我們就不演示了捞奕。
? ? ? ? 按字母順序比較兩個(gè)抽象路徑名:
? ? ? ? 這個(gè)方法也不做演示了牺堰。
? ? ? ? 測試此抽象路徑名表示的文件或目錄是否存在:
? ? ? ? 這個(gè)方法用的頻率非常高,我們演示一下:
? ? ? ? 剛剛講創(chuàng)建文件的時(shí)候漏掉了一個(gè)方法颅围,就是創(chuàng)建目錄:
? ? ? ? 演示:
? ? ? ? 程序運(yùn)行前的當(dāng)前目錄:
? ? ? ? 程序運(yùn)行后的當(dāng)前目錄:
? ? ? ? 我們?cè)僭囍嘁粚樱?/p>
? ? ? ? 運(yùn)行之后我們發(fā)現(xiàn)abc文件夾中還有一個(gè)kkk文件夾:
? ? ? ? 那這樣呢:
? ? ? ? 我們發(fā)現(xiàn)返回結(jié)果為false伟葫。
? ? ? ? 因?yàn)閙kdir方法只可以創(chuàng)建一級(jí)目錄。
? ? ? ? 而mkdirs方法則可以創(chuàng)建多級(jí)文件夾:
? ? ? ? 所以只需給剛剛的代碼加上s就好了:
? ? ? ? 補(bǔ)充完創(chuàng)建目錄的方法院促,我們繼續(xù)回到判斷方法中來筏养。
? ? ? ? 這里有兩個(gè)發(fā)你別判斷是否是目錄和是否是標(biāo)準(zhǔn)文件的方法:
? ? ? ? 代碼示例:
? ? ? ? file.txt是一個(gè)文件,但是運(yùn)行結(jié)果兩個(gè)返回值都是false常拓。原因是file.txt文件根本不存在撼玄,而在判斷文件對(duì)象是否是文件或者目錄時(shí),必須要先判斷該文件對(duì)象封裝的內(nèi)容是否存在墩邀。
? ? ? ? 我們創(chuàng)建一個(gè)file.txt文件掌猛,然后再運(yùn)行,發(fā)現(xiàn)f.isFile()的返回值就是true了眉睹。
? ? ? ? 我們將剛剛創(chuàng)建的file.txt文件刪掉荔茬,用它創(chuàng)建一個(gè)目錄:
? ? ? ? 這時(shí)運(yùn)行結(jié)果中f.isDirectory()返回值為true。
? ? ? ? 我們?nèi)ノ募A中看一下竹海,發(fā)現(xiàn)果然創(chuàng)建了一個(gè)file.txt文件夾:
? ? ? ? 不過想想也是慕蔚,沒有人規(guī)定文件夾名字里不能有txt,所以帶后綴的不一定是文件不是目錄哦斋配。
? ? ? ? 判斷是否是隱藏文件:
? ? ? ? 這個(gè)方法就不演示了孔飒。
? ? ? ? 判斷是否為抽象:
? ? ? ? 演示:
? ? ? ? 運(yùn)行結(jié)果為false。
? ? ? ? 我們修改一下f的路徑艰争,使它變成絕對(duì)路徑:
? ? ? ? 這樣運(yùn)行結(jié)果就是true了坏瞄。
? ? ? ? 即使file2.txt這個(gè)文件不存在,返回值也為true甩卓,因?yàn)樗慌袛嗾麄€(gè)文件路徑是否是絕對(duì)路徑鸠匀,和文件存在與否無關(guān)。
????04-IO流(File對(duì)象功能-獲取)
? ? ? ? 4逾柿,獲取信息缀棍。
? ? ? ? 獲取名稱:
? ? ? ? 獲取父目錄:
? ? ? ? 獲取路徑:
? ? ? ? 獲取絕對(duì)路徑:
? ? ? ? 注意一下兩個(gè)方法的區(qū)別:
? ? ? ? 它們都是獲取對(duì)象的絕對(duì)路徑宅此,但是第一個(gè)方法是將返回的絕對(duì)路徑封裝成了一個(gè)File對(duì)象,而第二個(gè)方法則是返回絕對(duì)路徑的字符串爬范。
? ? ? ? String和File是可以輕松轉(zhuǎn)換的父腕,將String new一下就變成File了,將File toString一下就變成字符串了青瀑。
? ? ? ? 獲取最后一次被修改的時(shí)間:
? ? ? ? 獲取文件大需盗痢:
? ? ? ? 接下來演示一下。
? ? ? ? 獲取相對(duì)路徑和絕對(duì)路徑:
? ? ? ? 我們發(fā)現(xiàn)絕對(duì)路徑和相對(duì)路徑是一樣的:
? ? ? ? 因?yàn)檫@個(gè)路徑本身就是絕對(duì)的狱窘。
? ? ? ? 我們重新用一個(gè)相對(duì)路徑試一下:
? ? ? ? 這樣兩者返回結(jié)果就不同了:
? ? ? ? 我們封裝的是什么路徑杜顺,getPath方法就會(huì)返回給我們什么路徑财搁,而getAbsolutePath無論我們封裝的是相對(duì)的還是絕對(duì)的路徑商架,返回來的都是絕對(duì)的路徑伺帘,如果我們封裝的是相對(duì)的路徑,它會(huì)給我們這個(gè)相對(duì)文件前面加上所屬的目錄。
? ? ? ? 獲取父目錄:
? ? ? ? 這句代碼返回值為null咨演。因?yàn)槲覀優(yōu)閒封裝的路徑是相對(duì)路徑,它的父目錄是不確定的元潘,在不同情況下它的父目錄是不同的殿如,所以返回為null。
? ? ? ? getParent方法返回的是絕對(duì)路徑中的父目錄茴扁,如果獲取的是相對(duì)路徑铃岔,返回null。? ? ? ?
? ? ? ? 我們修改一下峭火,將文件的路徑寫成絕對(duì)路徑:
? ? ? ? 這時(shí)就拿到了它的父目錄:
? ? ? ? 但是相對(duì)路徑還有一種情況下返回值不為null:
? ? ? ? 所以毁习,?如果相對(duì)路徑中有上一層目錄,那么該目錄就是返回結(jié)果卖丸。
? ? ? ? 獲取部分就講到這里纺且。
? ? ? ? 下面說一個(gè)重命名的方法:
? ? ? ? 示例:
? ? ? ? 它的作用是,將c盤下文件名為Test.java的文件重命名稍浆,改成hahah.java文件载碌。
? ? ? ? 將文件名改回Test.java,我們修改一下f2的盤符衅枫,改成d嫁艇。
? ? ? ? 此時(shí),c盤中存在一個(gè)Test.java文件弦撩,d盤中不存在hahah.java文件裳仆。
? ? ? ? 運(yùn)行后,我們發(fā)現(xiàn)c盤中的Test.java文件不見了孤钦,而d盤中多了一個(gè)hahah.java文件歧斟,這個(gè)hahah.java文件的內(nèi)容正是原先c盤中Test.java文件中的內(nèi)容纯丸。是不是感覺很玄幻,類似于移動(dòng)静袖。
????05-IO流(File對(duì)象功能-文件列表)
? ? ? ? 我們來看一下這個(gè)靜態(tài)方法:
? ? ? ? 它不操作具體的特有數(shù)據(jù)觉鼻,它操作的是共享數(shù)據(jù),所以不用傳對(duì)象進(jìn)去队橙。
? ? ? ? 演示一下這個(gè)方法:
? ? ? ? 它可以列出我們盤符中有效的盤符坠陈。
? ? ? ? 再看這個(gè)方法,列出目錄中的文件和目錄:
? ? ? ? 示例:
? ? ? ? 但是要注意捐康,如果f封裝的是文件:
? ? ? ? 就會(huì)返回一個(gè)空指針異常:
? ? ? ? 因?yàn)閘ist方法所屬的對(duì)象f是一個(gè)文件仇矾,沒有目錄,那么它返回的數(shù)組names就是空解总,為空的話就不能被String name對(duì)象指向并遍歷贮匕。
? ? ? ? 所以記住,調(diào)用list方法的file對(duì)象必須是封裝了一個(gè)目錄花枫,該目錄還必須存在刻盐。
? ? ? ? 如果目錄不存在,運(yùn)行結(jié)果是這樣的:
????????因?yàn)樗祷財(cái)?shù)組了劳翰,但是數(shù)組長度為0敦锌。
? ? ? ? 注意為null和長度為0的不同。
? ? ? ? list方法還有一個(gè)重載的帶參數(shù)的:
? ? ? ? 我們可以使用它佳簸,比如要求返回這個(gè)目錄中所有的.java文件乙墙,其他都不要,這樣就起到了過濾的作用生均。
????06-IO流(File對(duì)象功能-文件列表2)
? ? ? ? 接下來說說這個(gè)帶過濾器的list方法听想,我們點(diǎn)進(jìn)FilenameFilter中看一看:
? ? ? ? 它里面只有一個(gè)方法,accept:
? ? ? ? 先要搞一個(gè)類把FilenameFilter接口實(shí)現(xiàn)一下疯特。
????????因?yàn)閘ist方法中的參數(shù)是FilenameFilter接口類型哗魂,而且接口中就一個(gè)方法,我們可以傳一個(gè)匿名類漓雅。
? ? ? ? 代碼示例:??
? ? ? ? 我們發(fā)現(xiàn)還有一個(gè)listFiles過濾器:
? ? ? ? 它和list方法有什么不同呢录别?
? ? ? ? list方法返回的只有當(dāng)前目錄下的文件和文件夾的名稱,而listFiles往回返的是當(dāng)前目錄下的文件和文件夾的對(duì)象邻吞。
? ? ? ? 代碼示例:?
????07-IO流(列出目錄下所有內(nèi)容-遞歸)
? ? ? ? 我們現(xiàn)在有了進(jìn)一步的想法组题,不只想獲得指定目錄下的文件和文件夾,我們還想獲得當(dāng)前目錄的子目錄下的文件和文件夾抱冷,也就是說崔列,想列出指定目錄下的所有內(nèi)容。
? ? ? ? 我們一步步來,先打印指定目錄下的文件和文件夾:
? ? ? ? 接下來我們想要將制定目錄下的子目錄中的文件和文件夾也打印出來赵讯,這個(gè)時(shí)候是不是要判斷一下files[x]到底是不是文件夾呀盈咳?如果是文件夾,就把這個(gè)文件夾也傳進(jìn)showDir方法中边翼,獲取它里面的內(nèi)容:
? ? ? ? 好鱼响,現(xiàn)在子目錄中的內(nèi)容也打印出來了:
? ? ? ? 但是我們發(fā)現(xiàn)只打印了文件沒有打印目錄,很簡單组底,加上這句就好了:
? ? ? ? 總結(jié)一下丈积,因?yàn)槟夸浿羞€有目錄,只要使用同一個(gè)列出目錄功能的函數(shù)完成即可债鸡。在列出過程中出現(xiàn)的還是目錄的話江滨,還可以再次調(diào)用本功能。也就是函數(shù)自身調(diào)用自身厌均,這種表現(xiàn)形式唬滑,或者編程手法,稱為遞歸莫秆。
? ? ? ? 遞歸要注意:
? ? ? ? 1间雀,限定條件悔详。有限定條件遞歸才會(huì)有終止的時(shí)候镊屎,沒有限定條件遞歸會(huì)陷入無盡的循環(huán)。
? ? ? ? 2茄螃,遞歸次數(shù)缝驳。盡量避免內(nèi)存溢出。
????08-IO流(列出目錄下所有內(nèi)容-帶層次)
? ? ? ? 之前打印的有點(diǎn)亂归苍,我們想將打印的內(nèi)容帶層次的展示出來用狱。
? ? ? ? 我們采用加空格的方法:
? ? ? ? 給原先的代碼中加入getLevel調(diào)用:
????????效果大概這樣:
? ? ? ? 哈哈,就是玩一下格式拼弃,了解一下就好夏伊。
????09-IO流(刪除帶內(nèi)容的目錄)
? ? ? ? 怎么刪除帶內(nèi)容的目錄呢?
? ? ? ? 我們先弄清楚刪除的原理:
? ? ? ? 在Windows中吻氧,刪除目錄時(shí)從里面往外刪除的溺忧。
? ? ? ? 既然從里面往外刪除,就需要用到遞歸盯孙。
? ? ? ? 示例:
????10-IO流(創(chuàng)建java文件列表)
? ? ? ? 做一個(gè)練習(xí):將一個(gè)指定目錄下的Java文件的絕對(duì)路徑鲁森,存儲(chǔ)到一個(gè)文本文件中,建立一個(gè)Java文件列表文件振惰。
? ? ? ? 思路:
? ? ? ? 1歌溉,對(duì)指定的目錄進(jìn)行遞歸。
? ? ? ? 2骑晶,獲取遞歸過程中所有的Java文件的路徑痛垛。
? ? ? ? 3草慧,將這些路徑存儲(chǔ)到集合中。
? ? ? ? 4匙头,將集合中的數(shù)據(jù)寫入到一個(gè)文件中冠蒋。
? ? ? ? 代碼示例:?
? ? ? ? 我們可以看到list集合中存入了220個(gè)文件,接下來我們要將這些文件寫到文件中去乾胶,接下來我們寫一個(gè)writeToFile方法:
? ? ? ? 再給主函數(shù)中加上這兩句:
? ? ? ? 保存進(jìn)去啦: