IO_File類

File(掌握)

(1)IO流操作中大部分都是對文件的操作,所以Java就提供了File類供我們來操作文件

(2)構造方法

A:File file = new File("e:\\demo\\a.txt");

B:File file = new File("e:\\demo","a.txt");

C:File file = new File("e:\\demo");

 File file2 = new File(file,"a.txt");

Demo:

import java.io.File;

/*
 * 我們要想實現IO的操作,就必須知道硬盤上文件的表現形式。
 * 而Java就提供了一個類File供我們使用。
 * 
 * File:文件和目錄(文件夾)路徑名的抽象表示形式
 * 構造方法:
 * 		File(String pathname):根據一個路徑得到File對象
 * 		File(String parent, String child):根據一個目錄和一個子文件/目錄得到File對象
 * 		File(File parent, String child):根據一個父File對象和一個子文件/目錄得到File對象
 */
public class FileDemo {
	public static void main(String[] args) {
		// File(String pathname):根據一個路徑得到File對象
		// 把e:\\demo\\a.txt封裝成一個File對象
		File file = new File("E:\\demo\\a.txt");

		// File(String parent, String child):根據一個目錄和一個子文件/目錄得到File對象
		File file2 = new File("E:\\demo", "a.txt");

		// File(File parent, String child):根據一個父File對象和一個子文件/目錄得到File對象
		File file3 = new File("e:\\demo");
		File file4 = new File(file3, "a.txt");

		// 以上三種方式其實效果一樣
	}
}


(3)File類的功能(自己補齊)

A:創建功能

Demo:

import java.io.File;
import java.io.IOException;

/*
 *創建功能:
 *public boolean createNewFile():創建文件 如果存在這樣的文件,就不創建了
 *public boolean mkdir():創建文件夾 如果存在這樣的文件夾,就不創建了
 *public boolean mkdirs():創建文件夾,如果父文件夾不存在,會幫你創建出來
 *
 *騎白馬的不一定是王子,可能是班長。
 *注意:你到底要創建文件還是文件夾,你最清楚,方法不要調錯了。
 */
public class FileDemo {
	public static void main(String[] args) throws IOException {
		// 需求:我要在e盤目錄下創建一個文件夾demo
		File file = new File("e:\\demo");
		System.out.println("mkdir:" + file.mkdir());

		// 需求:我要在e盤目錄demo下創建一個文件a.txt
		File file2 = new File("e:\\demo\\a.txt");
		System.out.println("createNewFile:" + file2.createNewFile());

		// 需求:我要在e盤目錄test下創建一個文件b.txt
		// Exception in thread "main" java.io.IOException: 系統找不到指定的路徑。
		// 注意:要想在某個目錄下創建內容,該目錄首先必須存在。
		// File file3 = new File("e:\\test\\b.txt");
		// System.out.println("createNewFile:" + file3.createNewFile());

		// 需求:我要在e盤目錄test下創建aaa目錄
		// File file4 = new File("e:\\test\\aaa");
		// System.out.println("mkdir:" + file4.mkdir());

		// File file5 = new File("e:\\test");
		// File file6 = new File("e:\\test\\aaa");
		// System.out.println("mkdir:" + file5.mkdir());
		// System.out.println("mkdir:" + file6.mkdir());

		// 其實我們有更簡單的方法
		File file7 = new File("e:\\aaa\\bbb\\ccc\\ddd");
		System.out.println("mkdirs:" + file7.mkdirs());

		// 看下面的這個東西:
		File file8 = new File("e:\\liuyi\\a.txt");
		System.out.println("mkdirs:" + file8.mkdirs());
	}
}



B:刪除功能

Demo:

import java.io.File;
import java.io.IOException;

/*
 * 刪除功能:public boolean delete()
 * 
 * 注意:
 * 		A:如果你創建文件或者文件夾忘了寫盤符路徑,那麼,默認在項目路徑下。
 * 		B:Java中的刪除不走回收站。
 * 		C:要刪除一個文件夾,請注意該文件夾內不能包含文件或者文件夾,如果有無法刪除
 */
public class FileDemo {
	public static void main(String[] args) throws IOException {
		// 創建文件
		// File file = new File("e:\\a.txt");
		// System.out.println("createNewFile:" + file.createNewFile());

		// 我不小心寫成這個樣子了
		File file = new File("a.txt");
		System.out.println("createNewFile:" + file.createNewFile());

		// 繼續玩幾個
		File file2 = new File("aaa\\bbb\\ccc");
		System.out.println("mkdirs:" + file2.mkdirs());

		// 刪除功能:我要刪除a.txt這個文件
		File file3 = new File("a.txt");
		System.out.println("delete:" + file3.delete());

		// 刪除功能:我要刪除ccc這個文件夾
		File file4 = new File("aaa\\bbb\\ccc");
		System.out.println("delete:" + file4.delete());

		// 刪除功能:我要刪除aaa文件夾
		// File file5 = new File("aaa");
		// System.out.println("delete:" + file5.delete());

		File file6 = new File("aaa\\bbb");
		File file7 = new File("aaa");
		System.out.println("delete:" + file6.delete());
		System.out.println("delete:" + file7.delete());
	}
}


C:重命名功能

Demo:

import java.io.File;

/*
 * 重命名功能:public boolean renameTo(File dest)
 * 		如果路徑名相同,就是改名。
 * 		如果路徑名不同,就是改名並剪切。
 * 
 * 路徑以盤符開始:絕對路徑	c:\\a.txt
 * 路徑不以盤符開始:相對路徑	a.txt
 */
public class FileDemo {
	public static void main(String[] args) {
		// 創建一個文件對象
		// File file = new File("林青霞.jpg");
		// // 需求:我要修改這個文件的名稱爲"東方不敗.jpg"
		// File newFile = new File("東方不敗.jpg");
		// System.out.println("renameTo:" + file.renameTo(newFile));

		File file2 = new File("東方不敗.jpg");
		File newFile2 = new File("e:\\林青霞.jpg");
		System.out.println("renameTo:" + file2.renameTo(newFile2));
	}
}


D:判斷功能

Demo:

import java.io.File;

/*
 * 判斷功能:
 * public boolean isDirectory():判斷是否是目錄
 * public boolean isFile():判斷是否是文件
 * public boolean exists():判斷是否存在
 * public boolean canRead():判斷是否可讀
 * public boolean canWrite():判斷是否可寫
 * public boolean isHidden():判斷是否隱藏
 */
public class FileDemo {
	public static void main(String[] args) {
		// 創建文件對象
		File file = new File("a.txt");

		System.out.println("isDirectory:" + file.isDirectory());// false
		System.out.println("isFile:" + file.isFile());// true
		System.out.println("exists:" + file.exists());// true
		System.out.println("canRead:" + file.canRead());// true
		System.out.println("canWrite:" + file.canWrite());// true
		System.out.println("isHidden:" + file.isHidden());// false
	}
}

E:獲取功能

Demo:

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 * 獲取功能:
 * public String getAbsolutePath():獲取絕對路徑
 * public String getPath():獲取相對路徑
 * public String getName():獲取名稱
 * public long length():獲取長度。字節數
 * public long lastModified():獲取最後一次的修改時間,毫秒值
 */
public class FileDemo {
	public static void main(String[] args) {
		// 創建文件對象
		File file = new File("demo\\test.txt");

		System.out.println("getAbsolutePath:" + file.getAbsolutePath());
		System.out.println("getPath:" + file.getPath());
		System.out.println("getName:" + file.getName());
		System.out.println("length:" + file.length());
		System.out.println("lastModified:" + file.lastModified());

		// 1416471971031
		Date d = new Date(1416471971031L);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String s = sdf.format(d);
		System.out.println(s);
	}
}


F:高級獲取功能

Demo:

import java.io.File;

/*
 * 獲取功能:
 * public String[] list():獲取指定目錄下的所有文件或者文件夾的名稱數組
 * public File[] listFiles():獲取指定目錄下的所有文件或者文件夾的File數組
 */
public class FileDemo {
	public static void main(String[] args) {
		// 指定一個目錄
		File file = new File("e:\\");

		// public String[] list():獲取指定目錄下的所有文件或者文件夾的名稱數組
		String[] strArray = file.list();
		for (String s : strArray) {
			System.out.println(s);
		}
		System.out.println("------------");

		// public File[] listFiles():獲取指定目錄下的所有文件或者文件夾的File數組
		File[] fileArray = file.listFiles();
		for (File f : fileArray) {
			System.out.println(f.getName());
		}
	}
}


G:過濾器功能

(4)案例:

A:輸出指定目錄下指定後綴名的文件名稱

a:先獲取所有的,在遍歷的時候判斷,再輸出

Demo:

import java.io.File;

/*
 * 判斷E盤目錄下是否有後綴名爲.jpg的文件,如果有,就輸出此文件名稱
 * 
 * 分析:
 * 		A:封裝e判斷目錄
 * 		B:獲取該目錄下所有文件或者文件夾的File數組
 * 		C:遍歷該File數組,得到每一個File對象,然後判斷
 * 		D:是否是文件
 * 			是:繼續判斷是否以.jpg結尾
 * 				是:就輸出該文件名稱
 * 				否:不搭理它
 * 			否:不搭理它
 */
public class FileDemo {
	public static void main(String[] args) {
		// 封裝e判斷目錄
		File file = new File("e:\\");

		// 獲取該目錄下所有文件或者文件夾的File數組
		File[] fileArray = file.listFiles();

		// 遍歷該File數組,得到每一個File對象,然後判斷
		for (File f : fileArray) {
			// 是否是文件
			if (f.isFile()) {
				// 繼續判斷是否以.jpg結尾
				if (f.getName().endsWith(".jpg")) {
					// 就輸出該文件名稱
					System.out.println(f.getName());
				}
			}
		}
	}
}


b:先判斷,再獲取,最後直接遍歷輸出即可

Demo:

import java.io.File;
import java.io.FilenameFilter;

/*
 * 判斷E盤目錄下是否有後綴名爲.jpg的文件,如果有,就輸出此文件名稱
 * A:先獲取所有的,然後遍歷的時候,依次判斷,如果滿足條件就輸出。
 * B:獲取的時候就已經是滿足條件的了,然後輸出即可。
 * 
 * 要想實現這個效果,就必須學習一個接口:文件名稱過濾器
 * public String[] list(FilenameFilter filter)
 * public File[] listFiles(FilenameFilter filter)
 */
public class FileDemo2 {
	public static void main(String[] args) {
		// 封裝e判斷目錄
		File file = new File("e:\\");

		// 獲取該目錄下所有文件或者文件夾的String數組
		// public String[] list(FilenameFilter filter)
		String[] strArray = file.list(new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				// return false;
				// return true;
				// 通過這個測試,我們就知道了,到底把這個文件或者文件夾的名稱加不加到數組中,取決於這裏的返回值是true還是false
				// 所以,這個的true或者false應該是我們通過某種判斷得到的
				// System.out.println(dir + "---" + name);
				// File file = new File(dir, name);
				// // System.out.println(file);
				// boolean flag = file.isFile();
				// boolean flag2 = name.endsWith(".jpg");
				// return flag && flag2;
				return new File(dir, name).isFile() && name.endsWith(".jpg");
			}
		});

		// 遍歷
		for (String s : strArray) {
			System.out.println(s);
		}
	}
}


B:批量修改文件名稱

Demo:

import java.io.File;

/*
 * 需求:把E:\評書\三國演義下面的視頻名稱修改爲
 * 		00?_介紹.avi
 * 
 * 思路:
 * 		A:封裝目錄
 * 		B:獲取該目錄下所有的文件的File數組
 * 		C:遍歷該File數組,得到每一個File對象
 * 		D:拼接一個新的名稱,然後重命名即可。
 */
public class FileDemo {
	public static void main(String[] args) {
		// 封裝目錄
		File srcFolder = new File("E:\\評書\\三國演義");

		// 獲取該目錄下所有的文件的File數組
		File[] fileArray = srcFolder.listFiles();

		// 遍歷該File數組,得到每一個File對象
		for (File file : fileArray) {
			// System.out.println(file);
			// E:\評書\三國演義\三國演義_001_[評書網-今天很高興,明天就IO了]_桃園三結義.avi
			// 改後:E:\評書\三國演義\001_桃園三結義.avi
			String name = file.getName(); // 三國演義_001_[評書網-今天很高興,明天就IO了]_桃園三結義.avi

			int index = name.indexOf("_");
			String numberString = name.substring(index + 1, index + 4);
			// System.out.println(numberString);

			// int startIndex = name.lastIndexOf('_');
			// int endIndex = name.lastIndexOf('.');
			// String nameString = name.substring(startIndex + 1, endIndex);
			// System.out.println(nameString);
			int endIndex = name.lastIndexOf('_');
			String nameString = name.substring(endIndex);

			String newName = numberString.concat(nameString); // 001_桃園三結義.avi
			// System.out.println(newName);

			File newFile = new File(srcFolder, newName); // E:\\評書\\三國演義\\001_桃園三結義.avi

			// 重命名即可
			file.renameTo(newFile);
		}
	}
}


###########################################################################################

1:遞歸(理解)

(1)方法定義中調用方法本身的現象

舉例:老和尚給小和尚講故事,我們學編程

(2)遞歸的注意事項;

A:要有出口,否則就是死遞歸

B:次數不能過多,否則內存溢出

C:構造方法不能遞歸使用

(3)遞歸的案例:

A:遞歸求階乘

Demo:

 /*
 * 需求:請用代碼實現求5的階乘。
 * 下面的知識要知道:
 * 		5! = 1*2*3*4*5
 * 		5! = 5*4!
 * 
 * 有幾種方案實現呢?
 * 		A:循環實現
 * 		B:遞歸實現
 * 			a:做遞歸要寫一個方法
 * 			b:出口條件
 * 			c:規律
 */
public class DiGuiDemo {
	public static void main(String[] args) {
		int jc = 1;
		for (int x = 2; x <= 5; x++) {
			jc *= x;
		}
		System.out.println("5的階乘是:" + jc);
		
		System.out.println("5的階乘是:"+jieCheng(5));
	}
	
	/*
	 * 做遞歸要寫一個方法:
	 * 		返回值類型:int
	 * 		參數列表:int n
	 * 出口條件:
	 * 		if(n == 1) {return 1;}
	 * 規律:
	 * 		if(n != 1) {return n*方法名(n-1);}
	 */
	public static int jieCheng(int n){
		if(n==1){
			return 1;
		}else {
			return n*jieCheng(n-1);
		}
	}
}


B:兔子問題

Demo:

/*
 * 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問第二十個月的兔子對數爲多少?
 * 分析:我們要想辦法找規律
 * 			兔子對數
 * 第一個月: 	1
 * 第二個月:	1
 * 第三個月:	2
 * 第四個月:	3	
 * 第五個月:	5
 * 第六個月:	8
 * ...
 * 
 * 由此可見兔子對象的數據是:
 * 		1,1,2,3,5,8...
 * 規則:
 * 		A:從第三項開始,每一項是前兩項之和
 * 		B:而且說明前兩項是已知的
 * 
 * 如何實現這個程序呢?
 * 		A:數組實現
 * 		B:變量的變化實現
 * 		C:遞歸實現
 * 
 * 假如相鄰的兩個月的兔子對數是a,b
 * 第一個相鄰的數據:a=1,b=1
 * 第二個相鄰的數據:a=1,b=2
 * 第三個相鄰的數據:a=2,b=3
 * 第四個相鄰的數據:a=3,b=5
 * 看到了:下一次的a是以前的b,下一次是以前的a+b	
 */
public class DiGuiDemo2 {
	public static void main(String[] args) {
		// 定義一個數組
		int[] arr = new int[20];
		arr[0] = 1;
		arr[1] = 1;
		// arr[2] = arr[0] + arr[1];
		// arr[3] = arr[1] + arr[2];
		// ...
		for (int x = 2; x < arr.length; x++) {
			arr[x] = arr[x - 2] + arr[x - 1];
		}
		System.out.println(arr[19]);// 6765
		System.out.println("----------------");

		int a = 1;
		int b = 1;
		for (int x = 0; x < 18; x++) {
			// 臨時變量存儲上一次的a
			int temp = a;
			a = b;
			b = temp + b;
		}
		System.out.println(b);
		System.out.println("----------------");

		System.out.println(fib(20));
	}

	/*
	 * 方法: 返回值類型:int 參數列表:int n 出口條件: 第一個月是1,第二個月是1 規律: 從第三個月開始,每一個月是前兩個月之和
	 */
	public static int fib(int n) {
		if (n == 1 || n == 2) {
			return 1;
		} else {
		        //從第三個月開始n月的總數爲上個月和上上個月的和
			return fib(n - 1) + fib(n - 2);
		}
	}
}


C:遞歸輸出指定目錄下所有指定後綴名的文件絕對路徑

Demo:

import java.io.File;

/*
 * 需求:請大家把E:\JavaSE目錄下所有的java結尾的文件的絕對路徑給輸出在控制檯。
 * 
 * 分析:
 * 		A:封裝目錄
 * 		B:獲取該目錄下所有的文件或者文件夾的File數組
 * 		C:遍歷該File數組,得到每一個File對象
 * 		D:判斷該File對象是否是文件夾
 * 			是:回到B
 * 			否:繼續判斷是否以.java結尾
 * 				是:就輸出該文件的絕對路徑
 * 				否:不搭理它
 */
public class FilePathDemo {
	public static void main(String[] args) {
		// 封裝目錄
		File srcFolder = new File("E:\\JavaSE");

		// 遞歸功能實現
		getAllJavaFilePaths(srcFolder);
	}

	private static void getAllJavaFilePaths(File srcFolder) {
		// 獲取該目錄下所有的文件或者文件夾的File數組
		File[] fileArray = srcFolder.listFiles();

		// 遍歷該File數組,得到每一個File對象
		for (File file : fileArray) {
			// 判斷該File對象是否是文件夾
			if (file.isDirectory()) {
				getAllJavaFilePaths(file);
			} else {
				// 繼續判斷是否以.java結尾
				if (file.getName().endsWith(".java")) {
					// 就輸出該文件的絕對路徑
					System.out.println(file.getAbsolutePath());
				}
			}
		}
	}
}


D:遞歸刪除帶內容的目錄(小心使用)

Demo:

import java.io.File;

/*
 * 需求:遞歸刪除帶內容的目錄
 * 
 * 目錄我已經給定:demo
 * 
 * 分析:
 * 		A:封裝目錄
 * 		B:獲取該目錄下的所有文件或者文件夾的File數組
 * 		C:遍歷該File數組,得到每一個File對象
 * 		D:判斷該File對象是否是文件夾
 * 			是:回到B
 * 			否:就刪除
 */
public class FileDeleteDemo {
	public static void main(String[] args) {
		// 封裝目錄
		File srcFolder = new File("demo");
		// 遞歸實現
		deleteFolder(srcFolder);
	}

	private static void deleteFolder(File srcFolder) {
		// 獲取該目錄下的所有文件或者文件夾的File數組
		File[] fileArray = srcFolder.listFiles();

		if (fileArray != null) {
			// 遍歷該File數組,得到每一個File對象
			for (File file : fileArray) {
				// 判斷該File對象是否是文件夾
				if (file.isDirectory()) {
					deleteFolder(file);
				} else {
					System.out.println(file.getName() + "---" + file.delete());
				}
			}

			System.out
					.println(srcFolder.getName() + "---" + srcFolder.delete());
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章