File類和Lambda表示式的使用
阿新 • • 發佈:2022-04-01
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(".");
}
}