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. 案例
- 搜索
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。分析:
接口作爲參數,需要傳遞子類對象,重寫其中方法。我們選擇匿名內部類方式,比較簡單。
accept
方法,參數爲File,表示當前File下所有的子文件和子目錄。保留住則返回true,過濾掉則返回false。保留規則:
要麼是.java文件。
要麼是目錄,用於繼續遍歷。
通過過濾器的作用,
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());
}
}
}
}