Num19-----------IO流

1:集合(本身補齊)
	Collection(單列集合)
		List(有序,可重複)
			ArrayList
				底層數據結構是數組,查詢快,增刪慢
				線程不安全,效率高
			Vector
				底層數據結構是數組,查詢快,增刪慢
				線程安全,效率低
			LinkedList
				底層數據結構是鏈表,查詢慢,增刪快
				線程不安全,效率高
		Set(無序,惟一)
			HashSet
				底層數據結構是哈希表。
				哈希表依賴兩個方法:hashCode()和equals()
				執行順序:
					首先判斷hashCode()值是否相同
						是:繼續執行equals(),看其返回值
							是true:說明元素重複,不添加
							是false:就直接添加到集合
						否:就直接添加到集合
				最終:
					自動生成hashCode()和equals()便可
					
				LinkedHashSet
					底層數據結構由鏈表和哈希表組成。
					由鏈表保證元素有序。
					由哈希表保證元素惟一。
			TreeSet
				底層數據結構是紅黑樹。(是一種自平衡的二叉樹)
				如何保證元素惟一性呢?
					根據比較的返回值是不是0來決定
				如何保證元素的排序呢?
					兩種方式
						天然排序(元素具有比較性)
							讓元素所屬的類實現Comparable接口
						比較器排序(集合具有比較性)
							讓集合接收一個Comparator的實現類對象
	Map(雙列集合)
		A:Map集合的數據結構僅僅針對鍵有效,與值無關。
		B:存儲的是鍵值對形式的元素,鍵惟一,值可重複。
		
		HashMap
			底層數據結構是哈希表。線程不安全,效率高
				哈希表依賴兩個方法:hashCode()和equals()
				執行順序:
					首先判斷hashCode()值是否相同
						是:繼續執行equals(),看其返回值
							是true:說明元素重複,不添加
							是false:就直接添加到集合
						否:就直接添加到集合
				最終:
					自動生成hashCode()和equals()便可
			LinkedHashMap
				底層數據結構由鏈表和哈希表組成。
					由鏈表保證元素有序。
					由哈希表保證元素惟一。
		Hashtable
			底層數據結構是哈希表。線程安全,效率低
				哈希表依賴兩個方法:hashCode()和equals()
				執行順序:
					首先判斷hashCode()值是否相同
						是:繼續執行equals(),看其返回值
							是true:說明元素重複,不添加
							是false:就直接添加到集合
						否:就直接添加到集合
				最終:
					自動生成hashCode()和equals()便可
		TreeMap
			底層數據結構是紅黑樹。(是一種自平衡的二叉樹)
				如何保證元素惟一性呢?
					根據比較的返回值是不是0來決定
				如何保證元素的排序呢?
					兩種方式
						天然排序(元素具有比較性)
							讓元素所屬的類實現Comparable接口
						比較器排序(集合具有比較性)
							讓集合接收一個Comparator的實現類對象
	
2:到底使用那種集合(本身補齊)
	看需求。
	
	是不是鍵值對象形式:
		是:Map
			鍵是否須要排序:
				是:TreeMap
				否:HashMap
			不知道,就使用HashMap。
			
		否:Collection
			元素是否惟一:
				是:Set
					元素是否須要排序:
						是:TreeSet
						否:HashSet
					不知道,就使用HashSet
					
				否:List
					要安全嗎:
						是:Vector(其實咱們也不用它,後面咱們講解了多線程之後,我在給你回顧用誰)
						否:ArrayList或者LinkedList
							增刪多:LinkedList
							查詢多:ArrayList
						不知道,就使用ArrayList
			不知道,就使用ArrayList
			
3:集合的常見方法及遍歷方式
	Collection:
		add()
		remove()
		contains()
		iterator()
		size()
		
		遍歷:
			加強for
			迭代器
			
		|--List
			get()
			
			遍歷:
				普通for
		|--Set
	
	Map:
		put()
		remove()
		containskey(),containsValue()
		keySet()
		get()
		value()
		entrySet()
		size()
		
		遍歷:
			根據鍵找值
			根據鍵值對對象分別找鍵和值
			
	做業:
		我講解過的任意一個集合,我要求你存儲什麼,你就可以存儲什麼。
		而且,還要可以遍歷出來。

4:ArrayList,LinkedList,HashSet,HashMap(掌握)
	存儲字符串和自定義對象數據並遍歷
	
5:集合的嵌套遍歷(理解)

異常處理
html

package cn.itcast_02;

/*
 * A:一個異常
 * B:二個異常的處理
 * 		a:每個寫一個try...catch
 * 		b:寫一個try,多個catch
 * 			try{
 * 				...
 * 			}catch(異常類名 變量名) {
 * 				...
 * 			}
 * 			catch(異常類名 變量名) {
 * 				...
 * 			}
 * 			...
 * 
 * 			注意事項:
 * 				1:能明確的儘可能明確,不要用大的來處理。
 * 				2:平級關係的異常誰前誰後無所謂,若是出現了子父關係,父必須在後面。
 * 
 * 注意:
 * 		一旦try裏面出了問題,就會在這裏把問題給拋出去,而後和catch裏面的問題進行匹配,
 * 		一旦有匹配的,就執行catch裏面的處理,而後結束了try...catch
 * 		繼續執行後面的語句。
 */
public class ExceptionDemo2 {
	public static void main(String[] args) {
		// method1();

		// method2();

		// method3();

		method4();
	}

	public static void method4() {
		int a = 10;
		int b = 0;
		int[] arr = { 1, 2, 3 };

		// 爺爺在最後
		try {
			System.out.println(a / b);
			System.out.println(arr[3]);
			System.out.println("這裏出現了一個異常,你不太清楚是誰,該怎麼辦呢?");
		} catch (ArithmeticException e) {
			System.out.println("除數不能爲0");
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("你訪問了不應的訪問的索引");
		} catch (Exception e) {
			System.out.println("出問題了");
		}

		// 爺爺在前面是不能夠的
		// try {
		// System.out.println(a / b);
		// System.out.println(arr[3]);
		// System.out.println("這裏出現了一個異常,你不太清楚是誰,該怎麼辦呢?");
		// } catch (Exception e) {
		// System.out.println("出問題了");
		// } catch (ArithmeticException e) {
		// System.out.println("除數不能爲0");
		// } catch (ArrayIndexOutOfBoundsException e) {
		// System.out.println("你訪問了不應的訪問的索引");
		// }

		System.out.println("over");
	}

	// 兩個異常的處理
	public static void method3() {
		int a = 10;
		int b = 0;
		int[] arr = { 1, 2, 3 };

		try {
			System.out.println(arr[3]);
			System.out.println(a / b);
			// System.out.println(arr[3]);
		} catch (ArithmeticException e) {
			System.out.println("除數不能爲0");
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("你訪問了不應的訪問的索引");
		}

		System.out.println("over");
	}

	// 兩個異常
	public static void method2() {
		int a = 10;
		int b = 0;
		try {
			System.out.println(a / b);
		} catch (ArithmeticException e) {
			System.out.println("除數不能爲0");
		}

		int[] arr = { 1, 2, 3 };
		try {
			System.out.println(arr[3]);
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("你訪問了不應的訪問的索引");
		}

		System.out.println("over");
	}

	// 一個異常
	public static void method1() {
		// 第一階段
		int a = 10;
		// int b = 2;
		int b = 0;

		try {
			System.out.println(a / b);
		} catch (ArithmeticException ae) {
			System.out.println("除數不能爲0");
		}

		// 第二階段
		System.out.println("over");
	}
}

package cn.itcast_02;

/*
 * JDK7出現了一個新的異常處理方案:
 * 		try{
 * 
 * 		}catch(異常名1 | 異常名2 | ...  變量 ) {
 * 			...
 * 		}
 * 
 * 		注意:這個方法雖然簡潔,可是也不夠好。
 * 			A:處理方式是一致的。(實際開發中,好多時候可能就是針對同類型的問題,給出同一個處理)
 *			B:多個異常間必須是平級關係。
 */
public class ExceptionDemo3 {
	public static void main(String[] args) {
		method();
	}

	public static void method() {
		int a = 10;
		int b = 0;
		int[] arr = { 1, 2, 3 };

		// try {
		// System.out.println(a / b);
		// System.out.println(arr[3]);
		// System.out.println("這裏出現了一個異常,你不太清楚是誰,該怎麼辦呢?");
		// } catch (ArithmeticException e) {
		// System.out.println("除數不能爲0");
		// } catch (ArrayIndexOutOfBoundsException e) {
		// System.out.println("你訪問了不應的訪問的索引");
		// } catch (Exception e) {
		// System.out.println("出問題了");
		// }

		// JDK7的處理方案
		try {
			System.out.println(a / b);
			System.out.println(arr[3]);
		} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
			System.out.println("出問題了");
		}

		System.out.println("over");
	}

}

package cn.itcast_04;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 * 在try裏面發現問題後,jvm會幫咱們生成一個異常對象,而後把這個對象拋出,和catch裏面的類進行匹配。
 * 若是該對象是某個類型的,就會執行該catch裏面的處理信息。
 * 
 * 異常中要了解的幾個方法:
 * public String getMessage():異常的消息字符串		
 * public String toString():返回異常的簡單信息描述
 * 		此對象的類的 name(全路徑名)
 * 		": "(冒號和一個空格) 
 * 		調用此對象 getLocalizedMessage()方法的結果 (默認返回的是getMessage()的內容)
 * printStackTrace() 獲取異常類名和異常信息,以及異常出如今程序中的位置。返回值void。把信息輸出在控制檯。
 */
public class ExceptionDemo {
	public static void main(String[] args) {
		String s = "2014-11-20";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			Date d = sdf.parse(s); // 建立了一個ParseException對象,而後拋出去,和catch裏面進行匹配
			System.out.println(d);
		} catch (ParseException e) { // ParseException e = new ParseException();
			// ParseException
			// e.printStackTrace();

			// getMessage()
			// System.out.println(e.getMessage());
			// Unparseable date: "2014-11-20"

			// toString()
			// System.out.println(e.toString());
			// java.text.ParseException: Unparseable date: "2014-11-20"
			
			e.printStackTrace();
			//跳轉到某個指定的頁面(index.html)
		}
		
		System.out.println("over");
	}
}

throws的方式處理異常
java

package cn.itcast_05;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 * 有些時候,咱們是能夠對異常進行處理的,可是又有些時候,咱們根本就沒有權限去處理某個異常。
 * 或者說,我處理不了,我就不處理了。
 * 爲了解決出錯問題,Java針對這種狀況,就提供了另外一種處理方案:拋出。
 * 
 * 格式:
 * 		throws 異常類名
 * 		注意:這個格式必須跟在方法的括號後面。
 * 
 * 注意:
 * 		儘可能不要在main方法上拋出異常。
 * 		可是我講課爲了方便我就這樣作了。
 * 
 * 小結:
 * 		編譯期異常拋出,未來調用者必須處理。
 * 		運行期異常拋出,未來調用能夠不用處理。
 */
public class ExceptionDemo {
	public static void main(String[] args) {
		System.out.println("今每天氣很好");
		try {
			method();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		System.out.println("可是就是不應有霧霾");

		method2();
	}

	// 運行期異常的拋出
	public static void method2() throws ArithmeticException {
		int a = 10;
		int b = 0;
		System.out.println(a / b);
	}

	// 編譯期異常的拋出
	// 在方法聲明上拋出,是爲了告訴調用者,你注意了,我有問題。
	public static void method() throws ParseException {
		String s = "2014-11-20";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date d = sdf.parse(s);
		System.out.println(d);
	}
}

package cn.itcast_06;

/*
 * throw:若是出現了異常狀況,咱們能夠把該異常拋出,這個時候的拋出的應該是異常的對象。
 * 
 * throws和throw的區別(面試題)
	throws
		用在方法聲明後面,跟的是異常類名
		能夠跟多個異常類名,用逗號隔開
		表示拋出異常,由該方法的調用者來處理
		throws表示出現異常的一種可能性,並不必定會發生這些異常
	throw
		用在方法體內,跟的是異常對象名
		只能拋出一個異常對象名
		表示拋出異常,由方法體內的語句處理
		throw則是拋出了異常,執行throw則必定拋出了某種異常
 */
public class ExceptionDemo {
	public static void main(String[] args) {
		// method();
		
		try {
			method2();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void method() {
		int a = 10;
		int b = 0;
		if (b == 0) {
			throw new ArithmeticException();
		} else {
			System.out.println(a / b);
		}
	}

	public static void method2() throws Exception {
		int a = 10;
		int b = 0;
		if (b == 0) {
			throw new Exception();
		} else {
			System.out.println(a / b);
		}
	}
}

/*
 * finally:被finally控制的語句體必定會執行
 * 注意:若是在執行到finally以前jvm退出了,就不能執行了。
 * 
 * A:格式
 * 		try...catch...finally...
 * B:用於釋放資源,在IO流操做和數據庫操做中會見到
 */

package cn.itcast_07;

/*
 * 面試題:
 * 1:final,finally和finalize的區別
 * final:最終的意思,能夠修飾類,成員變量,成員方法
 * 		修飾類,類不能被繼承
 * 		修飾變量,變量是常量
 * 		修飾方法,方法不能被重寫
 * finally:是異常處理的一部分,用於釋放資源。
 * 		通常來講,代碼確定會執行,特殊狀況:在執行到finally以前jvm退出了
 * finalize:是Object類的一個方法,用於垃圾回收
 * 
 * 2:若是catch裏面有return語句,請問finally裏面的代碼還會執行嗎?
 *   若是會,請問是在return前,仍是return後。
 * 	   會。前。
 * 
 * 	 準確的說,應該是在中間。
 * 
 * 3:try...catch...finally的格式變形
 * 		A:try...catch...finally
 * 		B:try...catch
 * 		C:try...catch...catch...
 * 		D:try...catch...catch...finally
 * 		E:try...finally
 * 			這種作法的目前是爲了釋放資源。
 */
public class FinallyDemo2 {
	public static void main(String[] args) {
		System.out.println(getInt());
	}

	public static int getInt() {
		int a = 10;
		try {
			System.out.println(a / 0);
			a = 20;
		} catch (ArithmeticException e) {
			a = 30;
			return a;
			/*
			 * return a在程序執行到這一步的時候,這裏不是return a而是return 30;這個返回路徑就造成了。
			 * 可是呢,它發現後面還有finally,因此繼續執行finally的內容,a=40
			 * 再次回到之前的返回路徑,繼續走return 30;
			 */
		} finally {
			a = 40;
			return a;//若是這樣結果就是40了。
		}
		// return a;
	}
}

自定義異常的實現和測試
面試

package cn.itcast_08;

/*
 * java不可能對全部的狀況都考慮到,因此,在實際的開發中,咱們可能須要本身定義異常。
 * 而咱們本身隨意的寫一個類,是不能做爲異常類來看的,要想你的類是一個異常類,就必須繼承自Exception或者RuntimeException
 * 
 * 兩種方式:
 * A:繼承Exception
 * B:繼承RuntimeException
 */
public class MyException extends Exception {
	public MyException() {
	}

	public MyException(String message) {
		super(message);
	}
}

// public class MyException extends RuntimeException {
//
// }

package cn.itcast_08;

public class Teacher {
	public void check(int score) throws MyException {
		if (score > 100 || score < 0) {
			throw new MyException("分數必須在0-100之間");
		} else {
			System.out.println("分數沒有問題");
		}
	}

	// 針對MyException繼承自RuntimeException
	// public void check(int score) {
	// if (score > 100 || score < 0) {
	// throw new MyException();
	// } else {
	// System.out.println("分數沒有問題");
	// }
	// }
}

package cn.itcast_08;

import java.util.Scanner;

/*
 * 自定義異常測試類
 */
public class StudentDemo {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("請輸入學生成績:");
		int score = sc.nextInt();

		Teacher t = new Teacher();
		try {
			t.check(score);
		} catch (MyException e) {
			e.printStackTrace();
		}
	}
}

異常的注意事項
數據庫

package cn.itcast_09;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 * 異常注意事項:
 * A:子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞)
 * B:若是父類拋出了多個異常,子類重寫父類時,只能拋出相同的異常或者是他的子集,子類不能拋出父類沒有的異常
 * C:若是被重寫的方法沒有異常拋出,那麼子類的方法絕對不能夠拋出異常,若是子類方法內有異常發生,那麼子類只能try,不能throws
 */
public class ExceptionDemo {

}

class Fu {
	public void show() throws Exception {
	}

	public void method() {
	}
}

class Zi extends Fu {
	@Override
	public void show() throws ArithmeticException {

	}

	@Override
	public void method() {
		// String s = "2014-11-20";
		// SimpleDateFormat sdf = new SimpleDateFormat();
		// Date d = sdf.parse(s);
		// System.out.println(d);
	}
}

File類的建立功能
數組

package cn.itcast_02;

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());
	}
}

File類的刪除功能
安全

package cn.itcast_03;

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());
	}
}

File類的重命名功能
數據結構

package cn.itcast_04;

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));
	}
}

File類的判斷功能
多線程

package cn.itcast_05;

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
	}
}

File類的獲取功能
jvm

package cn.itcast_06;

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);
	}
}

File類的高級獲取功能
ide

package cn.itcast_07;

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());
		}
	}
}

輸出指定目錄下指定後綴名的文件名稱案例

package cn.itcast_08;

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());
				}
			}
		}
	}
}

利用過濾器改進

package cn.itcast_08;

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);
		}
	}
}

批量修改文件名稱案例

package cn.itcast_09;

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)異常的體系
		Throwable
			|--Error	嚴重問題,咱們不處理。
			|--Exception
				|--RuntimeException	運行期異常,咱們須要修正代碼
				|--非RuntimeException 編譯期異常,必須處理的,不然程序編譯不經過
	(3)異常的處理:
		A:JVM的默認處理
			把異常的名稱,緣由,位置等信息輸出在控制檯,可是呢程序不能繼續執行了。
		B:本身處理
			a:try...catch...finally
				本身編寫處理代碼,後面的程序能夠繼續執行
			b:throws
				把本身處理不了的,在方法上聲明,告訴調用者,這裏有問題
	(4)面試題
		A:編譯期異常和運行期異常的區別?
			編譯期異常 必需要處理的,不然編譯不經過
			運行期異常 能夠不處理,也能夠處理
		B:throw和throws是的區別
			throw:
				在方法體中,後面跟的是異常對象名,而且只能是一個
				throw拋出的是一個異常對象,說明這裏確定有一個異常產生了
			throws:
				在方法聲明上,後面跟的是異常的類名,能夠是多個
				throws是聲明方法有異常,是一種可能性,這個異常並不必定會產生
	(5)finally關鍵字及其面試題
		A:finally用於釋放資源,它的代碼永遠會執行。特殊狀況:在執行到finally以前jvm退出了
		B:面試題
			a:final,finally,finalize的區別?
			b:若是在catch裏面有return,請問finally還執行嗎?若是執行,在return前仍是後
				會,前。
				
				實際上在中間。這個上課咱們講過
		C:異常處理的變形
			try...catch...finally
			try...catch...
			try...catch...catch...
			try...catch...catch...fianlly
			try...finally
	(6)自定義異常
		繼承自Exception或者RuntimeException,只須要提供無參構造和一個帶參構造便可
	(7)異常的注意實現
		A:父的方法有異常拋出,子的重寫方法在拋出異常的時候必需要小於等於父的異常 
		B:父的方法沒有異常拋出,子的重寫方法不能有異常拋出
		C:父的方法拋出多個異常,子的重寫方法必須比父少或者小

2: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");
	(3)File類的功能(本身補齊)
		A:建立功能
		B:刪除功能
		C:重命名功能
		D:判斷功能
		E:獲取功能
		F:高級獲取功能
		G:過濾器功能
	(4)案例:
		A:輸出指定目錄下指定後綴名的文件名稱
			a:先獲取全部的,在遍歷的時候判斷,再輸出
			b:先判斷,再獲取,最後直接遍歷輸出便可
		B:批量修改文件名稱
相關文章
相關標籤/搜索