Java IO流之 File類

File類

文件和目錄路徑名的抽象表示形式。

File類可以幹些什麼呢?

  1. 可以操作文件
  2. 可以操作文件夾
  3. 可以操作文件的路徑

常用方法 和 構造方法 代碼解析:

public class Demo01 {
    public static void main(String[] args) throws IOException {
//      fun1();
//      fun2();
//      fun3();
//      fun4();
//      fun5();
//      fun6();
//      fun7();
        // 遍歷打印Test所有文件和文件夾
        File file = new File("/Users/james/Desktop/Test");
        printDiv(file);

    }

    public static void printDiv(File file) {
        File[] listFiles = file.listFiles();
        for (File file2 : listFiles) {
            if (file2.isFile()) {
                System.out.println(file2.getName());
            }else {
                printDiv(file2);
            }
        }
    }

    /**
     * 
     */
    public static void fun7() {
        File file = new File("/Users/james/Desktop/Test");
        String[] list = file.list();
        // 路徑下的所有文件及文件夾的名字(一層 以字符串形式)
        for (String string : list) {
            System.out.println(string);
        }   
        System.out.println("----------------------------");
        File[] listFiles = file.listFiles();
        // 獲取的是該文件下 文件的全路徑 以文件對象形式

        for (File file2 : listFiles) {
            System.out.println(file2);
        }
    }

    /**
     * 
     */
    public static void fun6() {
        // 和toString 方法一樣 輸出路徑 不管文件存在與否
        File file = new File("/Users/james/Desktop/Test");
        String path = file.getPath();
        System.out.println(path);
        // 獲取文件名字
        String name = file.getName();
        System.out.println(name);
        // 獲取文件大小(獲取文件佔多少字節)
        // 英文 一個字節 中午 三個字節
        long length = file.length();
        System.out.println(length);
        // 獲取父級路徑
        File parentFile = file.getParentFile();
        System.out.println(parentFile);
    }

    /**
     * 
     */
    public static void fun5() {
        // 判斷文件是否存在
        File file = new File("/Users/james/Desktop/Test/f");
        boolean directory = file.isDirectory();
        boolean file2 = file.isFile();
        System.out.println(directory);
        System.out.println(file2);
    }

    /**
     * 
     */
    public static void fun4() {
        // 刪除
        // 刪除需謹慎 不走回收站
        File file = new File("/Users/james/Desktop/Test/g");
        boolean delete = file.delete();
        // 如果文件夾下沒有子文件夾 纔可以刪除
        System.out.println(delete);
    }

    /**
     * @throws IOException
     */
    public static void fun3() throws IOException {
        // 創建文件方法
        // 該方法只能創建文件 不給後綴也是創建的文件
        File file = new File("/Users/james/Desktop/Test/HelloWord.txt");
        boolean createNewFile = file.createNewFile();
        // 文件已經存在不會在創建 
        System.out.println(createNewFile);
        File file1 = new File("src/dp.txt");
         boolean createNewFile2 = file1.createNewFile();
         System.out.println(createNewFile2);
         // 創建文件夾 
         // 帶不動後綴創建出來的都是文件夾
         // mkdir()只能創建一級的文件夾 mkdirs() 可以創建多級的
         File file2 = new File("/Users/james/Desktop/Test/g");
         boolean mkdir = file2.mkdirs();
         System.out.println(mkdir);
    }

    /**
     * 
     */
    public static void fun2() {
        // 構造方法
        /*
         * 絕對路徑
         * 硬盤上的路徑 並且 這個路徑是唯一的
         * 相對路徑
         * 相對路徑是有參照物的 
         * 
         */
        File file = new File("/Users/james/Desktop/Test");
        System.out.println(file.getAbsolutePath());
        // 判斷改路徑是否存在
        boolean exists = file.exists();
        System.out.println(exists);

        // 使用相對路徑 參照物 當前工程跟目錄
        File file1 = new File("src/wl.txt");
        boolean exists1 = file.exists();
        System.out.println(exists1);
        System.out.println(file1.getAbsolutePath());

        String parent = "/Users/james/Desktop";
        String child ="Test";
        // 使用構造方法二 
        File file2 = new File(parent, child);
        boolean exists2 = file.exists();
        System.out.println(exists2);

        // 使用構造方法三
        File F = new File(parent);
        File file3 = new File(F, child);
        boolean exists3 = file.exists();
        System.out.println(exists3);
    }

    /**
     * 
     */
    public static void fun1() {
        // File 類的靜態成員變量
        // 不同平臺下獲取的路徑分隔符不同
        // MAC 系統下 路徑分隔符:(冒號)
        // win下 是分號
        String pathseparator = File.pathSeparator;
        System.out.println(pathseparator);
        // 分隔符
        // MAC系統  /
        // win系統 \
        String separator = File.separator;
        System.out.println(separator);
    }
}

例題練習:

//2.從控制檯輸入一個字符串 該字符串是文件夾路徑 計算這個文件夾的大小
//3.從控制檯輸入一個字符串 該字符串是文件夾路徑 刪除這個文件夾
public class Demo01 {
    public static void main(String[] args) {
        //File dirFile = getDirFile();
        //deletDir(dirFile);
    }

    // 輸入路徑判斷是否是文件夾路徑 是就返回 不是就重新輸入
    public static File getDirFile() {       
        Scanner scanner = new Scanner(System.in);
        // 判斷
        while (true) {
            System.out.println("請輸入一個文件夾的路徑");
            String path = scanner.nextLine();
            // 利用傳進了的路徑創建文件對象來判斷
            File file = new File(path);
            if (!file.exists()) {
                System.out.println("輸入路徑不存在,請重新輸入");
            }else if (file.isFile()) {
                System.out.println("你輸入的是文件,請重新輸入");
            }else {
                return file;
            }

        }
    }
    // 計算文件夾大小
    public static long getDirLengthByFile(File file) {
        long sum = 0;
        // 遍歷文件夾
        File[] listFiles = file.listFiles();
        for (File subFile : listFiles) {
            // 是文件就直接計算 不是文件就繼續遍歷
            if (subFile.isFile()) {
                sum += subFile.length();
            }else {
                sum += getDirLengthByFile(subFile);
            }
        }
        return sum;
    }
    // 根據文件夾路徑刪除文件夾
    public static void deletDir(File file) {
        File[] listFiles = file.listFiles();
        for (File subFile : listFiles) {
            if (subFile.isFile()) {
                subFile.delete();
            }else {
                // 是文件夾 繼續遍歷
                deletDir(subFile);
            }
        }
        // 傳入文件夾裏面的文件及文件夾 在上面全部刪除了 這時傳進來的文件夾已經空了
        // 可以直接刪除
        file.delete();
    }
}
// 通過過濾器 遍歷文件夾 打印出小於200K的文件
public class Demo04 {
    public static void getTxTFiled(File file){
        File[] listFiles = file.listFiles(new MyFileNameFilter());
        for (File file2 : listFiles) {
            if (file2.isFile()) {
                System.out.println(file2.getName());
            }else {
                getTxTFiled(file2);
            }
        }
    }

    public static void main(String[] args) {
        File file = new File("/Users/james/Desktop/個人文件");
        // 使用重載listFile 方法
        getTxTFiled(file);
    }
}

class MyFileNameFilter implements FilenameFilter{

    //通過FilenameFilter過濾器獲取指定目錄中小於200K的小文件
    @Override
    public boolean accept(File dir, String name) {
        // 參數1. 是傳進了的文件夾跟路徑 
        // 參數2. 該路徑下的文件名字和文件夾的名字
        // 利用這兩個參數創建一個文件對象
        File file = new File(dir, name);
        // 過濾隱藏文件
        if (file.isHidden()) {
            return false;
        }
        if (file.isDirectory()) {
            return true;
        }
        return file.length() > 204800;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章