File類將文件和文件夾以及路徑封裝成對象功舀,以提供更多的方法和屬性來操作這些對象。File類不屬于流對象身弊,不能讀寫文件辟汰,但是可以作為參數(shù)傳遞給流對象的構(gòu)造方法。
File學(xué)習(xí)的核心要點就是要熟練掌握其方法阱佛,配合其它對象帖汞,實現(xiàn)更多的功能。
一凑术、File類中的靜態(tài)常量
-
Windows下:
public static String separator
翩蘸,這是windows中的目錄分隔符:\\
public static String separatorChar
和上面一樣,類型不一樣public stativ String pathSeparator
淮逊,路徑分隔符:;
public stativ char pathSeparatorChar char
類型的路徑分隔符 Linux下名字和類型都一樣催首,只是值不一樣。目錄分隔符為:
/
路徑分隔符為::
二泄鹏、File類下的構(gòu)造方法
-
File(String pathname)
傳遞一個字符串類型的路徑(路徑可以目錄的絕對地址郎任,也可以是相對地址,更可以是文件备籽,下同舶治,都稱之為路徑),將次路徑封裝成為一個File對象 -
File(String parent, String child)
傳遞字符串形式的子父路徑,注意子和父是相對的概念 -
File(File parent, String child)
傳遞字符串形式的子和文件對象的父
三歼疮、File類的創(chuàng)建方法
以下方法杂抽,當(dāng)目標(biāo)路徑存在時,均會返回false韩脏,創(chuàng)建成功返回true
-
boolean createNewFile()
創(chuàng)建文件缩麸,注意也只能創(chuàng)建文件,并不能創(chuàng)建目錄 -
boolean mkdir()
創(chuàng)建文件夾赡矢,注意只能創(chuàng)建一級目錄 -
boolean mkdirs()
創(chuàng)建多級目錄
四杭朱、File類的刪除方法
-
boolean delete()
刪除指定目錄或者文件,成功返回true吹散,注意此刪除不走回收站弧械,文件夾不為空時沒有辦法刪除 -
void deleteOnExit()
jvm退出前刪除,個人感覺用處不是很廣泛
五空民、File類的判斷方法
-
boolean exists()
判斷構(gòu)造方法中封裝的路徑或者文件是否存在 -
boolean isAbsolute()
判斷構(gòu)造方法中封裝的路徑是不是絕對路徑刃唐,是返回真 -
boolean isDirectory()
判斷是不是路徑,是返回true -
boolean isFile()
判斷是不是文件界轩,是返回true -
boolean isHidden()
判斷封裝的路徑(包括文件)是不是隱藏屬性是返回true
六画饥、File類的獲取方法
-
String getName()
獲取封裝路徑最后部分的名字,此方法不會判斷路徑是否存在浊猾,使用之前最好判斷柒啤,如果是文件的話當(dāng)然獲取到的也就是文件的名字了 -
String getParent()
返回封裝路徑的父路徑傻谁,注意封裝的是相對路徑時如果相對路徑?jīng)]有父路徑线椰,就會出錯 -
File getParentFile()
返回封裝路徑的父路徑的File對象 -
String getAbsolutePath()
返回封裝路徑的絕對路徑 -
File getAbsoluteFile()
返回封裝路徑的絕對路徑的File對象
七女坑、File類的其他方法
-
boolean renameTo(File f)
重命名,F(xiàn)ile封裝一個路徑偷办,這個對象調(diào)用renameTo
(修改后的路徑的File對象)艰额,修改成功返回真,失敗返回假爽篷。修改名字后路徑不同悴晰,方法renameTo
帶有剪切效果 -
long lastModified()
返回File構(gòu)造方法封裝的路徑中文件的最后修改時間的毫秒值 -
boolean setLastModified(long time)
能查就能改
八慢睡、File的list方法
-
static File[] listRoots()
靜態(tài)的方法逐工,列出系統(tǒng)所以的根,光驅(qū)和移動設(shè)備存儲也會算進去 -
String[] list()
返回File構(gòu)造方法封裝的路徑下的所有文件和文件夾 -
File[] listFiles()
返回File構(gòu)造方法封裝的路徑下的所有文件和文件夾漂辐,返回的File的對象泪喊,帶全路徑。
注意:
如果空目錄調(diào)用了listFiles()髓涯,會返回一個長度為0的File數(shù)組袒啼,但是如果是文件調(diào)用了此方法,則會返回null。前后兩者是有實質(zhì)性區(qū)別的蚓再』猓空目錄是存在長度為0的數(shù)組,文件是不存在摘仅,也就是null靶庙;
九、list方法的文件過濾器
一般遍歷目錄時娃属,只想要獲取特定類型的文件六荒,其他的文件都必須過濾掉,這個就是文件過濾器的用處矾端。
FileFilter只是一個接口掏击,使用的時候需要自己實現(xiàn)來達(dá)到過濾文件的目的。FileFilter接口下只有一個accept()方法秩铆,所以使用的時候可以考慮使用匿名內(nèi)部類來實現(xiàn)砚亭。具體用法就是講FileFilter接口的實現(xiàn)對象傳入list方法中即可。
一般實現(xiàn)accept方法的時候殴玛,建議將封裝了純路徑的對象返回為true钠惩,否則如果剔除掉子目錄的話就沒有辦法遞歸進入到子目錄下。
以上一到九標(biāo)題下的所有練習(xí)全部提供在一個demo中:
package file;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Date;
import java.text.DateFormat;
/*
* file的練習(xí)
*/
public class FileDemo {
public static void main(String[] args) throws Exception {
mehtod_8();
}
/*
* file類的四個靜態(tài)常量
* public static String separator 與系統(tǒng)有關(guān)的目錄分隔符 Windows中 :\
* public static char separatorChar Linux中: /
* public static String pathSeparator 與系統(tǒng)有關(guān)的路徑分隔符 Windows中 ; 分號
* public static char pathSeparatorChar Linux中 : 冒號
*/
public static void method(){
File f = new File("E:\\");
String s = f.separator;
System.out.println(s);
s = f.pathSeparator;
System.out.println(s);
}
/*
* file 類的構(gòu)造方法
* 1. File(String pathName)
* 2. File(String parent, String child)
* 3. File(File parent, String child)
*/
public static void method_1(){
File f = new File("E:\\gama");
File f1 = new File("E:\\","game");
File f2 = new File(f,"gama");
System.out.println(f);
System.out.println(f1);
System.out.println(f2);
}
/* File類的創(chuàng)建方法 ,目標(biāo)文件或者路徑存在時族阅,均會返回false
* 1. boolean createNewFile() 創(chuàng)建文件篓跛,成功返回true
* 2. boolean mkdir() 創(chuàng)建文件夾,成功返回true坦刀,只能創(chuàng)建一級目錄
* 3. boolean mkdirs() 創(chuàng)建多級文件夾
*/
public static void method_2() throws IOException{
File f = new File("E:\\TEST.md");
System.out.println(f.createNewFile());
File f1 = new File("E:\\TEST\\TEST\\TEST\\");
System.out.println(f1.mkdirs());
}
/* File類的刪除方法
* 1. boolean delete() 刪除指定目錄或者文件愧沟,成功返回true,注意此刪除不走回收站鲤遥,文件夾不為空時沒有辦法刪除
* 2. void deleteOnExit() jvm退出前刪除沐寺,
*/
public static void method_3() throws Exception{
File f = new File("E:\\1.txt");
//System.out.println(f.delete());
f.deleteOnExit();
Thread.sleep(5000);
}
/* File類的判斷方法
* 1. boolean exists() 判斷構(gòu)造方法中封裝的路徑或者文件是否存在
* boolean isAbsolute() 判斷構(gòu)造方法中封裝的路徑是不是絕對路徑,是返回真
* boolean isDirectory() 判斷是不是路徑盖奈,是返回true
* boolean isFile() 判斷是不是文件混坞,是返回true
* boolean isHidden() 判斷封裝的路徑(包括文件)是不是隱藏屬性是返回true
*/
public static void method_4() throws Exception{
File f = new File("E:\\a7d03c85ed46e9d87d8f766ec0be65de");
System.out.println(f.exists());
System.out.println(f.isAbsolute());
}
/*
* File類的獲取方法
* 1.String getName() 獲取封裝路徑最后部分的名字,此方法不會判斷路徑是否存在钢坦,使用之前最好判斷
* 2.String getParent() 返回封裝路徑的父路徑
* 3.File getParentFile() 返回封裝路徑的父路徑的File對象
* 4.String getAbsolutePath() 返回封裝路徑的絕對路徑
* 5.File getAbsoluteFile() 返回封裝路徑的絕對路徑的File對象
*/
public static void method_5() {
File f = new File("src");
System.out.println(f.getAbsoluteFile().getParent());
}
/*File的其他方法
* 1.boolean renameTo(File f)重命名究孕,F(xiàn)ile封裝一個路徑,這個對象調(diào)用renameTo(修改后的路徑的File對象)爹凹,
* 修改成功返回真厨诸,失敗返回假。修改名字后路徑不同禾酱,方法renameTo帶有剪切效果
* 2.long lastModified()返回File構(gòu)造方法封裝的路徑中文件的最后修改時間的毫秒值
* 3.boolean setLastModified(long time) 能查就能改
*/
public static void method_6() {
File f = new File("H:\\project\\Demo\\src\\io\\BufferedReaderDemo.java");
long time = f.lastModified();
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);
String date = df.format(new Date(time));
System.out.println(date);
f.setLastModified(new Date().getTime());
date = df.format(new Date(f.lastModified()));
System.out.println(date);
}
/*
* File的list方法
* 1. static File[] listRoots() 靜態(tài)的方法微酬,列出系統(tǒng)所以的根绘趋,光驅(qū)和移動設(shè)備存儲也會算進去
* 2. String[] list()返回File構(gòu)造方法封裝的路徑下的所有文件和文件夾
* 3. File[] listFiles()返回File構(gòu)造方法封裝的路徑下的所有文件和文件夾,返回的Filed對象颗管,帶全路徑
*/
public static void method_7(){
File[] roots = File.listRoots();
for(File f: roots){
System.out.println(f);
}
}
/*
* 文件過濾打印
*/
public static void mehtod_8(){
File dir = new File("G:\\");
FilesFilter(dir);
}
//遞歸過濾方法的實現(xiàn)陷遮,選出目錄下的*.java文件
//直接使用匿名內(nèi)部內(nèi)實現(xiàn)了FileFilter接口
public static void FilesFilter(File file) {
File[] files = file.listFiles(
new FileFilter(){
public boolean accept(File pathname){ //使用匿名內(nèi)部類實現(xiàn)文件過濾器的接口
if(pathname.getName().endsWith(".java") || pathname.isDirectory()){
return true;
}else{
return false;
}
}
});
if (files != null) {
for (File f : files) {
if (f.isFile()) {
System.out.println(f);
} else
FilesFilter(f);
}
}
}
}
十、遞歸方法
所謂遞歸就是方法自身調(diào)用自身垦江,層層調(diào)用拷呆,知道最底層的方法完成后一層層的退出知道最外層方法結(jié)束。比較的常見的就是文件的遍歷和實現(xiàn)斐波那契數(shù)列等等疫粥。
遞歸可以一定程度上減少代碼量茬斧,提高代碼的可讀性,也容易實現(xiàn)梗逮。但是缺點就是不能遞歸太多次项秉,否則方法調(diào)用太多會占用太多的系統(tǒng)資源。
下面給出一個遞歸遍歷全盤的demo:
package file;
/*
* 一個練習(xí)慷彤,統(tǒng)計電腦里面文件的總數(shù)
* 思路:遞歸
*
* 輸出(感覺C盤部分文件沒有統(tǒng)計到娄蔼,有點少):
* C:\目錄下有文件:205263個
* D:\目錄下有文件:0個
* E:\目錄下有文件:34746個
* F:\目錄下有文件:3025個
* G:\目錄下有文件:5616個
* H:\目錄下有文件:141762個
* 390412
*/
import java.io.File;
public class FileTest {
public static void main(String[] args) {
File[] files = File.listRoots();
long filesNum = 0;
long temp = 0;
for (File f : files) {
filesNum = filesNum + countFiles(f);
System.out.println(f + "目錄下有文件:" + (filesNum-temp) + "個");
temp = filesNum;
}
System.out.println(filesNum);
}
public static long countFiles(File file) {
long FilesNum = 0;
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
if (f.isFile()) {
FilesNum++;
} else
FilesNum = FilesNum + countFiles(f);
}
}
return FilesNum;
}
/*
* 斐波那契數(shù)列實現(xiàn)
*/
public static int getSum(int months){
if(months == 1 || months ==2)
return 1;
return getSum(months-1) + getSum(months-2);
}
}