1. 程式人生 > 其它 >File類和Lambda表示式的使用

File類和Lambda表示式的使用

File類

File類的每一個例項可以表示硬碟(檔案系統)中的一個檔案或目錄(實際上表示的是一個抽象路徑)

使用File可以做到:

  • 1:訪問其表示的檔案或目錄的屬性資訊,例如:名字,大小,修改時間等等
  • 2:建立和刪除檔案或目錄
  • 3:訪問一個目錄中的子項

但是File不能訪問檔案資料.

public class FileDemo {
    public static void main(String[] args) {
        //使用File訪問當前專案目錄下的demo.txt檔案
        /*
            建立File時要指定路徑,而路徑通常使用相對路徑。
            相對路徑的好處在於有良好的跨平臺性。
            "./"是相對路徑中使用最多的,表示"當前目錄",而當前目錄是哪裡
            取決於程式執行環境而定,在idea中執行java程式時,這裡指定的
            當前目錄就是當前程式所在的專案目錄。
         */
//        File file = new File("c:/xxx/xxx/xx/xxx.txt");
        File file = new File("./demo.txt");
        //獲取名字
        String name = file.getName();
        System.out.println(name);
        //獲取檔案大小(單位是位元組)
        long len = file.length();
        System.out.println(len+"位元組");
        //是否可讀可寫
        boolean cr = file.canRead();
        boolean cw = file.canWrite();
        System.out.println("是否可讀:"+cr);
        System.out.println("是否可寫:"+cw);
        //是否隱藏
        boolean ih = file.isHidden();
        System.out.println("是否隱藏:"+ih);

    }

}
建立一個新檔案

createNewFile()方法,可以建立一個新檔案

package file;

import java.io.File;
import java.io.IOException;

/**
 * 使用File建立一個新檔案
 */
public class CreateNewFileDemo {
    public static void main(String[] args) throws IOException {
        //在當前目錄下新建一個檔案:test.txt
        File file = new File("./test.txt");
        //boolean exists()判斷當前File表示的位置是否已經實際存在該檔案或目錄
        if(file.exists()){
            System.out.println("該檔案已存在!");
        }else{
            file.createNewFile();//將File表示的檔案創建出來
            System.out.println("檔案已建立!");
        }

    }
}
刪除一個檔案

delete()方法可以將File表示的檔案刪除

package file;

import java.io.File;

/**
 * 使用File刪除一個檔案
 */
public class DeleteFileDemo {
    public static void main(String[] args) {
        //將當前目錄下的test.txt檔案刪除
        /*
            相對路徑中"./"可以忽略不寫,預設就是從當前目錄開始的。
         */
        File file = new File("test.txt");
        if(file.exists()){
            file.delete();
            System.out.println("檔案已刪除!");
        }else{
            System.out.println("檔案不存在!");
        }
    }
}
建立目錄

mkDir():建立當前File表示的目錄

mkDirs():建立當前File表示的目錄,同時將所有不存在的父目錄一同建立

package file;

import java.io.File;

/**
 * 使用File建立目錄
 */
public class MkDirDemo {
    public static void main(String[] args) {
        //在當前目錄下新建一個目錄:demo
//        File dir = new File("demo");
        File dir = new File("./a/b/c/d/e/f");

        if(dir.exists()){
            System.out.println("該目錄已存在!");
        }else{
//            dir.mkdir();//建立目錄時要求所在的目錄必須存在
            dir.mkdirs();//建立目錄時會將路徑上所有不存在的目錄一同建立
            System.out.println("目錄已建立!");
        }
    }
}
刪除目錄

delete()方法可以刪除一個目錄,但是隻能刪除空目錄。

package file;

import java.io.File;

/**
 * 刪除一個目錄
 */
public class DeleteDirDemo {
    public static void main(String[] args) {
        //將當前目錄下的demo目錄刪除
        File dir = new File("demo");
//        File dir = new File("a");
        if(dir.exists()){
            dir.delete();//delete方法刪除目錄時只能刪除空目錄
            System.out.println("目錄已刪除!");
        }else{
            System.out.println("目錄不存在!");
        }
    }
}
訪問一個目錄中的所有子項

listFiles方法可以訪問一個目錄中的所有子項

package file;

import java.io.File;

/**
 * 訪問一個目錄中的所有子項
 */
public class ListFilesDemo1 {
    public static void main(String[] args) {
        //獲取當前目錄中的所有子項
        File dir = new File(".");
        /*
            boolean isFile()
            判斷當前File表示的是否為一個檔案
            boolean isDirectory()
            判斷當前File表示的是否為一個目錄
         */
        if(dir.isDirectory()){
            /*
                File[] listFiles()
                將當前目錄中的所有子項返回。返回的陣列中每個File例項表示其中的一個子項
             */
            File[] subs = dir.listFiles();
            System.out.println("當前目錄包含"+subs.length+"個子項");
            for(int i=0;i<subs.length;i++){
                File sub = subs[i];
                System.out.println(sub.getName());
            }
        }
    }
}
獲取目錄中符合特定條件的子項

過載的listFiles方法:File[] listFiles(FileFilter)

該方法要求傳入一個檔案過濾器,並僅將滿足該過濾器要求的子項返回。

package file;

import java.io.File;
import java.io.FileFilter;

/**
 * 過載的listFiles方法,允許我們傳入一個檔案過濾器從而可以有條件的獲取一個目錄
 * 中的子項。
 */
public class ListFilesDemo2 {
    public static void main(String[] args) {
        /*
            需求:獲取當前目錄中所有名字以"."開始的子項
         */
        File dir = new File(".");
        if(dir.isDirectory()){
//            FileFilter filter = new FileFilter(){//匿名內部類建立過濾器
//                public boolean accept(File file) {
//                    String name = file.getName();
//                    boolean starts = name.startsWith(".");//名字是否以"."開始
//                    System.out.println("過濾器過濾:"+name+",是否符合要求:"+starts);
//                    return starts;
//                }
//            };
//            File[] subs = dir.listFiles(filter);//方法內部會呼叫accept方法

            
            File[] subs = dir.listFiles(new FileFilter(){
                public boolean accept(File file) {
                    return file.getName().startsWith(".");
                }
            });
            System.out.println(subs.length);
        }
    }
}

Lambda表示式

JDK8之後,java支援了lambda表示式這個特性.

  • lambda可以用更精簡的程式碼建立匿名內部類.但是該匿名內部類實現的介面只能有一個抽象方法,否則無法使用!
  • lambda表示式是編譯器認可的,最終會將其改為內部類編譯到class檔案中
package lambda;

import java.io.File;
import java.io.FileFilter;

/**
 * JDK8之後java支援了lambda表示式這個特性
 * lambda表示式可以用更精簡的語法建立匿名內部類,但是實現的介面只能有一個抽象
 * 方法,否則無法使用。
 * lambda表示式是編譯器認可的,最終會被改為內部類形式編譯到class檔案中。
 *
 * 語法:
 * (引數列表)->{
 *     方法體
 * }
 */
public class LambdaDemo {
    public static void main(String[] args) {
        //匿名內部類形式建立FileFilter
        FileFilter filter = new FileFilter() {
            public boolean accept(File file) {
                return file.getName().startsWith(".");
            }
        };

        FileFilter filter2 = (File file)->{
            return file.getName().startsWith(".");
        };

        //lambda表示式中引數的型別可以忽略不寫
        FileFilter filter3 = (file)->{
            return file.getName().startsWith(".");
        };

        /*
            lambda表示式方法體中若只有一句程式碼,則{}可以省略
            如果這句話有return關鍵字,那麼return也要一併省略!
         */
        FileFilter filter4 = (file)->file.getName().startsWith(".");
    }
}