我們的程序經(jīng)常需要獲取磁盤上文件的相關信息或在磁盤上創(chuàng)建新的文件,這就需要用到File類。需要注意的是:File類的對象主要用來獲得文件本身的信息,而不涉及對文件的讀寫操作。
創(chuàng)建File類對象
創(chuàng)建File類有4個方法
· File(String filename) 通過將給定的路徑名字符串轉換為抽象路徑名來創(chuàng)建新的 File實例。
· File(URI uri) 通過將給定的 file: URI轉換為抽象路徑名來創(chuàng)建新的 File實例。
· File(File parent, String child) 從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實例。
· File(String parent, String child) 從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實例。
獲取文件的屬性
經(jīng)常使用File類的下列方法來獲取文件本身的一些信息
· public boolean exists() 判斷文件或目錄是否存在。
· public boolean isFile() 判斷文件是否是一個普通文件,而不是目錄。
· public boolean isDirectory() 判斷文件是否是一個目錄。
· public boolean isHidden() 判斷文件是否是隱藏文件。
· public boolean canRead() 判斷文件是否是可讀的。
· public boolean canWrite() 判斷文件是否是可寫的。
· public String getName() 獲取文件名字。
· public String getAbsolutePath() 獲取文件的絕對路徑。
· public String getParent() 獲取文件的父目錄。
· public long length() 獲取文件長度(單位是字節(jié))。
· public long lastModified() 獲取文件最后的修改時間(單位是毫秒)。
測試類 FileTest.java
準備工作:在桌面上新建一個文件夾dirTest,再在里面新建一個文本文檔,完整路徑為:C:\Users\PRO\Desktop\dirTest\fileTest.txt,里面隨便寫點什么內容。
package com.fs.file;
import java.io.File;
public class FileTest {
public static void main(String[] args) {
// 獲取文件對象,注意使用轉義字符
File file = new File("C:\\Users\\PRO\\Desktop\\dirTest\\fileTest.txt");
// 判斷文件是否存在 true
System.out.println(file.exists());
// 判斷文件是否是一個普通文件 true
System.out.println(file.isFile());
// 判斷文件是否是一個目錄 false
System.out.println(file.isDirectory());
// 判斷文件是否可讀 true
System.out.println(file.canRead());
// 判斷文件是否可寫 true
System.out.println(file.canWrite());
// 判斷文件是否隱藏 false
System.out.println(file.isHidden());
// 獲取文件名字 fileTest.txt
System.out.println(file.getName());
// 獲取文件絕對路徑 C:\Users\PRO\Desktop\dirTest\fileTest.txt
System.out.println(file.getAbsolutePath());
// 獲取文件的父目錄 C:\Users\PRO\Desktop\dirTest
System.out.println(file.getParent());
// 獲取文件長度 9971
System.out.println(file.length());
// 獲取文件最后修改時間 1517796006952
System.out.println(file.lastModified());
}
}
目錄
目錄與文件的創(chuàng)建與刪除
· public boolean createNewFile() 創(chuàng)建普通文件。
· public boolean mkdir() 創(chuàng)建目錄。
· public boolean delete() 刪除文件或目錄。
列出目錄中的文件
· public String[] list() 用字符串的形式返回目錄下的全部文件
· public File[] listFiles() 用File對象的形式返回目錄下的全部文件
· public String[] list(FilenameFilter obj) 用字符串的形式返回目錄下指定類型的全部文件
· public File[] listFiles(FilenameFilter obj) 用File對象的形式返回目錄下指定類型的全部文件
FilenameFliter接口
· 該接口有一個方法,第一個參數(shù)是指要查詢的文件夾,第二個參數(shù)是指指定的類型
public boolean accept(File dir, String name);
· 當File對象是一個目錄且調用list(FilenameFilter obj)或listFiles(FilenameFilter obj)方法時,obj不斷回掉接口方法,當返回值為true時,list方法就將名字為name的文件存放到返回的數(shù)組中。
測試類 DirTest.java
package com.fs.file;
import java.io.File;import java.io.FilenameFilter;import java.io.IOException;import java.util.Arrays;
public class DirTest {
public static void main(String[] args) throws IOException {
// 獲取File的目錄對象
File dirFile = new File("C:\\Users\\PRO\\Desktop\\dirTest2");
// 在磁盤中創(chuàng)建目錄
System.out.println(dirFile.mkdir());
// 在目錄中循環(huán)創(chuàng)建5個txt文件和java文件
for (int i = 0; i < 5; i++) {
File txtFile = new File("C:\\Users\\PRO\\Desktop\\dirTest2\\texFile" + i + ".txt");
File javaFile = new File("C:\\Users\\PRO\\Desktop\\dirTest2\\javaFile" + i + ".java");
System.out.println(txtFile.createNewFile());
System.out.println(javaFile.createNewFile());
}
// 數(shù)組里面裝的是文件名 如javaFile0.java
String[] list = dirFile.list();
System.out.println(Arrays.toString(list));
// 數(shù)組里面裝的是文件,以全路徑的方式表現(xiàn)出來 如C:\Users\PRO\Desktop\dirTest2\javaFile0.java
File[] listFiles = dirFile.listFiles();
System.out.println(Arrays.toString(listFiles));
// 通過匿名內部類的方式來實現(xiàn)FilenameFilter接口,獲取所有以“.java”結尾的文件
String[] javaList = dirFile.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
});
System.out.println(Arrays.toString(javaList));
// 通過自己編寫類來實現(xiàn)FilenameFilter接口,獲取所有以“.txt”結尾的文件
MyFlieFilter myFlieFilter = new MyFlieFilter(".txt");
String[] txtList = dirFile.list(myFlieFilter);
System.out.println(Arrays.toString(txtList));
}
}
自己編寫的實現(xiàn)FilenameFiler接口的類 MyFlieFilter.java
package com.fs.file;
import java.io.File;import java.io.FilenameFilter;
public class MyFlieFilter implements FilenameFilter{
// 定義一個私有變量,表示要查找的文件類型
private String filerName;
// 重寫接口中的方法
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.endsWith(filerName);
}
public String getFilerName() {
return filerName;
}
public void setFilerName(String filerName) {
this.filerName = filerName;
}
public MyFlieFilter(String filerName) {
super();
this.filerName = filerName;
}
}
小案例 刪除指定文件夾(如緩存目錄)ClearCache.java
· 我們知道,普通文件能直接刪除,但是當目錄下還有文件或目錄時,不能直接調用delete()方法刪除目錄,那么我們就只能通過遞歸來刪除目錄了。
package com.fs.file;
import java.io.File;import java.io.IOException;
public class ClearCache {
public static void main(String[] args) throws IOException {
// creatCacheDir();
File file = new File("C:\\Users\\PRO\\Desktop\\cacheTest");
deleteAllFile(file);
}
// 創(chuàng)建緩存文件夾,里面包含多個文件夾和文件,并還有多層結構
public static void creatCacheDir() throws IOException {
File cacheDir = new File("C:\\Users\\PRO\\Desktop\\cacheTest");
cacheDir.mkdir();
for (int i = 0; i < 5; i++) {
File childDir = new File("C:\\Users\\PRO\\Desktop\\cacheTest\\childDir" + i);
File childFile = new File("C:\\Users\\PRO\\Desktop\\cacheTest\\childFile" + i);
childDir.mkdir();
childFile.createNewFile();
for (int j = 0; j < 5; j++) {
File grandChildDir = new File("C:\\Users\\PRO\\Desktop\\cacheTest\\childDir" + i + "\\grandChildDir" + j);
File grandChildFile = new File("C:\\Users\\PRO\\Desktop\\cacheTest\\childDir" + i + "\\grandChildFile" + j);
grandChildDir.mkdir();
grandChildFile.createNewFile();
}
}
}
// 遞歸刪除文件夾
public static void deleteAllFile(File file) {
// 如果文件為空,直接返回
if (file == null) {
return;
}
if (file.exists()) {
if (file.isFile()) {
// 如果該文件是普通文件,直接刪除
file.delete();
System.out.println("已刪除文件" + file.getName());
} else if (file.isDirectory()) {
// 如果該文件是目錄,則循環(huán)遍歷該目錄,再遞歸刪除該文件
// 獲得該目錄下所有文件
File[] files = file.listFiles();
// 跳出遞歸條件:該目錄下文件已經(jīng)被刪完
if (files == null) {
return;
}
// 自己調用自己,遞歸刪除文件
for (File subFile : files) {
deleteAllFile(subFile);
}
}
// 刪除文件本身
file.delete();
}
}
}