一、File類
1.File類中的靜態的成員字段
static String pathSeparator
與系統有關的路徑分隔符,爲了方便,它被表示爲一個字符串。
多個路徑之間的一個分隔符號,win用的是分號 linux用的是冒號
static char pathSeparatorChar
與系統有關的路徑分隔符。
static String separator
與系統有關的默認名稱分隔符,爲了方便,它被表示爲一個字符串。
多個文件或者文件夾的分隔符,win用的是\ linux用的是/
static char separatorChar
與系統有關的默認名稱分隔符
2.絕對路徑和相對路徑
絕對路徑:從盤符開始,一直到最後的文件/文件夾的名稱截止
例如:D:\雙元課堂\所需軟件\dom4j-1.6.1.zip
相對路徑:IDEA工具中指的是當前的項目根目錄而言
3.構造方法
File(String pathName); 根據傳入的字符串路徑來創建一個File對象
File(String parent,String child); 根據傳入的父類型字符串路徑和傳入的子類型字符串路徑來創建一個File對象
File(File parent,String child); 根據傳入的父類型File對象和傳入的子類型字符串路徑來創建一個File對象
示例代碼:
public class Demo02File {
public static void main(String[] args) {
/*
File類的構造方法
*/
//show02("c:\\","a.txt");//c:\a.txt
//show02("d:\\","a.txt");//d:\a.txt
show03();
File f = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan");
long length = f.length();
System.out.println(length);
}
/*
File(File parent, String child) 根據 parent 抽象路徑名和 child 路徑名字符串創建一個新 File 實例。
參數:把路徑分成了兩部分
File parent:父路徑
String child:子路徑
好處:
父路徑和子路徑,可以單獨書寫,使用起來非常靈活;父路徑和子路徑都可以變化
父路徑是File類型,可以使用File的方法對路徑進行一些操作,再使用路徑創建對象
*/
private static void show03() {
File parent = new File("c:\\");
File file = new File(parent,"hello.java");
System.out.println(file);//c:\hello.java
}
/*
File(String parent, String child) 根據 parent 路徑名字符串和 child 路徑名字符串創建一個新 File 實例。
參數:把路徑分成了兩部分
String parent:父路徑
String child:子路徑
好處:
父路徑和子路徑,可以單獨書寫,使用起來非常靈活;父路徑和子路徑都可以變化
*/
private static void show02(String parent, String child) {
File file = new File(parent,child);
System.out.println(file);//c:\a.txt
}
/*
File(String pathname) 通過將給定路徑名字符串轉換爲抽象路徑名來創建一個新 File 實例。
參數:
String pathname:字符串的路徑名稱
路徑可以是以文件結尾,也可以是以文件夾結尾
路徑可以是相對路徑,也可以是絕對路徑
路徑可以是存在,也可以是不存在
創建File對象,只是把字符串路徑封裝爲File對象,不考慮路徑的真假情況
*/
private static void show01() {
File f1 = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan\\a.txt");
System.out.println(f1);//重寫了Object類的toString方法 C:\Users\itcast\IdeaProjects\shungyuan\a.txt
File f2 = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan");
System.out.println(f2);//C:\Users\itcast\IdeaProjects\shungyuan
File f3 = new File("b.txt");
System.out.println(f3);//b.txt
}
}
4.File類獲取方法
String getAbsolutePath(): 獲取絕對路徑
String getPath(): 獲取路徑,其實就是構造方法中的路徑
String getName(): 獲取文件/文件夾的名稱
long length(): 獲取文件的大小
示例代碼:
public class Demo03File {
public static void main(String[] args) {
show04();
}
/*
public long length() :返回由此File表示的文件的長度。
獲取的是構造方法指定的文件的大小,以字節爲單位
注意:
文件夾是沒有大小概念的,不能獲取文件夾的大小
如果構造方法中給出的路徑不存在,那麼length方法返回0
*/
private static void show04() {
File f1 = new File("C:\\develop\\a\\1.jpg");
long l1 = f1.length();
System.out.println(l1);//780831字節
File f2 = new File("C:\\develop\\a\\2.jpg");
System.out.println(f2.length());//0
File f3 = new File("C:\\develop\\a");
System.out.println(f3.length());//0 文件夾沒有大小概念的
}
/*
public String getName() :返回由此File表示的文件或目錄的名稱。
獲取的就是構造方法傳遞路徑的結尾部分(文件/文件夾)
*/
private static void show03() {
File f1 = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan\\a.txt");
String name1 = f1.getName();
System.out.println(name1);//a.txt
File f2 = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan");
String name2 = f2.getName();
System.out.println(name2);//shungyuan
}
/*
public String getPath() :將此File轉換爲路徑名字符串。
獲取的構造方法中傳遞的路徑
toString方法調用的就是getPath方法
源碼:
public String toString() {
return getPath();
}
*/
private static void show02() {
File f1 = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan\\a.txt");
File f2 = new File("a.txt");
String path1 = f1.getPath();
System.out.println(path1);//C:\Users\itcast\IdeaProjects\shungyuan\a.txt
String path2 = f2.getPath();
System.out.println(path2);//a.txt
System.out.println(f1);//C:\Users\itcast\IdeaProjects\shungyuan\a.txt
System.out.println(f1.toString());//C:\Users\itcast\IdeaProjects\shungyuan\a.txt
}
/*
public String getAbsolutePath() :返回此File的絕對路徑名字符串。
獲取的構造方法中傳遞的路徑
無論路徑是絕對的還是相對的,getAbsolutePath方法返回的都是絕對路徑
*/
private static void show01() {
File f1 = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan\\a.txt");
String absolutePath1 = f1.getAbsolutePath();
System.out.println(absolutePath1);//C:\Users\itcast\IdeaProjects\shungyuan\a.txt
File f2 = new File("a.txt");
String absolutePath2 = f2.getAbsolutePath();
System.out.println(absolutePath2);//C:\Users\itcast\IdeaProjects\shungyuan\a.txt
}
}
5.File類的判斷方法
boolean exists() 判斷文件或者文件路徑是否存在
boolean isDirectory() 判斷路徑是否是一個文件夾路徑
boolean isFile() 判斷路徑是否是一個文件路徑
boolean isHidden(); 判斷文件是否是隱藏的
示例代碼:
public class Demo04File {
public static void main(String[] args) {
show02();
}
/*
public boolean isDirectory() :此File表示的是否爲目錄。
用於判斷構造方法中給定的路徑是否以文件夾結尾
是:true
否:false
public boolean isFile() :此File表示的是否爲文件。
用於判斷構造方法中給定的路徑是否以文件結尾
是:true
否:false
注意:
電腦的硬盤中只有文件/文件夾,兩個方法是互斥
這兩個方法使用前提,路徑必須是存在的,否則都返回false
*/
private static void show02() {
File f1 = new File("C:\\Users\\itcast\\IdeaProjects\\shung");
//不存在,就沒有必要獲取
if(f1.exists()){
System.out.println(f1.isDirectory());
System.out.println(f1.isFile());
}
File f2 = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan");
if(f2.exists()){
System.out.println(f2.isDirectory());//true
System.out.println(f2.isFile());//false
}
File f3 = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan\\shungyuan.iml");
if(f3.exists()){
System.out.println(f3.isDirectory());//false
System.out.println(f3.isFile());//true
}
}
/*
public boolean exists() :此File表示的文件或目錄是否實際存在。
用於判斷構造方法中的路徑是否存在
存在:true
不存在:false
*/
private static void show01() {
File f1 = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan");
System.out.println(f1.exists());//true
File f2 = new File("C:\\Users\\itcast\\IdeaProjects\\shung");
System.out.println(f2.exists());//false
File f3 = new File("shungyuan.iml");//相對路徑 C:\Users\itcast\IdeaProjects\shungyuan\shungyuan.iml
System.out.println(f3.exists());//true
File f4 = new File("a.txt");
System.out.println(f4.exists());//false
}
}
6.File類的創建和刪除的方法
boolean createNewFile() 創建一個新的文件(如果文件不存在則創建)
boolean delete() 刪除文件/文件夾(刪除文件夾要求文件夾必須是空的)
boolean mkdir() 創建一個文件夾 d:\\abc\\bcd
boolean mkdirs() 創建多級文件夾
示例代碼:
public class Demo02 {
public static void main(String[] args) throws IOException {
File f1 = new File("d:\\abc");
//createNewFile() 創建一個新的文件(如果文件不存在則創建)
//System.out.println(f1.createNewFile());
//delete() 刪除文件/文件夾(刪除文件夾要求文件夾必須是空的)
//System.out.println(f1.delete());
//System.out.println(f1.delete());
//mkdir() 創建一個文件夾 d:\\abc\\bcd
//System.out.println(f1.mkdir());
//mkdirs() 創建多級文件夾
System.out.println(f1.mkdirs());
}
}
7.File類的遍歷的方法
String[] list() 獲取當前文件夾下的所有的內容,返回到一個字符串數組中
File[] listFiles() 獲取當前文件夾下的所有的內容,返回到一個File數組中
示例代碼:
public class Demo06File {
public static void main(String[] args) {
show02();
}
/*
public File[] listFiles() :返回一個File數組,表示該File目錄中的所有的子文件或目錄。
遍歷構造方法中給出的目錄,會獲取目錄中所有的文件/文件夾,把文件/文件夾封裝爲File對象,多個File對象存儲到File數組中
*/
private static void show02() {
File file = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan\\08_FileAndRecursion");
File[] files = file.listFiles();
if(files != null) {
for (File f : files) {
System.out.println(f);
}
}
}
/*
public String[] list() :返回一個String數組,表示該File目錄中的所有子文件或目錄。
遍歷構造方法中給出的目錄,會獲取目錄中所有文件/文件夾的名稱,把獲取到的多個名稱存儲到一個String類型的數組中
*/
private static void show01() {
//File file = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan\\08_FileAndRecursion\\1.txt");//NullPointerException
//File file = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan\\08_Fi");//NullPointerException
File file = new File("C:\\Users\\itcast\\IdeaProjects\\shungyuan\\08_FileAndRecursion");
String[] arr = file.list();
if(arr != null) {
for (String fileName : arr) {
System.out.println(fileName);
}
}
}
}
8.File類的練習
/*
需求:
通過鍵盤錄入一個正確的文件夾路徑
如果錄入的路徑不存在,給出提示。
如果錄入的是一個文件路徑,給出提示。
直到錄入的是一個正確的文件夾路徑爲止
需求:自己練習
通過鍵盤錄入一個正確的文件路徑
如果錄入的路徑不存在,給出提示。
如果錄入的是一個文件夾路徑,給出提示。
直到錄入的是一個正確的文件路徑爲止
*/
public class Test01 {
public static void main(String[] args) {
File dir = getDir();
System.out.println(dir);
}
public static File getDir() {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個文件夾路徑:");
while(true) {
String s = sc.nextLine();
//將字符串路徑轉成一個File對象
File dir = new File(s);
//判斷路徑是否存在
if(!dir.exists()) {
System.out.println("您輸入的路徑不存在,請重新輸入:");
}else if(dir.isFile()) {
System.out.println("您輸入的是一個文件路徑,請重新輸入:");
}else {
return dir;
}
}
}
}
二、遞歸
1.什麼是遞歸
遞歸指的就是方法調用自己。
使用前提:當方法本身要完成的功能全都是一樣的,但是每次這個方法的參數都不太一樣。
2.遞歸的注意事項
使用遞歸一定要有出口(結束條件)
雖然有出口,但是使用的次數也不宜過多
構造方法不能遞歸
3.使用遞歸來求和
public class Demo02Recurison {
public static void main(String[] args) {
int s = sum(3);
System.out.println(s);
}
/*
定義一個方法,使用遞歸計算1-n之間的和
1+2+3+...+n
n+(n-1)+(n-2)+...+1
已知:
最大值:n
最小值:1
使用遞歸必須明確:
1.遞歸的結束條件
獲取到1的時候結束
2.遞歸的目的
獲取下一個被加的數字(n-1)
*/
public static int sum(int n){
//獲取到1的時候結束
if(n==1){
return 1;
}
//獲取下一個被加的數字(n-1)
return n + sum(n-1);
}
}
4.使用遞歸求階乘
public class Demo03Recurison {
public static void main(String[] args) {
int jiecheng = jc(5);
System.out.println(jiecheng);
}
/*
定義方法使用遞歸計算階乘
5的階乘: 5! = 5*(5-1)*(5-2)*(5-3)*(5-4)=5*4*3*2*1
遞歸結束的條件
獲取到1的時候結束
遞歸的目的
獲取下一個被乘的數字(n-1)
方法的參數發生變化
5,4,3,2,1
*/
public static int jc(int n){
//獲取到1的時候結束
if(n==1){
return 1;
}
//獲取下一個被乘的數字(n-1)
return n * jc(n-1);
}
}
5.遞歸練習-遍歷多級目下的文件
public class Demo04Recurison {
public static void main(String[] args) {
File file = new File("d:\\file");
getAllFile(file);
}
/*
定義一個方法,參數傳遞File類型的目錄
方法中對目錄進行遍歷
*/
public static void getAllFile(File dir){
System.out.println(dir);//打印被遍歷的目錄名稱
File[] files = dir.listFiles();
for (File f : files) {
//對遍歷得到的File對象f進行判斷,判斷是否是文件夾
if(f.isDirectory()){
//f是一個文件夾,則繼續遍歷這個文件夾
//我們發現getAllFile方法就是傳遞文件夾,遍歷文件夾的方法
//所以直接調用getAllFile方法即可:遞歸(自己調用自己)
getAllFile(f);
}else{
//f是一個文件,直接打印即可
System.out.println(f);
}
}
}
}
6.遍歷符合條件的文件
public class Demo05Recurison {
public static void main(String[] args) {
File file = new File("c:\\abc");
getAllFile(file);
}
/*
定義一個方法,參數傳遞File類型的目錄
方法中對目錄進行遍歷
*/
public static void getAllFile(File dir){
//System.out.println(dir);//打印被遍歷的目錄名稱
File[] files = dir.listFiles();
for (File f : files) {
//對遍歷得到的File對象f進行判斷,判斷是否是文件夾
if(f.isDirectory()){
//f是一個文件夾,則繼續遍歷這個文件夾
//我們發現getAllFile方法就是傳遞文件夾,遍歷文件夾的方法
//所以直接調用getAllFile方法即可:遞歸(自己調用自己)
getAllFile(f);
}else{
//f是一個文件,直接打印即可
if(f.getName().toLowerCase().endsWith(".java")){
System.out.println(f);
}
}
}
}
}
7.FileFilter文件過濾器
public class Test04 {
public static void main(String[] args) {
File dir = new File("d:\\resource");
print(dir);
}
//Lambda表達式實現文件過濾
public static void print(File dir) {
File[] subFiles = dir.listFiles((File pathname)->{
if(pathname.isDirectory()) {
return true;
}
return pathname.getName().endsWith(".txt");
});
if(subFiles != null) {
for(File subFile : subFiles) {
if(subFile.isDirectory()) {
print(subFile);
}else if(subFile.isFile()) {
System.out.println(subFile);
}
}
}
}
//傳統方式實現文件過濾
/*public static void print(File dir) {
File[] subFiles = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if(pathname.isDirectory()) {
return true;
}
return pathname.getName().endsWith(".txt");
}
});
if(subFiles != null) {
for(File subFile : subFiles) {
if(subFile.isDirectory()) {
print(subFile);
}else if(subFile.isFile()) {
System.out.println(subFile);
}
}
}
}*/
}
public class getSize {
static long sum = 0;
public static void main(String[] args) {
File f = new File("E:\\MyFile\\13");
long size = getFileSize(f);
System.out.println(size);
}
private static long getFileSize(File f) {
File[] files = f.listFiles();
for (File file : files) {
if (file.isDirectory()) {
getFileSize(file);
}
if(file.isFile())
{
sum = sum + file.length();
}
}
return sum;
}