JavaSE-File類琐凭、遞歸

目錄

[TOC]

第一章:File類

1.1 File類介紹

? java.io.File 類是文件和目錄路徑名的抽象表示逗嫡,主要用于文件和目錄的創(chuàng)建、查找和刪除等操作葫隙。

1.2 構(gòu)造方法

  • 語(yǔ)法

    1. public File(String pathname) :通過(guò)將給定的路徑名字符串轉(zhuǎn)換為抽象路徑名來(lái)創(chuàng)建新的 File實(shí)例栽烂。
    2. public File(String parent, String child) :從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實(shí)例。
    3. public File(File parent, String child) :從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實(shí)例恋脚。
  • 代碼

        // 創(chuàng)建File對(duì)象-方式1
        File file1 = new File("D:\\JavaCode\\BasicCode\\a");
        System.out.println(file1);
        // 創(chuàng)建File對(duì)象-方式2
        File file2 = new File("D:\\JavaCode\\BasicCode\\a","1.txt");
        System.out.println(file2);
        // 創(chuàng)建File對(duì)象-方式3
        File file3 = new File(file1,"1.txt");
        System.out.println(file3);
    
  • 注意事項(xiàng)

    1. 一個(gè)File對(duì)象代表硬盤(pán)中實(shí)際存在的一個(gè)文件或者目錄腺办。
    2. 無(wú)論該路徑下是否存在文件或者目錄,都不影響File對(duì)象的創(chuàng)建

1.3 File類靜態(tài)成員

  • 靜態(tài)成員

    1. public static final String pathSeparator
      • 與系統(tǒng)有關(guān)的路徑分隔符糟描。
    2. public static final String separator
      • 獲取與系統(tǒng)有關(guān)的默認(rèn)名稱分隔符怀喉。
  • 代碼

        System.out.println(File.pathSeparator);  // ";"
        System.out.println(File.separator); // "/"
      // 注意:不同的操作系統(tǒng)獲取的分隔符是不一樣的
    

1.4 常用方法

  1. 獲取功能-相關(guān)方法

    • 方法

      1. public String getAbsolutePath():返回此File的絕對(duì)路徑名字符串。
      2. public String getPath() :將此File轉(zhuǎn)換為路徑名字符串船响。
      3. public String getName():返回由此File表示的文件或目錄的名稱躬拢。
      4. public long length():返回由此File表示的文件的長(zhǎng)度。
    • 代碼

        public static void main(String[] args) {
          // 1. `public String getAbsolutePath() `:返回此File的絕對(duì)路徑名字符串见间。
          show1();
          // 2. `public String getPath()` :將此File轉(zhuǎn)換為路徑名字符串聊闯。
          show2();
          // 3. `public String getName() `:返回由此File表示的文件或目錄的名稱。
          show3();
          // 4. `public long length() `:返回由此File表示的文件的長(zhǎng)度(文件的大小)
          show4();
        }
      
        private static void show4() {
          // 不存在的文件夾或不存在的文件或存在的文件夾返回的都是0
          File file1 = new File("D:\\JavaCode\\BasicCode\\a");
          System.out.println(file1.length()); // 0
          File file3 = new File("D:\\JavaCode\\BasicCode\\aa");
          System.out.println(file3.length()); //0
          File file2 = new File("D:\\JavaCode\\BasicCode\\a\\logo01.png");
          System.out.println(file2.length()); //11610 字節(jié)
        }
      
        private static void show3() {
          File file1 = new File("D:\\JavaCode\\BasicCode\\a");
          System.out.println(file1.getName()); // a
          File file2 = new File("1.txt");   // 1.txt
          System.out.println(file2.getName());
        }
      
        private static void show2() {
          // 文件路徑是什么就返回什么
          File file1 = new File("D:\\JavaCode\\BasicCode\\1.txt");
          System.out.println(file1.getPath()); // D:\JavaCode\BasicCode\1.txt
          File file2 = new File("1.txt");   // 1.txt
          System.out.println(file2.getPath());
        }
      
        private static void show1() {
          File file1 = new File("D:\\JavaCode\\BasicCode\\1.txt");
          System.out.println(file1.getAbsoluteFile()); // D:\JavaCode\BasicCode\1.txt
          File file2 = new File("1.txt");   // D:\JavaCode\BasicCode\1.txt
          System.out.println(file2.getAbsoluteFile());
        }
      
  2. 絕對(duì)路徑和相對(duì)路徑

    • 絕對(duì)路徑:從盤(pán)符開(kāi)始的路徑米诉,這是一個(gè)完整的路徑菱蔬。
    • 相對(duì)路徑:相對(duì)于項(xiàng)目目錄的路徑,這是一個(gè)便捷的路徑荒辕,開(kāi)發(fā)中經(jīng)常使用汗销。
  3. 判斷功能-相關(guān)方法

    • 方法

      1. public boolean exists() :此File表示的文件或目錄是否實(shí)際存在。
      2. public boolean isDirectory() :此File表示的是否為目錄(目錄實(shí)際存在)抵窒。
      3. public boolean isFile() :此File表示的是否為文件(文件實(shí)際存在)弛针。
    • 代碼

          File file1 = new File("a");
          // 1. `public boolean exists()` :此File表示的文件或目錄是否實(shí)際存在。
          System.out.println(file1.exists());  // true
          // 2. `public boolean isDirectory()` :此File表示的是否為目錄李皇。
          System.out.println(file1.isDirectory()); // true
          // 3. `public boolean isFile()` :此File表示的是否為文件削茁。
          System.out.println(file1.isFile());  // false
      
  4. 創(chuàng)建刪除功能-相關(guān)方法

    • 方法

      1. public boolean createNewFile() :當(dāng)且僅當(dāng)具有該名稱的文件尚不存在時(shí),創(chuàng)建一個(gè)新的空文件掉房。
      2. public boolean delete():刪除由此File表示的文件或目錄茧跋。
      3. public boolean mkdir() :創(chuàng)建由此File表示的目錄。
      4. public boolean mkdirs():創(chuàng)建由此File表示的目錄卓囚,包括任何必需但不存在的父目錄瘾杭。
    • 代碼

        public static void main(String[] args) throws IOException {
          // 1. `public boolean createNewFile()` :當(dāng)且僅當(dāng)具有該名稱的文件尚不存在時(shí),創(chuàng)建一個(gè)新的空文件哪亿。
          File file1 = new File("a"); // 已經(jīng)存在的文件目錄
          System.out.println(file1.createNewFile()); // false
          File file2 = new File("b"); // 不存在的文件
          System.out.println(file2.createNewFile()); // true
          // 2. `public boolean delete() `:刪除由此File表示的文件或目錄粥烁。
          File file3 = new File("c"); // 不存在的文件
          System.out.println(file3.delete()); // false
          File file4 = new File("b"); // 不存在的文件
          System.out.println(file4.delete()); // true
          // 3. `public boolean mkdir()` :創(chuàng)建由此File表示的目錄贤笆。
          File file5 = new File("e"); // 不存在的文件目錄
          System.out.println(file5.mkdir()); // true
          File file6 = new File("e//g/f"); // 多級(jí)文件目錄
          System.out.println(file6.mkdir()); // false
          // 4. `public boolean mkdirs() `:創(chuàng)建由此File表示的目錄,包括任何必需但不存在的父目錄讨阻。
          System.out.println(file6.mkdirs()); // true
      
        }
      

1.5 目錄的遍歷

  • 方法

    1. public String[] list() :返回一個(gè)String數(shù)組芥永,表示該File目錄中的所有子文件或目錄。
    2. public File[] listFiles() :返回一個(gè)File數(shù)組钝吮,表示該File目錄中的所有的子文件或目錄埋涧。
  • 代碼

        // 1. `public String[] list()` :返回一個(gè)String數(shù)組,表示該File目錄中的所有子文件或目錄奇瘦。
        File file1 = new File("D:\\JavaCode\\BasicCode");
        String[]files = file1.list();
        for (int i = 0; i < files.length; i++) {
          System.out.println(files[i]);
        }
        //2. `public File[] listFiles()` :返回一個(gè)File數(shù)組棘催,表示該File目錄中的所有的子文件或目錄。
        File file2 = new File("D:\\JavaCode\\BasicCode");
        File[]files2 = file2.listFiles();
        for (int i = 0; i < files2.length; i++) {
          System.out.println(files2[i]);
        }
    
  • 注意事項(xiàng)

    • 調(diào)用listFiles方法的File對(duì)象耳标,表示的必須是實(shí)際存在的目錄巧鸭,否則返回null,無(wú)法進(jìn)行遍歷麻捻。

第二章:遞歸

2.1 遞歸介紹

  • 遞歸,函數(shù)自身調(diào)用自身的編程技巧呀袱。
  • 遞歸的分類:
    • 直接遞歸稱為方法自身調(diào)用自己贸毕。
    • 間接遞歸可以A方法調(diào)用B方法,B方法調(diào)用C方法夜赵,C方法調(diào)用A方法明棍。
  • 遞歸注意事項(xiàng):
    1. 遞歸一定要有條件限定,保證遞歸能夠停止下來(lái)寇僧,否則會(huì)發(fā)生棧內(nèi)存溢出摊腋。
    2. 在遞歸中雖然有限定條件,但是遞歸次數(shù)不能太多嘁傀。否則也會(huì)發(fā)生棧內(nèi)存溢出兴蒸。
    3. 構(gòu)造方法,禁止遞歸

2.2 遞歸練習(xí)1

  • 需求:計(jì)算數(shù)字1 ~ n的和

  • 分析:num的累和 = num + (num-1)的累和,所以可以把累和的操作定義成一個(gè)方法细办,遞歸調(diào)用橙凳。

  • 代碼:

      // 計(jì)算數(shù)字1 ~ n的和
      public static void main(String[] args) {
        int sum = getSum(3);
        System.out.println(sum);
      }
    
      private static int getSum(int n) {
        // 判斷遞歸結(jié)束條件
        if(n==1) {
          return 1;
        }
        // 遞歸任務(wù)
        return n + getSum(n-1);
      }
    
    
  • 圖解:

2.3 遞歸練習(xí)2

  • 需求:階乘所有小于及等于該數(shù)的正整數(shù)的積。

    • n的階乘:n! = n * (n‐1) *...* 3 * 2 * 1 x
  • 分析:這與累和類似,只不過(guò)換成了乘法運(yùn)算

    • 推理得出:n! = n * (n‐1)!
  • 代碼

      public static void main(String[] args) {
        int result = factorial(3);
        System.out.println(result);
      }
    
      private static int factorial(int n) {
        if(n==1) {
          return 1;
        }
        return n * factorial(n-1);
      }
    

2.4 遞歸練習(xí)3

  • 需求:打印多級(jí)目錄及文件

  • 代碼:

      public static void main(String[] args) {
        File file = new File("D:\\JavaCode\\BasicCode\\dir");
        readFile(file);
      }
      // 定義讀取目錄文件的方法
      private static void readFile(File file) {
       // 獲取子文件和子目錄
        File[]files = file.listFiles();
        // 循環(huán)遍歷子文件和子目錄
        for (File f : files) {
          if(f.isDirectory()){
            readFile(f);
          }else {
            System.out.println(f);
          }
        }
      }
    

2.5 遞歸練習(xí)4

  • 需求: 給一個(gè)指定的目錄笑撞,遞歸實(shí)現(xiàn)過(guò)濾出該目錄中所有的以及嵌套目中.java文件

  • 代碼:

      public static void main(String[] args) {
        File file = new File("D:\\JavaCode\\BasicCode");
        readFile(file);
      }
      // 定義讀取目錄文件的方法
      private static void readFile(File file) {
        // 獲取子文件和子目錄
        File[]files = file.listFiles();
        // 循環(huán)遍歷子文件和子目錄
        for (File f : files) {
          if(f.isDirectory()){
            readFile(f);
          }else {
            if(f.getName().toLowerCase().endsWith(".java")){
              System.out.println(f);
            }
          }
        }
      }
    

2.6 文件過(guò)濾器

? java.io.FileFilter 是一個(gè)接口岛啸,是File的過(guò)濾器。 該接口的對(duì)象可以傳遞給File類的 listFiles(FileFilter)方法作為參數(shù)茴肥, 接口中只有一個(gè)方法坚踩。

? boolean accept(File pathname) :測(cè)試pathname是否應(yīng)該包含在當(dāng)前File目錄中,符合則返回true瓤狐。 ?

  • 需求:和上述練習(xí)4一樣

  • 分析

    1. 接口作為參數(shù)瞬铸,需要傳遞子類對(duì)象批幌,重寫(xiě)其中方法。我們選擇匿名內(nèi)部類方式赴捞,比較簡(jiǎn)單逼裆。

    2. accept 方法,參數(shù)為File赦政,表示當(dāng)前File下所有的子文件和子目錄胜宇。保留住則返回true,過(guò)濾掉則返回 false恢着。保留規(guī)則:

      1. 要么是.java文件桐愉。
      2. 要么是目錄,用于繼續(xù)遍歷掰派。
    3. 通過(guò)過(guò)濾器的作用从诲, listFiles(FileFilter) 返回的數(shù)組元素中,子文件對(duì)象都是符合條件的靡羡,可以直接打

      印系洛。

  • 代碼1:匿名內(nèi)部類

      public static void main(String[] args) {
        File file = new File("D:\\JavaCode\\BasicCode");
        readFile(file);
      }
      // 定義讀取目錄文件的方法
      private static void readFile(File file) {
        // 獲取子文件和子目錄
        File[]files = file.listFiles(new FileFilter() {
          @Override
          public boolean accept(File pathname) {
            // 符合條件的File
            return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");
          }
        });
        // 循環(huán)遍歷子文件和子目錄
        for (File f : files) {
          if(f.isFile()){
            System.out.println(f);
          }else {
            readFile(f);
          }
        }
      }
    
  • 代碼2:Lambda表達(dá)式

      public static void main(String[] args) {
        File file = new File("D:\\JavaCode\\BasicCode");
        readFile(file);
      }
      // 定義讀取目錄文件的方法
      private static void readFile(File file) {
        // 獲取子文件和子目錄
        File[]files = file.listFiles(pathname -> pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"));
        // 循環(huán)遍歷子文件和子目錄
        for (File f : files) {
          if(f.isFile()){
            System.out.println(f);
          }else {
            readFile(f);
          }
        }
      }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市略步,隨后出現(xiàn)的幾起案子描扯,更是在濱河造成了極大的恐慌,老刑警劉巖趟薄,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绽诚,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡杭煎,警方通過(guò)查閱死者的電腦和手機(jī)恩够,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)羡铲,“玉大人蜂桶,你說(shuō)我怎么就攤上這事∠眨” “怎么了屎飘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贾费。 經(jīng)常有香客問(wèn)我钦购,道長(zhǎng),這世上最難降的妖魔是什么褂萧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任押桃,我火速辦了婚禮,結(jié)果婚禮上导犹,老公的妹妹穿的比我還像新娘唱凯。我一直安慰自己羡忘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布磕昼。 她就那樣靜靜地躺著卷雕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪票从。 梳的紋絲不亂的頭發(fā)上漫雕,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音峰鄙,去河邊找鬼浸间。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吟榴,可吹牛的內(nèi)容都是我干的魁蒜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吩翻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼兜看!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起狭瞎,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铣减,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后脚作,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缔刹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年球涛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片校镐。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亿扁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸟廓,到底是詐尸還是另有隱情从祝,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布引谜,位于F島的核電站牍陌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏员咽。R本人自食惡果不足惜毒涧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贝室。 院中可真熱鬧契讲,春花似錦仿吞、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至银伟,卻和暖如春你虹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枣申。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工售葡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忠藤。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓挟伙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親模孩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尖阔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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