1. 程式人生 > >exception&file&&IO

exception&file&&IO

文章目錄

exception

描述:程式非正常的編譯&執行情況,實際使用過程中可能會出現非正常使用或者是程式碼邏輯上的不嚴謹導致的額出錯。異常的處理規則是,原則上是本級處理,但是無處理語句會見exception拋到上級,直到處理。最高級別是JVM,則丟擲error。

  • 異常的分類

  • 異常的體系

  • 異常的處理機制

  • exception與runexception

    • 由分類的層次結構圖可以得知,exception是一個大類,包括了runtimexcption.

    • 編譯期間的錯誤是基本的語法錯誤,是必要進行處理的,是保證程式執行的前提。否則編譯無法通過…

    • 執行期異常可以不處理,也可以處理。處理方式一般是拋給上一級,或者使用throw new exception().

    • 在程式碼塊中經常會使用到throw與throws,它們的區別是一個前置是執行期間可能的錯誤,是可以不處理的,如:

      public static int divide(int a, int b){
      	retuen a/b;	//此處考慮到b考慮為0,則需要throw異常。
      }
      
      public static int divide(int a, int b){
      	if
      (b!=0) retuen a/b; else throw new ArithmeticException(); }
  • throw存在於一個函式,丟擲的是一個異常物件,“throw new ArithmeticException();”說明這裡有一個異常產生了,而throws可以丟擲多個異常,說明的是有可能出錯,跟的是類名。

  • 異常處理格式&順序

    try...catch...finally	//完全的標準異常處理格式.
    try...catch...
    try...catch...catch...
    try...catch...catch...fianlly			
    try
    ...finally
  • 程式碼例項

    • try…catch…作為一個完整的格式,一旦catch則異常處理完成,不繼續執行相關的部分。

      /*for example*/
      eg:
      try{
      		...
      	}catch(異常類名 變數名) {
      		...
      		e.printStackTrace();//顯示簡約的異常資訊.
      	}
      int a = 5, b = 0;
      	try {
      		System.out.println(a / b);
      	} catch (ArithmeticException ae) {
      		System.out.println("除數不能為0");
      	}
      	System.out.println("over");// 可以顯示出over.
      
      
      	eg:
      	try{
      			...
      		}catch(異常類名 變數名) {
      			...
      		}
      		catch(異常類名 變數名) {
      			...
      		}
      			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("testOne");
      			} catch (ArithmeticException e) {
      				System.out.println("testTwo");
      			} catch (ArrayIndexOutOfBoundsException e) {
      				System.out.println("testThree");
      			} catch (Exception e) {
      				System.out.println("testFour");
      			}
      			System.out.println("the last.");
      			System.out.println("over.");
      	/*執行結果:
      	testTwo
      	the last.
      	over.
      	*/
      
      eg:
      try{
      		...
      		
      	}catch(異常類名 |異常類名 變數名) {
      			...
      	}
      
      try{
      	System.out.println(a / b);
      	System.out.println(arr[3]);
      	} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
      		System.out.println("testAa");
      		e.printStackTrace();//顯示簡約的異常資訊.
      	}
      
      		System.out.println("over.");
      /*執行結果:
      testAa
      over.
      */
      
  • finally異常處理

    • 自定義異常
      繼承自Exception或者RuntimeException,只需要提供無參構造和一個帶參構造即可。
      /*自定義異常丟擲*/
      package TestMc;
      import java.util.Scanner;
      class AaException extends Exception {
      	public AaException() {
      	}
      
      	public AaException(String Message) {
      		super(Message);
      	}
      }
      class AaCheck {
      	public void check(int a) throws AaException {
      		if (a < 0 || a > 5) {
      			throw new AaException();
      		} else
      			System.out.println("輸入結果無誤.");
      	}
      }
      class TestCc {
      	public static void main(String[] args) {
      		System.out.println("Please input your grades:");
      		Scanner Cv = new Scanner(System.in);
      		int Bb = Cv.nextInt();
      		AaCheck Ba = new AaCheck();
      		try {
      			Ba.check(Bb);
      		} catch (Exception e) {
      			e.printStackTrace();
      		}
      		System.out.println("Output Over.");
      	}
      }
      
      
  • 繼承異常的care
    繼承的子類異常限定範圍應該比父類更加小,不能比父類的異常範圍更大.
    如:

    父的方法有異常丟擲,子的重寫方法在丟擲異常的時候必須要小於等於父的異常。

    父的方法沒有異常丟擲,子的重寫方法不能有異常丟擲。

    父的方法丟擲多個異常,子的重寫方法必須比父少或者小。

File

Java中對I/O操作的工具類,是用來操作檔案的主要類。

檔案和目錄路徑名的抽象表示:
使用者介面和作業系統使用依賴於系統的路徑名字串命名檔案和目錄。 這個類提供了一個抽象的,獨立於系統的層次化路徑名的檢視。

  • 構造方法

    • 該類的構造方法有四個,得到的都是物件型別資料,具體的使用如下:

      File(String pathname)	根據一個路徑得到File物件。
      File(String parent, String child)	根據一個目錄和一個子檔案/目錄得到File物件。
      File(File parent, String child)	根據一個父File物件和一個子檔案/目錄得到File物件。
      
      /*for example*/
      File file = new File("e:\\demo\\a.txt");
      File file = new File("e:\\demo","a.txt");
      File file = new File("e:\\demo");
      		  File file2 = new File(file,"a.txt");	
      
      /*第一行==第二行==第三+第四行.*/	
      
  • File類檔案的操作

    • 建立功能

      /* 建立成功返回的true,否則false.*/
      public boolean createNewFile()	建立檔案 如果存在這樣的檔案,就不建立了.
      
      /*以下兩個只能建立資料夾,不能建立檔案,就算是public boolean mkdir(“aa\\aa.txt”)也是建立的是aa.txt的資料夾.*/
      public boolean mkdir()	建立資料夾 如果存在這樣的資料夾,就不建立了.
      public boolean mkdirs()	建立資料夾,如果父資料夾不存在,會幫你創建出來.
      
      /*for example*/
      
      File file = new File("e:\\demo"); //在e盤目錄下建立一個資料夾demo.
      System.out.println("mkdir:" + file.mkdir());
      
      File file = new File("e:\\demos\\aa"); //在e盤目錄下建立一個資料夾demos\aa.
      System.out.println("mkdir:" + file.mkdirs());
      
      File file = new File("e:\\demoss\\aa"); //在e盤目錄下建立一個資料夾demoss\aa.
      System.out.println("mkdir:" + file.mkdir()); //無demoss建立失敗.
      		
      File file2 = new File("e:\\demo\\a.txt");//在e盤目錄demo下建立一個檔案a.txt
      System.out.println("createNewFile:" + file2.createNewFile());
      
    • 刪除功能

       /*刪除功能:public boolean delete()*/
      
      	如果你建立檔案或者資料夾忘了寫碟符路徑,那麼,預設在專案路徑下。
      
      	Java中的刪除直接從硬碟刪除,不刪除到回收站。
      
      	要刪除一個資料夾,請注意該資料夾內不能包含檔案或者資料夾,含有內容則無法刪除。
      File file = new File("aaa\\bbb");
      File file2= new File("aaa");
      		System.out.println("delete:" + file6.delete());
      		System.out.println("delete:" + file7.delete());
      
    • 重新命名功能

      public boolean renameTo(File dest)
      如果路徑名相同,就是重新命名,否則就是重新命名&&剪下。 
      路徑以碟符開始:絕對路徑	如:c:\\a.txt
      路徑不以碟符開始:相對路徑	如:a.txt,預設本位置為專案根目錄。
      
      /*for example*/
      File file2 = new File("E:\\testCc.txt");
      File newFile2 = new File("C:\\testCa.jpg");
      System.out.println("renameTo:" + file2.renameTo(newFile2));
      
    • 判斷功能

      /*for example*/
      
      public boolean isDirectory()	判斷是否是目錄
      public boolean isFile()		判斷是否是檔案
      public boolean exists()		判斷是否存在
      public boolean canRead()	判斷是否可讀
      public boolean canWrite()	判斷是否可寫
      public boolean isHidden()	判斷是否隱藏
      
      public class FileTest {
      	public static void main(String[] args) {
      		
      		File file = new File("testCc.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
      	}
      }
      
    • 獲取功能

      /*for example*/
      public String getAbsolutePath()		獲取絕對路徑
      public String getPath()		獲取相對路徑
      public String getName()		獲取名稱
      public long length()		獲取長度。位元組數
      public long lastModified()	獲取最後一次的修改時間,毫秒值,初試時間01970-01-01:00:00public 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());
      		
      		Date d = new Date();
      		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      		String s = sdf.format(d);
      		System.out.println(s);
      	}
      }
      
    • 獲取功能

      public String[] list()	獲取指定目錄下的所有檔案&&資料夾的名稱,返回一個對應的String陣列。
      public File[] listFiles()	獲取指定目錄下的所有檔案&&資料夾的File物件陣列。
      
      /*for example*/
      
      /*獲取對應資料夾下的檔名稱.*/
      		File file = new File("C:\\");
      
      		//public String[] list()
      		String[] strArray = file.list();
      		for (String s : strArray) {
      			System.out.println(s);
      		}
      		System.out.println("----分----割----線----");
      
      		//public File[] listFiles()+getName()返回名字.
      		File[] fileArray = file.listFiles();
      		for (File f : fileArray) {
      			System.out.println(f.getName());
      		}
      
    • 過濾功能

      描述:獲取指定格式檔名字,並且輸出。

      介面:檔名稱過濾器:FilenameFilter藉口。

      函式如下:

      public String[] list(FilenameFilter filter)
      public File[] listFiles(FilenameFilter filter)
      
      /*獲取ttf副檔名的檔案*/--"C:\\Windows\\Boot\\Fonts"為測試檔案路徑.
      
      /*for example----普通for迴圈結構實現.*/
      
      import java.io.File;
      public class FileTest {
      	public static void main(String[] args) {
      		
      		File file = new File(”C:\\Windows\\Boot\\Fonts“);	
      		File[] fileArray = file.listFiles();
      	
      		for (File f : fileArray) {			
      			if (f.isFile()) {			
      				if (f.getName().endsWith(".ttf")) {			
      					System.out.println(f.getName());
      				}
      			}
      		}
      	}
      }						
      
      /*for example----檔案過濾器實現*/
      import java.io.File;
      import java.io.FilenameFilter;
      
      public class FileTest {
      	public static void main(String[] args) {
      		
      		File file = new File("C:\\Windows\\Boot\\Fonts");
      
      		String[] strArray = file.list(new FilenameFilter() {
      			/*匿名類的使用。*/
      			@Override
      			public boolean accept(File dir, String name) {
      
      				// return false,表示不新增;
      				// return true,表示新增;
      				
      				return new File(dir, name).isFile() && name.endsWith(".ttf");
      			}
      		});
      
      		// 遍歷
      		for (String s : strArray) {
      			System.out.println(s);
      		}
      	}
      }
      
  • 批量重新命名

    • 原始檔:
    • 目標檔案:

    import java.io.File;
    
    public class FileDemo {
    	public static void main(String[] args) {
    		
    		File srcFolder = new File("E:\\TestCc");
    	
    		File[] fileArray = srcFolder.listFiles();
    	
    		for (File file : fileArray) {		
    
    			int index = name.indexOf("_");
    			String numberString = name.substring(index + 1, index + 4);		
    			int endIndex = name.lastIndexOf('_');
    			String nameString = name.substring(endIndex);
    			String newName = numberString.concat(nameString);
    			File newFile = new File(srcFolder, newName);		
    			file.renameTo(newFile);
    		}
    	}
    }