![java基礎(chǔ)梳理文件過濾器_第1頁](http://file4.renrendoc.com/view/28b1c9077afcfc82514b7f761ca10283/28b1c9077afcfc82514b7f761ca102831.gif)
![java基礎(chǔ)梳理文件過濾器_第2頁](http://file4.renrendoc.com/view/28b1c9077afcfc82514b7f761ca10283/28b1c9077afcfc82514b7f761ca102832.gif)
![java基礎(chǔ)梳理文件過濾器_第3頁](http://file4.renrendoc.com/view/28b1c9077afcfc82514b7f761ca10283/28b1c9077afcfc82514b7f761ca102833.gif)
![java基礎(chǔ)梳理文件過濾器_第4頁](http://file4.renrendoc.com/view/28b1c9077afcfc82514b7f761ca10283/28b1c9077afcfc82514b7f761ca102834.gif)
![java基礎(chǔ)梳理文件過濾器_第5頁](http://file4.renrendoc.com/view/28b1c9077afcfc82514b7f761ca10283/28b1c9077afcfc82514b7f761ca102835.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第19天 File類今日任務(wù)IO介紹File類(掌握)文件過濾器(掌握)遞歸技術(shù)(理解)課堂筆記IO介紹簡單回顧之前所學(xué)的知識(shí):字符串String:操作文本數(shù)據(jù)的;字符串緩沖區(qū):容器,可以存儲(chǔ)很多的任意類型的數(shù)據(jù),最后都變成字符串;基本數(shù)據(jù)類型包裝類:解決了字符串和基本數(shù)據(jù)類型之間的轉(zhuǎn)換,同時(shí)給基本數(shù)據(jù)類型提供更多的操作;集合框架:對(duì)象多了,便于存儲(chǔ)后操作;Date ,DateFormat,SimpleDateFormat、Calendar:解決日期和時(shí)間的問題;在前期的學(xué)習(xí)上述知識(shí)點(diǎn)的過程中,我們書寫的任何程序,它運(yùn)行的時(shí)候都會(huì)有數(shù)據(jù)的產(chǎn)生,比如時(shí)間數(shù)據(jù),而這些數(shù)據(jù)最終都保存在內(nèi)存中。程序運(yùn)
2、行結(jié)束之后,數(shù)據(jù)就沒有了。當(dāng)程序下次啟動(dòng)的時(shí)候,如果還需要使用上次的結(jié)果,這時(shí)程序中是沒有的。而在開發(fā)中,在我們真正書寫的程序中,往往有一些數(shù)據(jù)是需要長久保存起來的,當(dāng)程序中需要這些長久保存起來的數(shù)據(jù)的時(shí)候,再從其他的地方讀取到程序中。也就是說我們以前學(xué)習(xí)的數(shù)據(jù)都是存儲(chǔ)到內(nèi)存中,而內(nèi)存中只能暫時(shí)存儲(chǔ)數(shù)據(jù),當(dāng)電腦關(guān)閉之后,數(shù)據(jù)就不見了。如果在開發(fā)中需要大量數(shù)據(jù)被長久保存,下次開電腦這些數(shù)據(jù)仍然還在,那么我們肯定不能保存到內(nèi)存中,我們需要保存在能夠保存持久數(shù)據(jù)的地方或者叫持久設(shè)備。那么問題來了:什么是持久設(shè)備呢?1.1什么是持久設(shè)備持久設(shè)備:可以持久保存數(shù)據(jù)的設(shè)備。硬盤、U盤、光盤、網(wǎng)盤、軟盤等。
3、這些設(shè)備都可以長久的保存數(shù)據(jù)。那么還有一個(gè)問題:如何把程序中的數(shù)據(jù)保存到持久設(shè)備中?Java提供了一個(gè)技術(shù),專門來實(shí)現(xiàn)數(shù)據(jù)與持久設(shè)備間的交互:IO技術(shù)。通過IO技術(shù)就可以達(dá)到程序和其他設(shè)備之間的數(shù)據(jù)交互。1.2什么是IO技術(shù)IO技術(shù):它主要的功能就是把我們程序中的數(shù)據(jù)可以保存到程序以外的其他持久設(shè)備中(如:我們電腦的硬盤),或者從其他持久設(shè)備中(如:我們電腦的硬盤)進(jìn)行讀取數(shù)據(jù),把數(shù)據(jù)讀取到我們的Java程序中。IO:I:Input:輸入或者讀取,從持久設(shè)備(硬盤)的數(shù)據(jù)放到內(nèi)存中;O:Output:輸出或者寫出,從內(nèi)存中的數(shù)據(jù)放到持久設(shè)備(硬盤)上;也可以按照如下理解:把從持久設(shè)備(硬盤)上
4、讀取(輸入)到內(nèi)存中的動(dòng)作,稱為讀操作。 I:input。把內(nèi)存中的數(shù)據(jù)輸出(寫出)到持久設(shè)備(硬盤)的動(dòng)作,稱為寫操作。O:output。讀寫操作圖解如下所示:說明:1)我們的程序運(yùn)行在內(nèi)存中,因此我們的輸入和寫出都是相對(duì)內(nèi)存而言; 2)Java程序必須運(yùn)行在Java虛擬機(jī)上,Java程序最終需要JVM來執(zhí)行; 3)JVM屬于應(yīng)用軟件需要安裝在操作系統(tǒng)軟件上,所以JVM虛擬機(jī)是運(yùn)行在操作系統(tǒng)之上的,然后由操作系統(tǒng)和計(jì)算機(jī)硬件進(jìn)行交互;2、File類2.1、File類介紹數(shù)據(jù)最終保存在硬盤上,在硬盤上是以1和0 保存的。而給我們展示出來的并不是二進(jìn)制數(shù)據(jù),而是一個(gè)一個(gè)的文件,換句話說數(shù)據(jù)最終都
5、保存在這些文件中。而這些文件又被文件夾管理。 通過上述描述我們發(fā)現(xiàn)在計(jì)算機(jī)硬盤中就存在兩種事物:文件和文件夾事物。而在Java中使用class類來描述生活中存在的事物,那么Java中是如何描述文件和文件夾這兩類事物呢?使用File類來描述文件和文件夾事物。說明:1)Java中的定義的io技術(shù)的類基本都在java.io包下; 2)使用File類來描述文件和文件夾事物的; 3)File類它主要是對(duì)持久設(shè)備上的文件和文件夾進(jìn)行操作。它不能去操作文件中的數(shù)據(jù)。將來我們只要需要操作持久設(shè)備上的文件或文件夾直接找File類完成,如果要操作文件中的數(shù)據(jù)只能找后面學(xué)習(xí)的IO技術(shù)搞定;結(jié)論:File類就是描述文
6、件或文件夾的,只要我們?cè)贘ava中要操作文件或文件夾,就找File類。2.2、File類構(gòu)造方法1)public File(String pathname) 表示根據(jù)文件或文件夾的路徑名創(chuàng)建一個(gè)File對(duì)象。使用File類的構(gòu)造函數(shù)可以把指定的字符串封裝成File類的對(duì)象,但是這個(gè)字符串表示的路徑或者文件到底是否存在,F(xiàn)ile類是不進(jìn)行判斷的。注意:File類表示文件和目錄路徑名的抽象表示形式。那么該路徑代表的文件或文件夾不一定存在。需求:創(chuàng)建一個(gè)File類的對(duì)象,表示:D:abc1.txt2)public File(String parent,String child) 根據(jù)父目錄的路徑名和
7、兒子的名稱創(chuàng)建一個(gè)File對(duì)象。 需求:創(chuàng)建一個(gè)File類的對(duì)象,表示:D:abc1.txtpublic File(File parent,String child) 根據(jù)父目錄的File對(duì)象和兒子的名稱創(chuàng)建一個(gè)File對(duì)象。就是把已經(jīng)存在的File對(duì)象和某個(gè)子目錄合并成一個(gè)新的File對(duì)象。分析和步驟:A:創(chuàng)建一個(gè)File類的對(duì)象parent,D:abc作為參數(shù);B:定義一個(gè)字符串child=1.txt;C:使用上述構(gòu)造函數(shù)在重新創(chuàng)建一個(gè)File類的對(duì)象file,并輸出打??;2.3、獲取方法File類是描述文件和文件夾的。使用File類的對(duì)象就可以獲取當(dāng)前File類描述的那個(gè)文件或文件夾的信
8、息(信息包括文件或者文件夾的名稱、大小、類型、日期等)。案例:File類中的獲取方法。A:getAbsolutePath() 獲取的當(dāng)前調(diào)用這個(gè)方法的File對(duì)象的全路徑(絕對(duì)路徑或者真實(shí)路徑) 返回的是路徑的字符串;B:getAbsoluteFile()獲取的當(dāng)前調(diào)用這個(gè)方法的File對(duì)象的全路徑(絕對(duì)路徑或者真實(shí)路徑) 返回的是路徑封裝成的新的File;說明:在操作文件時(shí),需要指定文件的路徑,而路徑在程序中有兩種表現(xiàn)形式:絕對(duì)路徑:是從盤符開始的路徑,帶有根目錄的路徑 例: D:abctestDemo.java D就是根目錄。相對(duì)路徑:是從當(dāng)前路徑開始的路徑,或者可以理解不帶根目錄的路徑
9、例: 當(dāng)前路徑為D:abc,要描述相對(duì)路徑,只需輸入testDemo.java實(shí)際上,嚴(yán)格的 HYPERLINK /s?wd=%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84&tn=44039180_cpr&fenlei=mv6quAkxTZn0IZRqIHckPjm4nH00T1YvPW6duyDYnjuWm16krj-b0ZwV5Hcvrjm3rH6sPfKWUMw85HfYnjn4nH6sgvPsT6KdThsqpZwYTjCEQLGCpyw9Uz4Bmy-bIi4WUvYETgN-TLwGUv3EPHfvnWD3PWR t /question/_blank 相對(duì)
10、路徑寫法應(yīng)為: .testDemo.java其中,. 表示當(dāng)前路徑。 C:getName() 獲取的是File類的對(duì)象中封裝的文件或目錄的最后一級(jí)名稱; D:getParentFile() 獲取到的是File類的對(duì)象的父目錄,把父目錄封裝成一個(gè)新的File對(duì)象; E:getParent() 獲取到File類的對(duì)象的父目錄,把返回目錄的字符串表示形式; F:getPath() 獲取到當(dāng)前File類的對(duì)象中封裝的內(nèi)容; G:getFreeSpace() 獲取某個(gè)盤的剩余空間; H:getTotalSpace() 獲取某個(gè)盤的總空間; I:public static HYPERLINK mk:MSI
11、TStore:F:itcast開發(fā)資料基礎(chǔ)班APIJDK_API_1_6_zh_CN.CHM:/java/io/././java/io/File.html o java.io 中的類 File listRoots() 獲取系統(tǒng)的所有根目錄,例如:C盤、D盤、E盤、F盤; 說明:由于該函數(shù)是靜態(tài)的,直接使用類名調(diào)用即可。獲取函數(shù)代碼演示如下所示:package cn.itcast.sh.file.constructor.demo;import java.io.File;import java.text.SimpleDateFormat;import java.util.Date;/* * Fil
12、e類中的獲取方法演示 * 絕對(duì)路徑:帶根路徑 * 相對(duì)路徑:不帶根路徑 testhaha表示相對(duì)路徑,這里表示相對(duì)于項(xiàng)目day19a來說 */public class FileGetFunctionDemo public static void main(String args) / 創(chuàng)建File類的對(duì)象File file=new File(D:test123.txt);/getAbsolutePath()獲取絕對(duì)路徑演示 返回的是路徑的字符串 D:test123.txt /如果File file=new File(); 參數(shù)不指定路徑,則輸出當(dāng)前項(xiàng)目的路徑F:newEclipseWorksp
13、acebeikeday19aString absolutePath = file.getAbsolutePath();System.out.println(absolutePath=+absolutePath);/getAbsoluteFile()獲取絕對(duì)路徑演示 返回的是路徑新封裝的File類的對(duì)象 D:test123.txt /如果File file=new File(); 參數(shù)不指定路徑,則輸出當(dāng)前項(xiàng)目的路徑F:newEclipseWorkspacebeikeday19aFile absoluteFile = file.getAbsoluteFile();System.out.print
14、ln(absoluteFile=+absoluteFile);/getName()函數(shù) 獲取的是封裝在File類中的文件或者文件夾的最后一級(jí)名稱 123.txtSystem.out.println(getName()=+file.getName();/getParentFile()函數(shù)演示 獲得File類中的文件或者文件夾的路徑的父目錄 封裝在在一個(gè)File類中D:testSystem.out.println(getParentFile()=+file.getParentFile();/getParent()函數(shù)演示 獲得File類中的文件或者文件夾的路徑的父目錄 封裝在String類中 D:
15、testSystem.out.println(getParent()=+file.getParent();/getPath()表示獲得File類中封裝的所有內(nèi)容 D:test123.txt /如果File file=new File(); 參數(shù)不指定路徑,則輸出”空字符串System.out.println(getPath()=+file.getPath();/getFreeSpace() 函數(shù) /如果File file=new File(D:); D盤剩余空間是:366774648832System.out.println(剩余空間是+file.getFreeSpace();/getTota
16、lSpace() 函數(shù) /如果File file=new File(D:); D盤總空間是:371056439296System.out.println(總空間是+file.getTotalSpace();System.out.println(-);/調(diào)用listRoots()函數(shù)獲取系統(tǒng)的根目錄 由于該函數(shù)是靜態(tài)的,直接使用類名調(diào)用即可 / 輸出結(jié)果C: D: E: F: G: H: File dirs = File.listRoots();for (File dir : dirs) System.out.print(dir+” ”); J:public long lastModified(
17、) 獲取上一次修改的時(shí)間,返回的是毫秒值;演示lastModified函數(shù):分析和步驟:創(chuàng)建File類的對(duì)象file2,D:test123.txt作為構(gòu)造函數(shù)的參數(shù);使用對(duì)象file2調(diào)用lastModified()函數(shù)獲得上次更改D盤下的1.txt文件的時(shí)間time;使用Date()構(gòu)造函數(shù)將time轉(zhuǎn)換成Date時(shí)間類的對(duì)象d;創(chuàng)建SimpleDateFormat類的對(duì)象sdf,時(shí)間格式是:yyyy-MM-dd HH:mm:ss;使用格式化解析器對(duì)象sdf調(diào)用format函數(shù)將日期時(shí)間對(duì)象d轉(zhuǎn)換為字符串sTime,并輸出;獲取函數(shù)代碼演示如下所示:2.4、創(chuàng)建方法由于File類既可以表示文
18、件,也可以表示文件夾(目錄)。Java針對(duì)File類的創(chuàng)建方法給出2類,一類是創(chuàng)建文件的方法,一類是創(chuàng)建文件夾的方法。1、創(chuàng)建文件可以創(chuàng)建一個(gè)文件,返回的boolean值表示文件是否創(chuàng)建成功。true :表示創(chuàng)建文件成功; false :表示創(chuàng)建文件失敗,失敗原因基本是因?yàn)楫?dāng)前的目錄有了相同的文件;需求:創(chuàng)建:D:abc1.txt文件。在D盤的abc文件夾下新創(chuàng)建一個(gè)1.txt文件。分析和步驟:創(chuàng)建File類的對(duì)象file,指定目錄和文件名;使用file對(duì)象調(diào)用createNewFile()函數(shù)創(chuàng)建文件,并打印返回值;說明:createNewFile()函數(shù)表示 把封裝的File類的對(duì)象創(chuàng)建成
19、一個(gè)文件,如果指定的路徑?jīng)]有創(chuàng)建的文件,則會(huì)創(chuàng)建文件,返回值是true,創(chuàng)建成功;如果同名的文件已經(jīng)存在,則不會(huì)再創(chuàng)建文件,返回false,創(chuàng)建失??;如果指定的路徑不存在,這時(shí)就會(huì)拋異常 Java.io.IOException:系統(tǒng)找不到指定的路徑。這時(shí)是不會(huì)去創(chuàng)建文件的; 2)只要使用createNewFile()函數(shù)創(chuàng)建出來的一定是文件,不管有沒有擴(kuò)展名。如果指定的文件沒有擴(kuò)展名,那么也會(huì)創(chuàng)建沒有擴(kuò)展名的文件;補(bǔ)充:在計(jì)算機(jī)中,一個(gè)文件是可以沒有擴(kuò)展名的。 3)創(chuàng)建File類的對(duì)象時(shí),如果找不到創(chuàng)建文件的路徑就會(huì)報(bào)上述異常:Java.io.IOException;2、創(chuàng)建文件夾mkdir(
20、) 函數(shù)表示創(chuàng)建單級(jí)目錄。如果創(chuàng)建文件夾中存在要?jiǎng)?chuàng)建的文件夾,則返回false,創(chuàng)建失敗, 如果創(chuàng)建超過一個(gè)目錄,也會(huì)返回false。前提是這個(gè)多級(jí)目錄在計(jì)算機(jī)上都沒有存在。如果是多級(jí)目錄,但是多級(jí)目錄除了最后一個(gè)目錄,前面目錄都存在,那么也會(huì)返回true,創(chuàng)建成功。 mkdirs() 函數(shù)表示一次創(chuàng)建多級(jí)目錄。創(chuàng)建單級(jí)目錄也可以,如果創(chuàng)建文件夾中存在此文件夾, 則返回false,創(chuàng)建失敗。需求:創(chuàng)建一個(gè)多目錄文件夾D:aaabbbccc分析和步驟:1)創(chuàng)建File類的對(duì)象file,指定創(chuàng)建的目錄;2)使用file對(duì)象分別調(diào)用mkdir() 和mkdirs() 函數(shù)創(chuàng)建文件夾,并打印返回值;需
21、求:使用mkdirs()函數(shù)創(chuàng)建一個(gè)D:abc1.jpg 的文件夾。注意: 1):創(chuàng)建文件或文件夾時(shí),一定要調(diào)用正確的方法。 騎著白馬的不一定是王子,也有可能是唐僧; 長著翅膀的不一定是天使,也有可能是鳥人; 名字叫.jpg的不一定是文件,也有可能是文件夾;舉例:new File(“D:abc1.jpg”);A:如果使用File類的對(duì)象創(chuàng)建文件夾,那么在硬盤上就會(huì)生成一個(gè)文件夾。名字為1.jpg.而此時(shí)如果在使用createNewFile()在創(chuàng)建1.jpg文件,也不會(huì)創(chuàng)建成功;B:注意啦 如果創(chuàng)建文件夾的時(shí)候,當(dāng)前目錄中存在一個(gè)文件的全名(文件名+后綴名)和要?jiǎng)?chuàng)建文件夾同名,那么也不會(huì)創(chuàng)建該
22、文件夾;舉例:比如我要?jiǎng)?chuàng)建:結(jié)果在D:abc文件夾下面有一個(gè)文件的名字叫做:。此時(shí)不會(huì)創(chuàng)建成功。 2):絕對(duì)路徑和相對(duì)路徑創(chuàng)建文件或者文件夾的問題。 絕對(duì)路徑:有根目錄的路徑 相對(duì)路徑:沒有根目錄的路徑 我們創(chuàng)建一個(gè)文件或文件夾時(shí),如果使用了相對(duì)路徑,會(huì)在項(xiàng)目目錄下創(chuàng)建。2.5、刪除方法boolean delete() 刪除File類對(duì)象中的文件或文件夾。 注意: 1)delete()函數(shù)的刪除不走回收站。謹(jǐn)慎使用。 2)delete()函數(shù)可以刪除文件或者文件夾,但是刪除文件夾的時(shí)候,要求文件夾一定是空的。也就是說如果一個(gè)文件夾中有兒子,那么不能直接刪除該文件夾。2.6、判斷方法File類既
23、可以描述文件,也可以描述文件夾。那么File類中就給出了判斷當(dāng)前File對(duì)象封裝的對(duì)象到底是文件還是文件夾。public boolean isDirectory() 是否是文件夾 如果是文件夾 返回 true 否則返回false;public boolean isFile() 是否是文件 如果是文件 返回 true , 否則返回false;public boolean isHidden() 是否隱藏 如果是隱藏文件或者文件夾 返回 true , 否則返回false;public boolean exists() 是否存在 如果File類對(duì)象中的文件或者文件夾在硬盤上存在 返回 true ,否則
24、返回false;代碼演示如下所示:2.7、列舉方法有時(shí)我們需要獲取指定目錄下的文件或文件夾。所以我們可以采用以下方法來獲取。list()它是獲取指定目錄(文件夾)下的所有文件或文件夾,把這些文件或文件夾的名字保存在返回的字符串?dāng)?shù)組中??梢岳斫鉃楂@取當(dāng)前目錄下的所有兒子的名稱的數(shù)組。需求:掃描D:test下的所有子文件和子文件夾,并且打印子文件或者子文件夾名。分析和步驟: 1):創(chuàng)建父目錄D:test的File對(duì)象dir; 2):使用dir對(duì)象調(diào)用list()函數(shù)獲取所有兒子的數(shù)組,數(shù)組名叫做dirs; 3):使用foreach循環(huán)遍歷dirs,打印數(shù)組中存放的文件或者文件夾名;/需求:掃描D:
25、test下的所有子文件和子文件夾,并且打印子文件或者子文件夾名。public static void method_1() / 創(chuàng)建File類的對(duì)象File file = new File(D:test);/使用file對(duì)象調(diào)用list()函數(shù)所有的兒子文件或者文件夾String dirs = file.list();/循環(huán)遍歷數(shù)組for (String dir : dirs) System.out.println(dir);上述函數(shù)雖然可以獲得文件或者文件夾名字,但是都變成字符串了,在開發(fā)中用處不是太大,我們更希望獲得的是文件或者文件夾的對(duì)象,這樣操作會(huì)更廣泛。listFiles()它也是獲
26、取指定目錄下的文件和文件夾,但把這些文件和文件夾的名字重新封裝成一個(gè)一個(gè)獨(dú)立的File對(duì)象,把這些File對(duì)象保存在File數(shù)組中,最后返回這個(gè)File數(shù)組。也可以理解為獲取當(dāng)前目錄下的所有兒子File對(duì)象的數(shù)組。需求:掃描D:test下的所有子文件和子文件夾,打印出哪些是文件夾哪些是文件。分析和步驟:1):創(chuàng)建父目錄D:test的File對(duì)象dir; 2):使用dir對(duì)象調(diào)用listFiles()函數(shù)獲取所有兒子的對(duì)象數(shù)組,數(shù)組名叫做files;:使用foreach循環(huán)遍歷files,獲取每個(gè)文件或者文件夾的對(duì)象file;4):使用file對(duì)象調(diào)用isDirectory()判斷此時(shí)file對(duì)
27、象是否是文件夾,如果是,則打印文件夾,否則說明是文件,打印文件;/需求:掃描D:test下的所有子文件和子文件夾,打印出哪些是文件夾哪些是文件。public static void method_2() / 創(chuàng)建File類的對(duì)象File file = new File(D:test);/根據(jù)file對(duì)象調(diào)用listFiles()函數(shù)獲得上述文件夾中的所有兒子文件和文件夾File dirs = file.listFiles();/遍歷數(shù)組獲得File類的對(duì)象for (File dir : dirs) /* * 如果想輸出哪些是文件夾哪些是文件,由于File類中要么是文件要么是文件夾 * 所以我們
28、可以先獲得文件夾,然后打印,則另一個(gè)就是文件 * dir.isDirectory() 如果為true,說明是文件夾 * dir.getName()表示獲得文件或者文件夾的名字 */if(dir.isDirectory()/說明是文件夾System.out.println(dir.getName()+是文件夾);else/說明是文件System.out.println(dir.getName()+是文件);說明:如果想輸出哪些是文件夾哪些是文件,由于File類中要么是文件要么是文件夾。所以我們可以先獲得文件夾,然后打印,則另一個(gè)就是文件。dir.isDirectory() 如果為true,說明是
29、文件夾;dir.getName() 表示獲得文件或者文件夾的名字;3、文件過濾器(難)3.1、文件過濾器介紹過濾器:它就是把不需要的過濾出去,留下需要的內(nèi)容。文件或文件夾過濾器:過濾掉不需要的文件或文件夾,留下需要的文件或文件夾。有種需求可以考慮使用過濾器:假設(shè)在一個(gè)父目錄文件夾下有成千上萬個(gè)文件或者文件夾,而后綴名為.jpg的文件只有幾個(gè),我想把后綴名為.jpg的文件找出來,其實(shí)使用我們剛才講解的list()和listFiles()函數(shù)可以解決,但是比較麻煩,主要是麻煩在某個(gè)類中或者某個(gè)項(xiàng)目中寫完之后想要在其他項(xiàng)目使用,還得書寫,也就是可移植性不是太好,那么我們是否可以想出一個(gè)可移植性好的辦
30、法呢,寫完一次,其他地方可以再用,提高效率簡化代碼開發(fā)。答案是可以的,過濾器就可以實(shí)現(xiàn)。3.2、FilenameFilter接口(文件名過濾器)accept:方法是用來書寫具體過濾的條件的。dir參數(shù):是當(dāng)前name所表示的文件或文件夾所在的父目錄。name參數(shù):是需要過濾的那個(gè)文件夾的名字或者文件的整體名字(包括文件的后綴名,例如123.java 或者mm.jpg)。舉例:想過濾 D:test123.java 下面的123.Java文件,如果想使用這個(gè)accept(dir,name)函數(shù),那么dir 表示D:test,而name表示123.java。注意:這個(gè)接口沒有實(shí)現(xiàn)類,如果我們想使用這
31、個(gè)接口中的函數(shù),我們需要自己定義實(shí)現(xiàn)類并復(fù)寫accept()函數(shù)。File類中的函數(shù):public String list(FilenameFilter filter) 返回符合過濾器中條件的兒子的名稱的字符串?dāng)?shù)組public File listFiles(FilenameFilter filter) 返回符合過濾器中條件的兒子的File對(duì)象數(shù)組需求:判斷D:test下是否有.jpg文件,如果有,則打印其絕對(duì)路徑。分析和步驟:創(chuàng)建測試類FilenameFilterDemo;在FilenameFilterDemo類中main函數(shù)中創(chuàng)建父目錄File類的對(duì)象parent,D:test作為函數(shù)的參數(shù)
32、;使用對(duì)象parent調(diào)用list()函數(shù)獲取所有符合條件的兒子的名稱數(shù)組names,自定義過濾器類的對(duì)象new MyFilenameFilter()作為參數(shù);循環(huán)遍歷數(shù)組names,獲取每個(gè)兒子;創(chuàng)建File類的對(duì)象重新封裝兒子的對(duì)象file;使用file對(duì)象調(diào)用getAbsolutePath()函數(shù)獲得D:test文件夾下含有文件.jpg的絕對(duì)路徑,輸出并打?。?)上述方案也可以換另一種方式實(shí)現(xiàn),父目錄對(duì)象可以調(diào)用listFiles()函數(shù)來獲得符合過濾器中條件的兒子的File對(duì)象數(shù)組;使用public String list(FilenameFilter filter) 函數(shù)方式來實(shí)現(xiàn)過
33、濾功能。測試類代碼如下:package cn.itcast.sh.file.filter.demo;import java.io.File;/* * FilenameFilter過濾器的演示 * 需求:判斷D:test下是否有.jpg文件,如果有,則打印其絕對(duì)路徑。 */public class FileNameFilterDemo public static void main(String args) method_1();/public String list(FilenameFilter filter) 返回符合過濾器中條件的兒子的名稱的字符串?dāng)?shù)組public static void
34、method_1() / 創(chuàng)建File類的對(duì)象File file = new File(D:test);/* * 使用file對(duì)象調(diào)用list(FilenameFilter filter) 函數(shù)來篩選D:test * 目錄下兒子文件后綴名是.jpg */獲得符合條件的兒子的名字的數(shù)組String names = file.list(new MyFilenameFilter();/遍歷數(shù)組for (String name : names) /* * 這里的name就是表示D:test目錄下符合條件的兒子的名字 * 也就是說name在這里就是所有后綴名為.jpg的文件名字 * 如D:test目錄下
35、的1.jpg文件 * 由于題目需求是想獲得兒子文件的絕對(duì)路徑 * 想獲得絕對(duì)路徑必須得調(diào)用File類中的getAbsolutePath()函數(shù) * 而這個(gè)函數(shù)是非靜態(tài)函數(shù)得通過File的對(duì)象調(diào)用 * 所以接下來我們要獲得File類的對(duì)象 */使用File類的構(gòu)造函數(shù)封裝兒子的對(duì)象 file2代表后綴名是.jpg的文件的對(duì)象File file2 = new File(file,name);System.out.println(file2.getAbsolutePath();過濾器類代碼實(shí)現(xiàn):說明:對(duì)FilenameFilter接口中的accept函數(shù)進(jìn)行進(jìn)一步說明:這個(gè)方法中定義過濾條件,當(dāng)我們
36、調(diào)用list或者listFiles方法的時(shí)候,會(huì)把每個(gè)兒子都拿來調(diào)用accept方法: 如果這個(gè)方法返回true,那么這個(gè)兒子會(huì)被添加到最終的數(shù)組中; 如果這個(gè)方法返回false,那么這個(gè)兒子就不會(huì)被添加到最終的數(shù)組;創(chuàng)建一個(gè)過濾器類MyFilenameFilter 并實(shí)現(xiàn)FilenameFilter接口,然后復(fù)寫接口中的accept()函數(shù);在accept函數(shù)定義過濾條件來判斷每個(gè)兒子是否符合要求,符合就返回true,否則返回false;創(chuàng)建File類的對(duì)象封裝兒子的對(duì)象file;定義一個(gè)boolean類型的變量flag來接收name的后綴名是否是.jpg,并且必須是文件的布爾值;返回fla
37、g的值;package cn.itcast.sh.file.filter.demo;import java.io.File;import java.io.FilenameFilter;/* * 過濾名字的過濾器 */public class MyFilenameFilter implements FilenameFilterpublic boolean accept(File dir, String name) /* * 我們需要在這里書寫過濾條件,判斷兒子是否符合條件 * 符合,則返回true * 不符合,則返回false * dir表示父目錄 * name 表示兒子(文件或者文件夾)的名字
38、 例如 1.jpg */輸出dir 和 name /System.out.println(dir+-+name);/* * 這里的兒子名字name都是String類型,而我們又想獲取name的后綴名是.jpg * 所以也就是說我們需要判斷字符串name的后面是否是.jpg, * 如果是就返回true,存儲(chǔ)到數(shù)組中,否則不存儲(chǔ) */判斷name的后綴名是否是.jpgboolean boo = name.endsWith(.jpg);/* * 還得判斷兒子是否是文件 但是這里的name是字符串不能調(diào)用isFile()函數(shù) * 所以只能將兒子的名字name封裝成File類的對(duì)象 */File fil
39、e = new File(dir,name);/判斷兒子是否是文件 true 是文件 false不是文件boolean boo2 = file.isFile();return boo & boo2;使用public File listFiles(FilenameFilter filter) 函數(shù)方式來實(shí)現(xiàn)過濾功能。測試類代碼如下:/public File listFiles(FilenameFilter filter) 返回符合過濾器中條件的兒子的File對(duì)象數(shù)組public static void method_2() / 創(chuàng)建File類的對(duì)象File file = new File(D:t
40、est);/* * 使用file對(duì)象調(diào)用list(FilenameFilter filter) 函數(shù)來篩選D:test * 目錄下兒子文件后綴名是.jpg */獲得符合條件的兒子的名字的數(shù)組File files = file.listFiles(new MyFilenameFilter();/遍歷數(shù)組for (File file2 : files) /* * 這里的file2就是表示D:test目錄下符合條件的兒子的對(duì)象 * 也就是說file2在這里就是所有后綴名為.jpg的文件的對(duì)象 * 如D:test目錄下的1.jpg文件 * 由于題目需求是想獲得兒子文件的絕對(duì)路徑 * 想獲得絕對(duì)路徑必須
41、得調(diào)用File類中的getAbsolutePath()函數(shù) * 而這個(gè)函數(shù)是非靜態(tài)函數(shù)得通過File的對(duì)象調(diào)用 * 所以這里直接使用file2調(diào)用即可 */System.out.println(file2.getAbsolutePath();過濾器源碼實(shí)現(xiàn)來說明FilenameFilter過濾器中accept()函數(shù)執(zhí)行的時(shí)間:說明:FilenameFilter:過濾器僅僅只能根據(jù)accept方法中name中包括的字符內(nèi)容過濾當(dāng)前的文件或文件夾。而不能直接去判斷當(dāng)前以name表示的那個(gè)字符串到底是文件還是文件夾,只能間接的重新封裝name對(duì)象,然后根據(jù)封裝后的對(duì)象調(diào)用isFile()函數(shù)判斷是
42、否是文件,雖然這樣可以解決問題,但是不建議開發(fā)中使用上述這種方式。Java中又給我們提供了一個(gè)比較簡單的實(shí)現(xiàn)方式就是過濾器FileFilter。3.3、FileFileter介紹FileFilter:它也是一個(gè)過濾器,專門用來過濾文件或文件夾的。File類中的函數(shù):File listFiles(FileFilter filter) 返回符合過濾器條件的所有兒子的File數(shù)組FileFilter過濾器中的accept方法中的pathname是當(dāng)前需要過濾的那個(gè)文件或文件夾對(duì)象?;蛘呖梢赃@么理解pathname:就是某個(gè)兒子的File對(duì)象。這里的File pathname參數(shù)相當(dāng)于:Filenam
43、eFilter過濾器中的自定義過濾器類MyFilenameFilter里面的代碼: File file=new File(dir,name);需求:判斷D:test下是否有.jpg文件,如果有,則打印其絕對(duì)路徑。分析和步驟:1)創(chuàng)建測試類FilenameFilterDemo1;2)在FilenameFilterDemo1類中main函數(shù)中創(chuàng)建父目錄File類的對(duì)象parent,D:test作為函數(shù)的參數(shù);3)使用對(duì)象parent調(diào)用listFiles()函數(shù)獲取所有符合條件的兒子的File數(shù)組files,自定義過濾器類的對(duì)象new MyFilenameFilter()作為參數(shù);4)循環(huán)遍歷數(shù)組
44、files,獲取每個(gè)兒子file;5)使用file對(duì)象調(diào)用getAbsolutePath()函數(shù)獲得D:test文件夾下含有文件.jpg的絕對(duì)路徑,輸出并打??;測試類代碼:package cn.itcast.sh.file.filter.demo;import java.io.File;/* * 演示文件過濾器 FileFilter * 需求:判斷D:test下是否有.jpg文件,如果有,則打印其絕對(duì)路徑。 */public class FileFilterDemo public static void main(String args) / 創(chuàng)建父目錄D:test的對(duì)象File file =
45、 new File(D:test);/* * 使用父目錄對(duì)象file調(diào)用listFiles(FileFilter filter) * 獲得符合符合過濾器條件的兒子對(duì)象 */File files = file.listFiles(new MyFileFilter();/遍歷兒子對(duì)象的數(shù)組 file2表示符合條件的兒子對(duì)象for (File file2 : files) /輸出絕對(duì)路徑System.out.println(file2.getAbsolutePath();過濾器類代碼實(shí)現(xiàn):說明:對(duì)FileFilter接口中的accept函數(shù)進(jìn)行進(jìn)一步說明:這個(gè)方法中定義過濾條件,當(dāng)我們調(diào)用listF
46、iles方法的時(shí)候,會(huì)把每個(gè)兒子都拿來調(diào)用accept方法: 如果這個(gè)方法返回true,那么這個(gè)兒子會(huì)被添加到最終的數(shù)組中 如果這個(gè)方法返回false,那么這個(gè)兒子就不會(huì)被添加到最終的數(shù)組1)創(chuàng)建一個(gè)過濾器類MyFileFilter 并實(shí)現(xiàn)FileFilter接口,然后復(fù)寫接口中的accept()函數(shù);2)在accept函數(shù)定義過濾條件來判斷每個(gè)兒子是否符合要求,符合就返回true,否則返回false;3)使用File類的對(duì)象pathname調(diào)用getName()然后調(diào)用String類中的endsWith()函數(shù)判斷文件名的后綴名是否是.jpg;4)使用File類的對(duì)象pathname函數(shù)調(diào)用
47、isFile()判斷是否是文件;5)使用return關(guān)鍵字將上述兩個(gè)布爾類型的值返回;package cn.itcast.sh.file.filter.demo;import java.io.File;import java.io.FileFilter;/* * 自定義文件過濾器 */public class MyFileFilter implements FileFilter public boolean accept(File pathname) /* * 這里的pathname表示兒子的File類的對(duì)象 * 這里的pathname就相當(dāng)于FilenameFilter過濾器中的 * new
48、 File(dir,name); */System.out.println(=+pathname);/* * 兒子對(duì)象有了,我們可以調(diào)用函數(shù)判斷兒子是否是文件 */boolean boo = pathname.isFile();/* * 接下來我們要判斷兒子屬于文件,文件的后綴名是否是.jpg * 那么我們要獲得兒子的名字 getName()函數(shù)可以實(shí)現(xiàn) */String name = pathname.getName();/判斷字符串name的后綴名是否是.jpgboolean boo2 = name.endsWith(.jpg);return boo & boo2;升級(jí)一下需求:獲取D:t
49、est下的所有任意指定類型的文件,打印絕對(duì)路徑分析:原來:我們把判斷條件寫死成.jpg,所以只能判斷掃描.jpg文件?,F(xiàn)在:我們要判斷任意類型的文件,那么就不能寫死。用戶讓我們過濾什么,我們就過濾什么。說明:對(duì)于這里的程序來說,用戶就是使用過濾器的地方,就是創(chuàng)建過濾器類對(duì)象的地方。 那么,過濾的條件需要讓用戶傳遞給過濾器。 用戶調(diào)用過濾器的時(shí)候,僅僅是創(chuàng)造了過濾器類的構(gòu)造函數(shù),所以,我們考慮用構(gòu)造函數(shù)傳遞參數(shù)。過濾器類的代碼如下所示:package cn.itcast.sh.file.filter.demo;import java.io.File;import java.io.FileFilt
50、er;/* * 自定義文件過濾器 */public class MyFileFilter implements FileFilter /定義一個(gè)成員變量 代表后綴名public String suffix;/定義構(gòu)造函數(shù) 接收調(diào)用傳遞過來的文件后綴名public MyFileFilter(String suffix)this.suffix=suffix;public boolean accept(File pathname) /* * 這里的pathname表示兒子的File類的對(duì)象 * 這里的pathname就相當(dāng)于FilenameFilter過濾器中的 * new File(dir,nam
51、e); */System.out.println(=+pathname);/* * 兒子對(duì)象有了,我們可以調(diào)用函數(shù)判斷兒子是否是文件 */boolean boo = pathname.isFile();/* * 接下來我們要判斷兒子屬于文件,文件的后綴名是否是.jpg * 那么我們要獲得兒子的名字 getName()函數(shù)可以實(shí)現(xiàn) */String name = pathname.getName();/判斷字符串name的后綴名是否是.jpg/boolean boo2 = name.endsWith(.jpg);/判斷字符串name的后綴名是否是suffix 這里的suffix由調(diào)用者決定boo
52、lean boo2 = name.endsWith(suffix);return boo & boo2;測試類的代碼如下所示:package cn.itcast.sh.file.filter.demo;import java.io.File;/* * 演示文件過濾器 FileFilter * 需求:判斷D:test下是否有.jpg文件,如果有,則打印其絕對(duì)路徑。 */public class FileFilterDemo public static void main(String args) / 創(chuàng)建父目錄D:test的對(duì)象File file = new File(D:test);/* *
53、使用父目錄對(duì)象file調(diào)用listFiles(FileFilter filter) * 獲得符合過濾器條件的兒子對(duì)象 * 想要的文件類型由調(diào)用者決定 .txt */File files = file.listFiles(new MyFileFilter(.txt);/遍歷兒子對(duì)象的數(shù)組 file2表示符合條件的兒子對(duì)象for (File file2 : files) /輸出絕對(duì)路徑System.out.println(file2.getAbsolutePath();上述兩個(gè)過濾器類的圖解說明如下所示:遞歸技術(shù)需求:掃描D:test所有子文件及子子文件下的.jpg文件。我們?nèi)绻醚h(huán)來做這件事,
54、我們不知道循環(huán)的結(jié)束條件,也不知道到底有多少層,所以比較麻煩。我們可以用一種新的思想:遞歸。遞歸舉例:從前有一座山,山里有座廟,廟里有個(gè)老和尚,老和尚在給小和尚講故事:從前有一座山,山里有座廟,廟里有個(gè)老和尚,老和尚在給小和尚講故事:從前有一座山,山里有座廟,廟里有個(gè)老和尚,老和尚在給小和尚講故事:。故事如何才能結(jié)束:小和尚還俗了。廟塌了。山崩了。Java中的遞歸:在方法的函數(shù)體中又調(diào)用了方法自己本身。遞歸調(diào)用的細(xì)節(jié):必須要求遞歸中有可以讓函數(shù)調(diào)用的結(jié)束條件。否則函數(shù)一直調(diào)用,就會(huì)導(dǎo)致內(nèi)存溢出。4.1遞歸演示練習(xí)1:需求:計(jì)算15的和值,不許使用循環(huán)。分析和步驟:定義一個(gè)DiGuiDemo測試
55、類;在這個(gè)類中的main函數(shù)中調(diào)用自定義函數(shù),5作為函數(shù)的參數(shù),使用一個(gè)變量sum來接收返回的和值,并輸出和值sum;自定義add()函數(shù)接收傳遞的參數(shù)5;在自定義函數(shù)中書寫if語句判斷i是否大于1,如果大于1,則使用return返回i+add(i-1);否則i1)/這里的add函數(shù)調(diào)用了函數(shù)自己本身的做法就是函數(shù)得遞歸調(diào)用return n+add(n-1);/返回1作為遞歸的結(jié)束條件return 1;上述代碼圖解如下圖所示:練習(xí)2:需求:求5的階乘!分析:普及一下數(shù)學(xué)知識(shí): 方式1:5! = 5 * 4 * 3 * 2 * 1 = 120; 方式1 循環(huán)方式:代碼如下所示:步驟:1)定義一個(gè)
56、DiGuiDemo2測試類;2)在這個(gè)類中的main函數(shù)中調(diào)用自定義函數(shù)jc(),5作為函數(shù)的參數(shù),使用一個(gè)變量result來接收返回的階乘的值,并輸出結(jié)果result;3)自定義jc()函數(shù)接收傳遞的參數(shù)5;4)在自定義函數(shù)中定義一個(gè)變量result=1,使用for循環(huán)來實(shí)現(xiàn)方式1求階乘的結(jié)果,并返回result階乘的值;package cn.itcast.sh.digui.demo;/* * 練習(xí)2:需求:求5的階乘! * 方式1:5!=5*4*3*2*1=120 */public class DiGuiDemo2 public static void main(String args)
57、int result=jc(5);/輸出階乘后的結(jié)果System.out.println(result);/120/使用方式一來求5的階乘public static int jc(int n) /定義 一個(gè)變量來接收階乘后的結(jié)果int result =1;for (int i = 2; i = n; i+) result=result*i;return result;方式2:使用遞歸思想來完成5! = 5 * 4! 4! = 4 * 3! 3! = 3 * 2! 2! = 2 * 1! 1! = 1*0!找規(guī)律:n! = n * (n-1)!補(bǔ)充:0!等于1結(jié)束條件:if(n 1時(shí),使用ret
58、urn返回n * jc2(n - 1);package cn.itcast.sh.digui.demo;/* * 方式2:使用遞歸思想來解決5的階乘 *方式一: 5!=5*4*3*2*1; *方式二:5!=5*4! * 4!=4*3! * 3!=3*2! * 2!=2*1! *1!=1*0! *找規(guī)律:n!=n*(n-1)! *找結(jié)束條件: *if(n=1) return 1; */public class DiGuiDemo3 public static void main(String args) / 調(diào)用函數(shù)求5的階乘int result=jc2(5);System.out.printl
59、n(result);/120/自定義函數(shù)求5的階乘public static int jc2(int n) / 結(jié)束條件if(n=1)return 1;return n*jc2(n-1);上述代碼內(nèi)存圖解如下所示:4.2遞歸注意事項(xiàng)遞歸必須有結(jié)束條件,否則棧內(nèi)存會(huì)溢出,稱為死遞歸!棧炸了。棧內(nèi)存溢出報(bào)的異常如下所示:遞歸次數(shù)不能太多,否則棧溢出。炸了棧內(nèi)存溢出報(bào)的異常如下所示:3)構(gòu)造函數(shù)不能遞歸,內(nèi)存溢出,編譯直接報(bào)錯(cuò)。總結(jié):遞歸容器容易導(dǎo)致內(nèi)存溢出。即使遞歸調(diào)用中有結(jié)束條件,但是如果遞歸的次數(shù)太多,也會(huì)發(fā)生內(nèi)存溢出。所以在開發(fā)中使用函數(shù)的遞歸調(diào)用時(shí)需謹(jǐn)慎。4.3遞歸練習(xí)斐波那契數(shù)列或者叫做
60、黃金分割數(shù)列或者叫做兔子數(shù)列:不死神兔問題:有1對(duì)兔子,從出生的第3個(gè)月開始,每個(gè)月都生1對(duì)兔子,假如兔子都不死,問第n個(gè)月有幾對(duì)兔子。斐波那契數(shù)列思想的圖解如下圖所示:斐波那契數(shù)列思想如下所示:找規(guī)律: 月份(n): 12345678910 .兔子對(duì)數(shù)(f): 11235813213455 . f(n) = f(n-1) + f(n-2)找出口:if(n = 2) return 1;代碼實(shí)現(xiàn)如下所示:分析和步驟:定義一個(gè)測試類DiguiDemo4 ;在DiguiDemo4類中調(diào)用自定義函數(shù)countRabbits(),指定月份作為參數(shù),就是想看第幾個(gè)月有多少對(duì)兔子,使用一個(gè)整數(shù)變量接收返回來
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年分離純化控制系統(tǒng)合作協(xié)議書
- 人教版 八年級(jí)英語下冊(cè) Unit 10 單元綜合測試卷(2025年春)
- 人教版化學(xué)九年級(jí)上冊(cè)第一單元《-走進(jìn)化學(xué)世界》測試試題(含答案)
- 2025年產(chǎn)品買賣協(xié)議常用版(4篇)
- 2025年個(gè)人車輛出租合同常用版(4篇)
- 2025年代理進(jìn)口合同標(biāo)準(zhǔn)范文(2篇)
- 2025年九年級(jí)年級(jí)組長管理工作總結(jié)(四篇)
- 2025年人防工程施工合同(三篇)
- 2025年個(gè)人股權(quán)的投資協(xié)議(三篇)
- 2025年九年級(jí)班主任年度期末工作總結(jié)模版(二篇)
- 產(chǎn)業(yè)鏈競爭關(guān)聯(lián)度
- TTJSFB 002-2024 綠色融資租賃項(xiàng)目評(píng)價(jià)指南
- 涵洞施工鋼筋混凝土圓管涵
- 高考地理一輪復(fù)習(xí)學(xué)案+區(qū)域地理填圖+亞洲
- 全新車位轉(zhuǎn)讓協(xié)議模板下載(2024版)
- 高中數(shù)學(xué)必修一試卷及答案
- 砌筑工考試卷及答案
- 呼吸治療師進(jìn)修匯報(bào)
- 智慧港口和自動(dòng)化集裝箱碼頭
- 2024年江西電力職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及答案解析
- 天合儲(chǔ)能:2024儲(chǔ)能專用電芯白皮書
評(píng)論
0/150
提交評(píng)論