17. Java基礎之File類

Java的File類

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

  • 一個file對象代表的是硬盤中實際存在的一個文件或者一個文件夾。

  • 無論該路徑是否在在文件或者文件夾,都不會影響file對象的創建。

  • 路徑分隔可以使用"/" 也可以使用"\“但是在java語言中,”\“具有特殊的含義,所以需要使用轉義字符”\",使用"/"的時候不需要轉義

    • windows操作系統可以識別"/",也可以識別"\"
    • linux操作系統只認識"/"
    • mac操作系統只認識"/"
    • 所以開發的時候一定使用"/"

1. File類的構造方法

  • public File(String pathname):通過將給定的路徑名字符串轉換爲抽象路徑名來創建新的 File實例。

  • public File(String parent, String child) :從父路徑名字符串和子路徑名字符串創建新的 File實例。

  • public File(File parent, String child) :從父抽象路徑名和子路徑名字符串創建新的 File實例。

    public static void main(String[] args) {
        //file是文件和文件夾(文件路徑的抽象表示),主要用於文件和目錄的創建,查找,和刪除的操作。
        //直接使用file路徑創建一個文件對象
        File file = new File("E:/Dr");

        //使用兩個參數的構造方法創建對象的時候,如果多個路徑的間隔符沒寫會自動添加,多了會自動刪除
        File file11 = new File("E:/Dr","哎呦-喵喵喵喵喵.txt");//第一種
        File file12 = new File("E:/Dr/","哎呦-喵喵喵喵喵.txt");//第二種
        File file13 = new File("E:/Dr/","/哎呦-喵喵喵喵喵.txt");//第三種


        File file2 = new File("E:\\Dr\\D 照片");//第二種

        File file3 = new File(file,"mm.txt");//第三種
    }

2. 常用方法

  • public String getAbsolutePath() :獲得file對象的絕對路徑
  • public String getPath():獲得file文件的路徑
  • public String getName() :獲取文件或文件夾的名稱
  • public long length():獲得文件的大小(字節爲單位)
    public static void main(String[] args) {
        File file = new File("E:/Dr/D 照片","/mm.txt");
        File file2 = new File("dd/ai/mm");
        File file3 = new File("E:/Dr/D 照片/範丹/IMG_20180217_165312.jpg");
        
        
        String absolutePath = file.getAbsolutePath();
        //.getAbsolutePath();獲得的是當前文件的絕對路徑
        System.out.println( "absolutePath = " + absolutePath );

        //.getPath();獲得file文件的路徑
        String path = file.getPath();
        System.out.println( "path = " + path );

        //.getName();獲得file的文件名或者文件夾名。
        String name = file2.getName();
        System.out.println( "name = " + name );//mm

        //.length();獲得文件的大小(字節爲大小)
        long length = file3.length();
        System.out.println( "length = " + length );
    }
  • public boolean exists():此File表示的文件或目錄是否實際存在。

  • public boolean isDirectory() :此File表示的是否爲目錄。

  • public boolean isFile():此File表示的是否爲文件。

    public static void main(String[] args) {
        File file = new File("E:/Dr/D 照片/mm.txt");

        //.exists();判斷文件或者文件夾是否存在
        boolean exists = file.exists();
        System.out.println( "exists = " + exists );//true 存在

        File file1 = new File("D:/workspace/out");
        boolean exists1 = file1.exists();
        System.out.println( "exists1 = " + exists1 );//true

        //.isDirectory();判斷當前的file是不是文件夾
        boolean directory = file1.isDirectory();
        System.out.println( "directory = " + directory );//true

        //.isFile();判斷當前的file是不是文件
        boolean file2 = file1.isFile();
        System.out.println( "file2 = " + file2 );//false
    }
  • public boolean createNewFile() :當且僅當具有該名稱的文件尚不存在時,創建一個新的空文件。

  • public boolean delete() :刪除由此File表示的文件或目錄(空目錄)。

  • public boolean mkdir() :創建由此File表示的目錄。

  • public boolean mkdirs():創建由此File表示的目錄,包括任何必需但不存在的父目錄。

2.1 目錄的遍歷

  • public String[] list():返回一個String數組,表示該File目錄中的所有子文件或目錄。

  • public File[] listFiles():返回一個File數組,表示該File目錄中的所有的子文件或目錄。

    @Test
    public void test() throws IOException {
        File file = new File("E:/file");
        
        String[] list = file.list();
        //s = 鳳凰傳奇 - 自由飛翔.mp3
        for (String s : list) {
            System.out.println("s = " + s);
        }
        
        File[] files = file.listFiles();
        //file1 = E:\file\鳳凰傳奇 - 自由飛翔.mp3
        for (File file1 : files) {
            System.out.println("file1 = " + file1);
        }
    }//這樣遍歷目錄只能打印一級目錄名稱,如果需要打印多級目錄名稱需要使用遞歸的思想!

3. 案例

  1. 搜索 E:/Dr目錄中的.doc 文件。
    @Test
    public void test(){
        File file = new File("E:/Dr");
        String suffix = ".doc";
        search(file,suffix);
    }

    public void search(File file, String suffix){
        File[] files = file.listFiles();
        //遍歷一級目錄
        for (File file1 : files) {
            //如果是一個目錄,再次執行此方法
            if(file1.isDirectory()){
                search(file1,suffix);
            }else{
                //是文件且以.doc 結尾的文件,打印其名稱名
                String name = file1.getName();
                if(name.endsWith(suffix)){
                    System.out.println(file1.getName());
                }
            }
        }
    }

文件過濾器FileFilter

  • java.io.FileFilter 是一個接口,是File的過濾器。 該接口的對象可以傳遞給File類的 listFiles(FileFilter)作爲參數, 接口中只有一個方法。

  • boolean accept(File pathname):測試pathname是否應該包含在當前File目錄中,符合則返回true。

分析

  1. 接口作爲參數,需要傳遞子類對象,重寫其中方法。我們選擇匿名內部類方式,比較簡單。

  2. accept 方法,參數爲File,表示當前File下所有的子文件和子目錄。保留住則返回true,過濾掉則返回false。保留規則:

    1. 要麼是.java文件。

    2. 要麼是目錄,用於繼續遍歷。

  3. 通過過濾器的作用, listFiles(FileFilter) 返回的數組元素中,子文件對象都是符合條件的,可以直接打印。

    /**
     * 文件過濾器FileFilter  主要用來過濾文件。想一個篩子一樣。只保留我們需要的數據
     * 見HomeWorkFour
     */

    @Test
    public void test(){
        File file = new File("E:/Dr");
        File[] files = file.listFiles(new MyFilter());
        for (File file1 : files) {
            if(file1.isFile()) System.out.println( "file1 = " + file1 );
        }
    }


class MyFilter implements FileFilter {
    @Override
    public boolean accept(File file) {
        if(file.getName().endsWith( ".jpg" )){
            return true;
        }
        return false;
    }
}

分析: FileFilter 是隻有一個方法的接口,因此可以用lambda表達式簡寫。lambda格式: ()‐>{ }

/**練習四:文件過濾器的使用
 描述:
 獲得指定文件夾下所有的java文件(不考慮子文件夾的)並輸出到控制檯
 */
public class HomeWorkFour {
    
    @Test
    public void Test01(){
        File file = new File("D:\\workspace\\day07\\src\\cn\\justweb\\Demo");
        File[] files = file.listFiles(new FileFilter(){
            @Override
            public boolean accept(File file) {
                if(file.getName().endsWith( ".java" )){
                    return true;
                }
                return false;
            }
        });
        for (File file1 : files) {
            if(file1.isFile()){
                System.out.println(file1.getName());
            }
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章