Java 基礎(三)| IO流之使用 File 類的正確姿式

File

爲跳槽面試作準備,今天開始進入 Java 基礎的複習。但願基礎很差的同窗看完這篇文章,能掌握泛型,而基礎好的同窗權當複習,但願看完這篇文章可以起一點你的青澀記憶。前端

1、什麼是 File 類?

java.io.File 類是文件和目錄路徑名的抽象表示,主要用於文件和目錄的建立、查找和刪除等操做。java

2、File 類的使用

2.1 構造方法

File 類的構造有三種:python

  • public File(String pathname) : 直接經過文件路徑字符串建立
  • public File(String parent, String child) : 經過父和子路徑字符串建立
  • public File(File parent, String child) : 先建立父級 file 對象,再結合子路徑建立
/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/3 22:22 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */
public class FileConstruct {

    public static void main(String [] args) {
        // 文件路徑名
        String pathname = "Z:\\file\\file.txt";
        File file1 = new File(pathname);
        System.out.println(file1);

        // 經過父路徑和子路徑字符串
        String parent = "Z:\\file";
        String child1 = "file.txt";
        File file2 = new File(parent, child1);
        System.out.println(file2);

        // 經過父級 File 對象和子路徑字符串
        File parentDir = new File("Z:\\file");
        String child2 = "file.txt";
        File file3 = new File(parentDir, child2);
        System.out.println(file3);
    }

}
複製代碼

三種建立 File 對象的方法如上所示,此外須要說明的是:一個 File 對象表明硬盤中的目錄或者文件,而這個目錄或文件在硬盤中是否存在不影響 File 對象的建立。linux

2.2 獲取功能的方法

  • public String getAbsolutePath() :返回指定 File 實例的絕對路徑c++

  • public String getPath() :將指定 File 實例的抽象路徑名轉換爲一個路徑名字符串git

  • public String getName() :返回指定 File 實例的目錄或文件名github

  • public long length() :返回指定 File 實例的文件長度面試

在硬盤 Z:\file 下,新建一個 file.txt 文件,文件內容是 26 個英文字母。算法

/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 11:01 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */
public class FileGet {

    public static void main(String[] args) {

        File file1 = new File("Z:"+ File.separator + "file" + File.separator + "file.txt");
        System.out.println("文件絕對路徑:"+file1.getAbsolutePath());
        System.out.println("文件構造路徑:"+file1.getPath());
        System.out.println("文件名稱:"+file1.getName());
        System.out.println("文件長度:"+file1.length()+"字節");

        System.out.println("----------------------");

        // 表示根目錄, 在 windows 下:File.separator + "file" = "\\file"
        File file2 = new File(File.separator + "file");
        // 絕對路徑
        System.out.println("目錄絕對路徑:"+file2.getAbsolutePath());
        // 構造 File 實例時的路徑
        System.out.println("目錄構造路徑:"+file2.getPath());
        System.out.println("目錄名稱:"+file2.getName());
        // file 示例爲目錄,因此長度 = 0
        System.out.println("目錄長度:"+file2.length());
    }

}
複製代碼

File 的 get 方法如上示例,值得注意的是:getPath() 與 getAbsolutePath() 的區別在於,前者獲取的是構造 File 實例時的路徑,後者獲取的是 File 實例的絕對路徑。當構造 File 實例的路徑也是絕對路徑時,兩者是同樣的。小程序

2.3 絕對路徑與相對路徑

  • 絕對路徑:從盤符開始的完整路徑
  • 相對路徑:相對於你當前的項目目錄的路徑,在開發中經常使用此路徑
/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 11:29 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */
public class FilePath {

    public static void main(String[] args) {
        // Z盤下的 file.txt 文件
        File file = new File("Z:\\file.txt");
        System.out.println(file.getAbsolutePath());

        // 項目下的 file.txt 文件
        File file2 = new File("file.txt");
        System.out.println(file2.getAbsolutePath());
    }

}

輸出結果:
Z:\file.txt
Z:\IDEAProject\review\review_java\file.txt
複製代碼

2.4 判斷功能的方法

判斷功能的方法主要有三個,輸出都是布爾值:

  • public boolean exists() :指定 File 實例表明的文件或者目錄是否存在
  • public boolean isDirectory() :指定 File 實例是否是目錄
  • public boolean isFile() :指定 File 實例是否是文件
/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 11:37 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */
public class FileIs {

    public static void main(String[] args) {
        File file1 = new File("Z:\\file\\file.txt");
        File file2 = new File("Z:\\file");
        // 判斷是否存在
        System.out.println("Z:\\file\\file.txt 是否存在:"+file1.exists());
        System.out.println("Z:\\file 是否存在:"+file2.exists());
        // 判斷文件
        System.out.println("Z:\\file\\file.txt 文件?:"+file1.isFile());
        System.out.println("Z:\\file 文件?:"+file2.isFile());
        // 判斷目錄
        System.out.println("Z:\\file\\file.txt 目錄?:"+file1.isDirectory());
        System.out.println("Z:\\file 目錄?:"+file2.isDirectory());
    }

}

輸出結果:
Z:\file\file.txt 是否存在:true
Z:\file 是否存在:true
Z:\file\file.txt 文件?:true
Z:\file 文件?:false
Z:\file\file.txt 目錄?:false
Z:\file 目錄?:true
複製代碼

2.5 建立與刪除方法

  • public boolean createNewFile() :指定 File 實例的文件不存在時,建立空文件
  • public boolean delete() :刪除指定 File 實例表示的文件或目錄
  • public boolean mkdir() :建立指定 File 實例表示的目錄
  • public boolean mkdirs() :建立指定 File 實例表示的目錄,以及父目錄
/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 11:49 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */
public class FileCreateDelete {

    public static void main(String[] args) throws IOException {
        System.out.println("-----建立文件------");
        // 文件的建立
        File file1 = new File("file1.txt");
        System.out.println("是否存在:"+file1.exists()); // false
        System.out.println("是否建立:"+file1.createNewFile()); // true
        System.out.println("是否存在:"+file1.exists()); // true

        System.out.println("-----建立目錄------");

        // 目錄的建立
        File file2 = new File("fileDir");
        System.out.println("是否存在:"+ file2.exists());// false
        System.out.println("是否建立:"+ file2.mkdir());	// true
        System.out.println("是否存在:"+ file2.exists());// true

        System.out.println("-----建立多級目錄------");

        // 建立多級目錄
        File file3= new File("fileDir1\\fileDir2");
        System.out.println(file3.mkdir());// false
        File file4 = new File("fileDir1\\fileDir2");
        System.out.println(file4.mkdirs());// true

        System.out.println("-----刪除文件------");

        // 文件的刪除
        System.out.println(file1.delete());// true

        System.out.println("-----刪除目錄------");
        
        // 目錄的刪除
        System.out.println(file2.delete());// true
        System.out.println(file4.delete());// false
    }

}
複製代碼

2.6 目錄的遍歷

  • public String[] list() :返回一個 String 數組,表示指定 File 實例目錄中的全部子文件或目錄。

  • public File[] listFiles() :返回一個 File 數組,表示指定 File 實例目錄中的全部的子文件或目錄。

/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 12:02 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */
public class FileList {

    public static void main(String[] args) {
        File dir = new File("Z:\\IDEAProject");

        //獲取當前目錄下的文件以及文件夾的名稱,用處不大。
        String[] names = dir.list();
        for(String name : names) {
            System.out.println(name);
        }
        System.out.println("--------------------------------");
        //獲取當前目錄下的文件以及文件夾對象,拿到了文件對象,能夠作更多操做,項目經常使用
        File[] files = dir.listFiles();
        for (File file : files) {
            System.out.println(file);
        }
    }

}
複製代碼

值得注意的是:不論是 list() 仍是 listFiles() 方法,所指定的 File 實例都必須是在硬盤中實際存在的,不然沒法遍歷。

3、遞歸

3.1 什麼是遞歸?

指的是程序在某個方法內本身調用本身的操做。

3.2 遞歸的分類

遞歸分爲兩種:

  • 直接遞歸:稱爲方法自身調用本身。
  • 間接遞歸:能夠 A 方法調用 B 方法,B 方法調用 C 方法,C 方法調用 A 方法。

3.3 遞歸的使用規範

  • 遞歸必定要有條件限定,保證遞歸可以中止下來,不然會發生棧內存溢出
  • 在遞歸中雖然有限定條件,可是遞歸次數不能太多。不然也會發生棧內存溢出
  • 構造方法,禁止遞歸

4、遞歸的使用

若是你不知道何時使用遞歸?那這裏有一條很簡單的定律:當你明確遞歸次數不至於形成內存溢出是,可以使用;不然,不要使用。

遞歸有不少的使用場景,好比遞歸求和,遞歸階乘。而遞歸多級目錄、遍歷文件、搜索文件是咱們在開發中經常使用的,它是這麼實現的:

/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 12:15 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */
public class FileSearch {

    public static void main(String[] args) {
        // 建立 File 對象
        File dir  = new File("Z:\\IDEAProject");
        // 調用文件搜索方法
        searchFile(dir);
    }

    public static void searchFile(File dir) {
        // 獲取子文件和目錄
        File[] files = dir.listFiles();
        // 循環遍歷
        for (File file : files) {
            // 判斷
            if (file.isFile()) {
                // 輸出查找的目標文件的絕對路徑
                if ("FileIs.java".equals(file.getName())){
                    System.out.println("目標文件路徑:"+ file.getAbsolutePath());
                }
            } else {
                // 是目錄,調用自身,造成遞歸
                searchFile(file);
            }
        }
    }

}

輸出結果:
目標文件路徑:Z:\IDEAProject\review\review_java\src\main\java\com\nasus\io\file\FileIs.java
複製代碼

5、源碼地址

Github源碼地址:github.com/turoDog/rev…

最後

若是看到這裏,喜歡這篇文章的話,幫忙 " 轉發 "或者點個" 在看 ",行嗎?祝大家 2020 暴富。微信搜索「一個優秀的廢人」,歡迎關注。

回覆「1024」送你一套完整的 java、python、c++、go、前端、linux、算法、大數據、人工智能、小程序以及英語教程。

回覆「電子書」送你 50+ 本 java 電子書。

最全教程
相關文章
相關標籤/搜索