java-File類

File類將文件和文件夾以及路徑封裝成對象功舀,以提供更多的方法和屬性來操作這些對象。File類不屬于流對象身弊,不能讀寫文件辟汰,但是可以作為參數(shù)傳遞給流對象的構(gòu)造方法。

File學(xué)習(xí)的核心要點就是要熟練掌握其方法阱佛,配合其它對象帖汞,實現(xiàn)更多的功能。

一凑术、File類中的靜態(tài)常量

  1. Windows下:

    public static String separator翩蘸,這是windows中的目錄分隔符:\\

    public static String separatorChar和上面一樣,類型不一樣

    public stativ String pathSeparator淮逊,路徑分隔符:;

    public stativ char pathSeparatorChar char類型的路徑分隔符

  2. Linux下名字和類型都一樣催首,只是值不一樣。目錄分隔符為:/路徑分隔符為::

二泄鹏、File類下的構(gòu)造方法

  • File(String pathname)傳遞一個字符串類型的路徑(路徑可以目錄的絕對地址郎任,也可以是相對地址,更可以是文件备籽,下同舶治,都稱之為路徑),將次路徑封裝成為一個File對象
  • File(String parent, String child)傳遞字符串形式的子父路徑,注意子和父是相對的概念
  • File(File parent, String child) 傳遞字符串形式的子和文件對象的父

三歼疮、File類的創(chuàng)建方法

以下方法杂抽,當(dāng)目標(biāo)路徑存在時,均會返回false韩脏,創(chuàng)建成功返回true

  1. boolean createNewFile() 創(chuàng)建文件缩麸,注意也只能創(chuàng)建文件,并不能創(chuàng)建目錄
  2. boolean mkdir()創(chuàng)建文件夾赡矢,注意只能創(chuàng)建一級目錄
  3. boolean mkdirs()創(chuàng)建多級目錄

四杭朱、File類的刪除方法

  1. boolean delete() 刪除指定目錄或者文件,成功返回true吹散,注意此刪除不走回收站弧械,文件夾不為空時沒有辦法刪除
  2. void deleteOnExit() jvm退出前刪除,個人感覺用處不是很廣泛

五空民、File類的判斷方法

  1. boolean exists()判斷構(gòu)造方法中封裝的路徑或者文件是否存在
  2. boolean isAbsolute() 判斷構(gòu)造方法中封裝的路徑是不是絕對路徑刃唐,是返回真
  3. boolean isDirectory()判斷是不是路徑,是返回true
  4. boolean isFile() 判斷是不是文件界轩,是返回true
  5. boolean isHidden() 判斷封裝的路徑(包括文件)是不是隱藏屬性是返回true

六画饥、File類的獲取方法

  1. String getName() 獲取封裝路徑最后部分的名字,此方法不會判斷路徑是否存在浊猾,使用之前最好判斷柒啤,如果是文件的話當(dāng)然獲取到的也就是文件的名字了
  2. String getParent() 返回封裝路徑的父路徑傻谁,注意封裝的是相對路徑時如果相對路徑?jīng)]有父路徑线椰,就會出錯
  3. File getParentFile()返回封裝路徑的父路徑的File對象
  4. String getAbsolutePath() 返回封裝路徑的絕對路徑
  5. File getAbsoluteFile() 返回封裝路徑的絕對路徑的File對象

七女坑、File類的其他方法

  1. boolean renameTo(File f)重命名,F(xiàn)ile封裝一個路徑偷办,這個對象調(diào)用renameTo(修改后的路徑的File對象)艰额,修改成功返回真,失敗返回假爽篷。修改名字后路徑不同悴晰,方法renameTo帶有剪切效果
  2. long lastModified()返回File構(gòu)造方法封裝的路徑中文件的最后修改時間的毫秒值
  3. boolean setLastModified(long time)能查就能改

八慢睡、File的list方法

  1. static File[] listRoots() 靜態(tài)的方法逐工,列出系統(tǒng)所以的根,光驅(qū)和移動設(shè)備存儲也會算進去
  2. String[] list()返回File構(gòu)造方法封裝的路徑下的所有文件和文件夾
  3. File[] listFiles()返回File構(gòu)造方法封裝的路徑下的所有文件和文件夾漂辐,返回的File的對象泪喊,帶全路徑。

注意:
如果空目錄調(diào)用了listFiles()髓涯,會返回一個長度為0的File數(shù)組袒啼,但是如果是文件調(diào)用了此方法,則會返回null。前后兩者是有實質(zhì)性區(qū)別的蚓再』猓空目錄是存在長度為0的數(shù)組,文件是不存在摘仅,也就是null靶庙;

九、list方法的文件過濾器

一般遍歷目錄時娃属,只想要獲取特定類型的文件六荒,其他的文件都必須過濾掉,這個就是文件過濾器的用處矾端。

FileFilter只是一個接口掏击,使用的時候需要自己實現(xiàn)來達(dá)到過濾文件的目的。FileFilter接口下只有一個accept()方法秩铆,所以使用的時候可以考慮使用匿名內(nèi)部類來實現(xiàn)砚亭。具體用法就是講FileFilter接口的實現(xiàn)對象傳入list方法中即可。

一般實現(xiàn)accept方法的時候殴玛,建議將封裝了純路徑的對象返回為true钠惩,否則如果剔除掉子目錄的話就沒有辦法遞歸進入到子目錄下。

以上一到九標(biāo)題下的所有練習(xí)全部提供在一個demo中:

package file;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Date;
import java.text.DateFormat;
/*
 * file的練習(xí)
 */
public class FileDemo {

    public static void main(String[] args) throws Exception {
        mehtod_8();
    }
    
    /*
     *  file類的四個靜態(tài)常量
     *  public static String separator 與系統(tǒng)有關(guān)的目錄分隔符 Windows中 :\ 
     *  public static char separatorChar Linux中: /
     *  public static String pathSeparator 與系統(tǒng)有關(guān)的路徑分隔符 Windows中  ; 分號
     *  public static char pathSeparatorChar Linux中  : 冒號
     */
    public static void method(){
        File f = new File("E:\\");
        String s = f.separator;
        System.out.println(s);
        s = f.pathSeparator;
        System.out.println(s);
    }
    
    /*
     * file 類的構(gòu)造方法
     * 1. File(String pathName)
     * 2. File(String parent, String child)
     * 3. File(File parent, String child)
     */
    public static void method_1(){
        File f = new File("E:\\gama");
        File f1 = new File("E:\\","game");
        File f2 = new File(f,"gama");
        System.out.println(f);
        System.out.println(f1);
        System.out.println(f2);
    }
    
    /* File類的創(chuàng)建方法 ,目標(biāo)文件或者路徑存在時族阅,均會返回false
     *  1. boolean createNewFile() 創(chuàng)建文件篓跛,成功返回true
     *  2. boolean mkdir() 創(chuàng)建文件夾,成功返回true坦刀,只能創(chuàng)建一級目錄
     *  3. boolean mkdirs() 創(chuàng)建多級文件夾
     */
    public static void method_2() throws IOException{
        File f = new File("E:\\TEST.md");
        System.out.println(f.createNewFile());
        
        File f1 = new File("E:\\TEST\\TEST\\TEST\\");
        System.out.println(f1.mkdirs());
    }
    
    /* File類的刪除方法
     * 1. boolean delete() 刪除指定目錄或者文件愧沟,成功返回true,注意此刪除不走回收站鲤遥,文件夾不為空時沒有辦法刪除
     * 2. void deleteOnExit() jvm退出前刪除沐寺,
     */
    public static void method_3() throws Exception{
        File f = new File("E:\\1.txt");
        //System.out.println(f.delete());
        f.deleteOnExit();
        Thread.sleep(5000);
    }
    
    /* File類的判斷方法
     * 1. boolean exists() 判斷構(gòu)造方法中封裝的路徑或者文件是否存在
     * boolean isAbsolute() 判斷構(gòu)造方法中封裝的路徑是不是絕對路徑,是返回真
     * boolean isDirectory() 判斷是不是路徑盖奈,是返回true
     * boolean isFile() 判斷是不是文件混坞,是返回true
     * boolean isHidden() 判斷封裝的路徑(包括文件)是不是隱藏屬性是返回true
     */
    public static void method_4() throws Exception{
        File f = new File("E:\\a7d03c85ed46e9d87d8f766ec0be65de");
        
        System.out.println(f.exists());
        
        System.out.println(f.isAbsolute());
    }
    
    /*
     * File類的獲取方法
     * 1.String getName() 獲取封裝路徑最后部分的名字,此方法不會判斷路徑是否存在钢坦,使用之前最好判斷
     * 2.String getParent() 返回封裝路徑的父路徑
     * 3.File getParentFile() 返回封裝路徑的父路徑的File對象
     * 4.String getAbsolutePath() 返回封裝路徑的絕對路徑
     * 5.File getAbsoluteFile() 返回封裝路徑的絕對路徑的File對象
     */
    public static void method_5() {
        File f = new File("src");
        System.out.println(f.getAbsoluteFile().getParent());
    }
    
    /*File的其他方法
     * 1.boolean renameTo(File f)重命名究孕,F(xiàn)ile封裝一個路徑,這個對象調(diào)用renameTo(修改后的路徑的File對象)爹凹,
     *   修改成功返回真厨诸,失敗返回假。修改名字后路徑不同禾酱,方法renameTo帶有剪切效果
     * 2.long lastModified()返回File構(gòu)造方法封裝的路徑中文件的最后修改時間的毫秒值
     * 3.boolean setLastModified(long time) 能查就能改
     */
    public static void method_6() {
        File f = new File("H:\\project\\Demo\\src\\io\\BufferedReaderDemo.java");
        
        long time = f.lastModified();
        DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
        String date = df.format(new Date(time));
        
        System.out.println(date);
        
        f.setLastModified(new Date().getTime());

        date = df.format(new Date(f.lastModified()));
        System.out.println(date);
    }
    
    /*
     * File的list方法
     * 1. static File[] listRoots() 靜態(tài)的方法微酬,列出系統(tǒng)所以的根绘趋,光驅(qū)和移動設(shè)備存儲也會算進去
     * 2. String[] list()返回File構(gòu)造方法封裝的路徑下的所有文件和文件夾
     * 3. File[] listFiles()返回File構(gòu)造方法封裝的路徑下的所有文件和文件夾,返回的Filed對象颗管,帶全路徑
     */
    public static void method_7(){
        
        File[] roots = File.listRoots();
        
        for(File f: roots){
            System.out.println(f);
        }
    }
  
    /*
     * 文件過濾打印
     */
    public static void mehtod_8(){
        File dir = new File("G:\\");
        FilesFilter(dir);
    }
    
    //遞歸過濾方法的實現(xiàn)陷遮,選出目錄下的*.java文件
    //直接使用匿名內(nèi)部內(nèi)實現(xiàn)了FileFilter接口
    public static void FilesFilter(File file) {
        File[] files = file.listFiles(
            new FileFilter(){
                public boolean accept(File pathname){ //使用匿名內(nèi)部類實現(xiàn)文件過濾器的接口
                    if(pathname.getName().endsWith(".java") || pathname.isDirectory()){
                        return true;
                    }else{
                        return false;
                    }
                }
            });

        if (files != null) {
            for (File f : files) {
                if (f.isFile()) {
                    System.out.println(f);
                    
                } else
                    FilesFilter(f);
            }
        }
    
    }
}

十、遞歸方法

所謂遞歸就是方法自身調(diào)用自身垦江,層層調(diào)用拷呆,知道最底層的方法完成后一層層的退出知道最外層方法結(jié)束。比較的常見的就是文件的遍歷和實現(xiàn)斐波那契數(shù)列等等疫粥。

遞歸可以一定程度上減少代碼量茬斧,提高代碼的可讀性,也容易實現(xiàn)梗逮。但是缺點就是不能遞歸太多次项秉,否則方法調(diào)用太多會占用太多的系統(tǒng)資源。

下面給出一個遞歸遍歷全盤的demo:

package file;
/*
 * 一個練習(xí)慷彤,統(tǒng)計電腦里面文件的總數(shù)
 * 思路:遞歸
 * 
 * 輸出(感覺C盤部分文件沒有統(tǒng)計到娄蔼,有點少):
 * C:\目錄下有文件:205263個
 * D:\目錄下有文件:0個
 * E:\目錄下有文件:34746個
 * F:\目錄下有文件:3025個
 * G:\目錄下有文件:5616個
 * H:\目錄下有文件:141762個
 * 390412
 */
import java.io.File;

public class FileTest {
    public static void main(String[] args) {

        File[] files = File.listRoots();
        long filesNum = 0;
        long temp = 0;
        
        for (File f : files) {
            filesNum = filesNum + countFiles(f);
            System.out.println(f + "目錄下有文件:" + (filesNum-temp) + "個");
            temp = filesNum;
        }
        System.out.println(filesNum);
    }

    public static long countFiles(File file) {

        long FilesNum = 0;

        File[] files = file.listFiles();

        if (files != null) {

            for (File f : files) {
                if (f.isFile()) {
                    FilesNum++;
                    
                } else
                    FilesNum = FilesNum + countFiles(f);
            }
        }
        return FilesNum;
    }

    /*
     * 斐波那契數(shù)列實現(xiàn)
     */
    public static int getSum(int months){ 
        if(months == 1 || months ==2)
            return 1;
        return getSum(months-1) + getSum(months-2);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市底哗,隨后出現(xiàn)的幾起案子岁诉,更是在濱河造成了極大的恐慌,老刑警劉巖跋选,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涕癣,死亡現(xiàn)場離奇詭異,居然都是意外死亡前标,警方通過查閱死者的電腦和手機坠韩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炼列,“玉大人只搁,你說我怎么就攤上這事〖蠹猓” “怎么了氢惋?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長稽犁。 經(jīng)常有香客問我焰望,道長,這世上最難降的妖魔是什么缭付? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任柿估,我火速辦了婚禮循未,結(jié)果婚禮上陷猫,老公的妹妹穿的比我還像新娘秫舌。我一直安慰自己,他們只是感情好绣檬,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布足陨。 她就那樣靜靜地躺著,像睡著了一般娇未。 火紅的嫁衣襯著肌膚如雪墨缘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天零抬,我揣著相機與錄音镊讼,去河邊找鬼。 笑死平夜,一個胖子當(dāng)著我的面吹牛蝶棋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忽妒,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼玩裙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了段直?” 一聲冷哼從身側(cè)響起吃溅,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸯檬,沒想到半個月后决侈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡喧务,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年颜及,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹂楣。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡俏站,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出痊土,到底是詐尸還是另有隱情肄扎,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布赁酝,位于F島的核電站犯祠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酌呆。R本人自食惡果不足惜衡载,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隙袁。 院中可真熱鬧痰娱,春花似錦弃榨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坡贺,卻和暖如春官辈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遍坟。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工拳亿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愿伴。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓风瘦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親公般。 傳聞我的和親對象是個殘疾皇子万搔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • File類 ??File類是java.io包下代表與平臺無關(guān)的文件和目錄,也就是說如果希望在程序中操作文件和目錄都...
    琦琦出去玩了閱讀 332評論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法官帘,類相關(guān)的語法瞬雹,內(nèi)部類的語法,繼承相關(guān)的語法刽虹,異常的語法酗捌,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)涌哲,斷路器胖缤,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 眼看他起高樓,眼看他宴賓客阀圾,眼看他樓塌了哪廓,和幾位老機關(guān)閑聊感觸頗多,用十年富貴初烘,換今后半生牢獄涡真,值還是不值。
    師或閱讀 162評論 0 0
  • 哈哈哈 我回來啦I隹稹6吡稀!如果可以的話吗铐,過年前后文章恢復(fù)更新东亦。 好了回歸正題 想想做過的決定 ,還是因為當(dāng)初太幼稚唬渗。大...
    鈺姑娘閱讀 559評論 0 1