IO概述、异常、File文件类_DAY19
IO概述:
??? 操作數據的工具
??? IO流,即數據流,數據像水流一樣通過IO工具進行傳輸。
??? 程序? <IO>?? 硬盤? ??
??? 絕對路徑與相對路徑
1:異常(理解)
??? (1)就是程序的非正常情況。
?????? 異常相關操作:
?????????? 創建異常對象(JDK已定義的異常會自動創建對象,自定義異常需要手動創建)
?????????? 拋出異常(JDK已有定義的異常會自動拋出異常,自定義異常需要手動拋出)
?????? 處理異常:
?????????? 程序員在有異常拋出時,異常的處理方法有兩種:(1)將異常捕獲并處理(2)聲明拋出異常
?
??? (2)異常的繼承體系結構:
?????? Throwable:
?????????? |--Error 嚴重的問題,不需要處理的。
?????????? |--Exception 非RuntimeException必須進行處理。兩種方案,點擊鼠標即可。
????????????? |--RuntimeException 運行時期異常,需要修正代碼。
??? (3)jvm的默認處理方式:
?????? 默認情況下,jvm會采用默認處理方案:
?????????? 把異常的全路徑名稱,原因,及位置等信息顯示出來。
?????? 注意:
?????????? 如果是jvm的默認處理方式,那么,它會在出問題的地方結束。
??? (4)我們自己的處理方案:
?????? A:處理方式之一:使用捕獲
?????? try...catch...finally
?????????? 基本格式:
????????????? try {
????????????????? 可能有問題的代碼;
????????????? }catch(異常對象) {
????????????????? 對問題的處理;
????????????? }finally {?? //一定會執行的代碼
????????????????? 釋放資源;
????????????? }
?
?????????? 變形格式:
????????????? try...catch
????????????? try...catch...catch
????????????? try...catch...catch...finally
????????????? try...finally
?????????? 多異常處理方式:
????????????? 分別捕獲分別處理,每個try對應一個catch? (? cn.itcast2.demo4)
package cn.itcast2;import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;/** 多個異常的捕獲處理:* 1:分別捕獲分別處理,每個try對應一個catch*/ public class Demo4 {public static void main(String[] args) {DateFormat df = new SimpleDateFormat("yyyy-MM-dd");try {Date parse = df.parse("2008-08-08");System.out.println(parse);} catch (ParseException e) {System.out.println("您的日期格式有誤,請換成2008-08-08的格式!");}int a = 10;int b = 0; try {System.out.println(a/b);} catch (Exception e) {System.out.println("您的計算中,有數學錯誤,請更換數字");}System.out.println("================");}} View Code2????????????? 分別捕獲分別處理,一個try對應所有catch? (cn.itcast2.demo5)? ,注意:大的異常不能在前邊捕獲
package cn.itcast2;import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;/** 多個異常的捕獲處理:* 2:分別捕獲分別處理,一個try對應所有catch,注意:前邊的異常一定要小于后邊的異常* 3:一次捕獲共同處理,不能同時捕獲大的異常與小的異常*/ public class Demo5 {public static void main(String[] args) {DateFormat df = new SimpleDateFormat("yyyy-MM-dd");int a = 10;int b = 0; //2:格式2//報錯,前邊的異常不小于后邊的異常 // try { // Date parse = df.parse("2008,08-08"); // System.out.println(parse); // System.out.println(a/b); // } catch (ParseException e) { // System.out.println("您的日期格式有誤,請換成2008-08-08的格式!"); // } catch (ArithmeticException e) { // System.out.println("您的計算中,有數學錯誤,請更換數字"); // }try {Date parse = df.parse("2008,08-08");System.out.println(parse);System.out.println(a/b);//前邊的異常一定要小于后邊的異常} catch (ParseException e) {System.out.println("您的日期格式有誤,請換成2008-08-08的格式!");} catch (Exception e) {System.out.println("您的計算中,有數學錯誤,請更換數字");} System.out.println("try后的代碼繼續執行...");//格式3:try{Date parse = df.parse("2008-08-08");System.out.println(parse);System.out.println(a/b);}catch(ParseException|ArithmeticException e) { //一次捕獲共同處理,不能同時捕獲大的異常與小的異常 System.out.println(e);}System.out.println(true||false);System.out.println(true|false);} } View Code????????????? 一次捕獲共同處理
???????????????????? 注意:不能同時捕獲大的異常與小的異常
?????????? 注意:
????????????? 如果多個異常,有子父關系,父異常一定要放在最后。
????????????? 如果多個異常,是平級關系,它們存在的位置沒有順序關系。
?
????????????? 執行順序:
????????????????? 在try里面的代碼會按照從上往下執行,一旦發生問題,
????????????????? 就會產生一個異常對象,去和catch里面進行匹配。
????????????????? 有對應的匹配,就走對應的處理方案。
????????????????? 沒有,就找父匹配,有就走對應的處理方案。
????????????????? 如果找不到,那么就由jvm采用默認處理方案。
?
?????????? JDK7的新特性:在處理多個平級的異常的時候
????????????? catch(ExceptionA | ExceptionB | ExceptionC ... e) {
?????????????
????????????? }
?
?????? B:異常處理方式之二:使用聲明拋出
?????? throws
?* ??????? throws:用于聲明函數拋出異常。用于函數聲明。
?* ??????? 多個異常可以同時聲明拋出,用逗號分隔。? (cn.itcast2.demo7)
package cn.itcast2;import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat;/** 異常處理方式:聲明異常拋出* throws:用于聲明函數拋出異常。用于函數聲明。* 是異常對象的處理方式之一。* 多個異常可以同時聲明拋出,用逗號分隔。*/ public class Demo7 {public static void main(String[] args) {int a = 10,b=0;try {method(a,b);} catch (ArithmeticException e) {e.printStackTrace();}System.err.println("--------------");try {method2(a,b);} catch (ArithmeticException e) {e.printStackTrace();} catch (ParseException e) {e.printStackTrace();}System.err.println("--------------");}public static void method(int a,int b) throws ArithmeticException{System.err.println(a/b);}public static void method2(int a,int b) throws ArithmeticException, ParseException{ //多個異常可以同時聲明拋出,用逗號分隔 method(a,b);DateFormat df = new SimpleDateFormat("yyyy-MM-dd");df.parse("a");}}/** 程序執行結果 java.lang.ArithmeticException: / by zeroat cn1.Demo7.method(Demo7.java:35)at cn1.Demo7.main(Demo7.java:18) -------------- java.lang.ArithmeticException: / by zeroat cn1.Demo7.method(Demo7.java:35)at cn1.Demo7.method2(Demo7.java:39)at cn1.Demo7.main(Demo7.java:25) -------------- */ View Code??? (5)自定義異常
?????? 如果涉及其他需求,JDK沒有提供相應的異常對象,則可以自己定義異常。
?????? 定義格式:繼承Exception或者RuntimeException。同時需要帶參的構造方法,用于接收異常信息。
?????? public class MyException extends Exception{
?????????? public MyException(String message){
????????????? super(message);
?????????? }
?????? }
?????? 例子:cn.itcast2.demo8?? cn.itcast2.MyException.java
package cn.itcast2; /** 自定義異常:* 補充java沒有提供的異常類*/ public class Demo8 {public static void main(String[] args) {//規定,一個班最多只能有100個人。int classNumber = 101;//方式一:捕獲異常if(classNumber>100) {try {throw new MyException("班級人數大于100了,不能大于100!");//手動拋出自定義異常類對象} catch (MyException e) {System.err.println("=======");System.err.println(e.getMessage()+".........");e.printStackTrace();System.err.println("=======");}}System.err.println("-------------");try {method();} catch (MyException e) {e.printStackTrace();}}//方式二:聲明拋出異常public static void method() throws MyException { //聲明拋出異常//規定,一個班最多只能有100個人。int classNumber = 101;if(classNumber>100) {throw new MyException("班級人數大于100了,不能大于100!");//手動拋出自定義異常類對象 }System.err.println("-------------");} } View Code package cn.itcast2; /** 自定義異常:超過100就不行*/ public class MyException extends Exception {public MyException(String message) {super(message);}} View Code??? (6)面試題:
?????? A:Exception和RuntimeException的區別?
?????????? Exception:分為編譯期異常和運行期異常。編譯期異常是必須處理的。否則,代碼不能編譯通過。
?????????? RuntimeException:運行期異常,不需要編寫異常處理代碼,但是可能需要修正程序參數或者邏輯代碼。
?????? B:throws和throw的區別?
?????????? throws:在方法聲明上,后面跟的是異常類名。
?????????? ?????? throws聲明后面如果是一個運行時期異常,調用者不需要處理。這種方式沒有意義。
?????????? ?????? throws聲明后面跟的是一個編譯期異常,調用者是必須處理的。
?????????? throw:在方法體中,后面跟的是異常對象名。
?????????? ?????? throw后面如果拋出的是運行時期異常對象,那么方法上是不需要進行聲明的。
?????????? ?????? throw后面如果拋出的是編譯時期異常對象,那么,一般在方法聲明上都是要用throws聲明該方法有異常。
?????? C:finally的面試題
?????????? a:final,finally,finalize的特點及區別?
????????????? final:最終的意思,可以修飾類,成員變量,成員方法
????????????????? 修飾類,類不能被繼承
???????? ???????? 修飾變量,變量是常量
????????????????? 修飾方法,方法不能被重寫
????????????? finally:是異常處理的一部分,用于釋放資源。
???????????????????? 一般來說,代碼肯定會執行,特殊情況:在執行到finally之前jvm退出了
????????????? finalize:是Object類的一個方法,用于垃圾回收
?????????? b:如果catch里面有return,請問finally里面的代碼還執行嗎?
?????????? ? 如果執行,是在return前,還是后呢?
?????????? ? 會執行,在前,確切的說在中間,先執行return的代碼,再執行finally里面的代碼,最后return
?????????? c:寫一個程序,測試finally里面的操作對結果沒有影響。
????????????? finally一般只用于釋放資源。cn.itcast.demo9
?????? D:jvm的默認處理方式? 打印,宕機
??? (7)對于異常,怎么選擇呢?
?????? A:能夠自己處理的時候,盡量自己處理。
?????? B:在方法里面盡量不要拋。
?????? C:將來在實際開發中,我們會把不同的異常給出不同的界面進行顯示給用戶。
??? (8)子父關系中的異常處理?
?????? class Fu {
?????????? public void show()? throws Exception? {
?????????? }
?????? }
?
?????? class Zi extends Fu {
?????????? public void show() throws RuntimeException {
?????????? }
?????? }
?
?????? class Demo {
?????????? public static void main(String[] args) {
?????????? }
?????? }
?
?????? 子的重寫方法中不能拋出比父更大的異常。
?
2:File(理解)
??? (1)因為硬盤上對數據的存儲基本上都是以文件存在。為了方便對文件或者文件夾進行操作。
??? ?? java就提供了一個類File供我們使用。本質上是對路徑的封裝。
??? (2)File類構造方法:
?????? A:File file = new File("d:\\a.txt");
?????? B:File file = new File("d:\\","a.txt");
?????? C:File file = new File("d:");
?????? ? File file2 = new File(file,"a.txt");
?
?????? 以上三種格式等價。
??? (3)File類的功能:
?????? A:創建功能
?????????? 創建文件:createNewFile()
?????????? 創建文件夾:mkdir(),mkdirs()
?????????? 例子:cn.itcast3.demo2
package cn.itcast3;import java.io.File; import java.io.IOException;/** File類的普通方法:* 1:public boolean createNewFile() throws IOException 創建文件* 2:public boolean mkdir() 創建文件夾* 注意:現有文件夾,后有文件* 3:public boolean mkdirs() 創建此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。 將所有父目錄全部創建。*/ public class Demo2 {public static void main(String[] args) throws IOException {//創建文件夾與文件對象File dir = new File("z");File file = new File("z/z.txt");//2:創建文件夾zboolean mkdir = dir.mkdir();System.out.println(mkdir);//1:創建文件z.textboolean createNewFile = file.createNewFile();System.out.println(createNewFile);//層級創建文件File dir2 = new File("c/a/d/e/w/d/f/t/z");boolean mkdir2 = dir2.mkdirs();System.out.println(mkdir2);}} View Code?????????? 注意:僅僅根據后綴名并不能判斷是文件還是文件夾。
?????? B:刪除功能
?????????? 刪除文件或者文件夾:delete()
?????????? 注意:
????????????? A:刪除一個帶內容的目錄,必須先刪除內容,在刪除目錄。
????????????? B:java中的刪除不走回收站。
?????? C:判斷功能
?????????? 判斷file是否存在:exists()
?????????? 判斷file是否是文件:isFile()
?????????? 判斷file是否是文件夾:isDirectory()
?????????? 例子:cn.itcast3.demo3-myself.text
import java.io.File; import java.io.IOException;/** File類的普通方法:* 1:public boolean delete() 文件可以直接刪除,文件夾刪除時,必須保證里邊已經沒有內容了* 2:public boolean isHidden()測試此抽象路徑名指定的文件是否是一個隱藏文件* 3:public boolean isFile() 判斷是否是文件* 4:public boolean isDirectory() 判斷是否是文件夾* 5:public boolean exists() 測試此抽象路徑名表示的文件或目錄是否存在。*/ public class Demo3 {public static void main(String[] args) throws IOException {//創建文件夾File dir = new File("b");dir.mkdir();//需要先創建文件夾,然后創建文件File file = new File("b/b.txt");file.createNewFile();/* //先刪除文件,再刪除文件夾System.out.println(file.delete());System.out.println(dir.delete());*///是否是隱藏文件 System.out.println(file.isHidden());//是否是文件 System.out.println(file.isFile());//是否是文件夾 System.out.println(dir.isDirectory());// 測試此抽象路徑名表示的文件或目錄是否存在。 System.out.println(file.exists());}} View Code?????? D:重名名功能
?????????? 把舊名稱改變為新名稱:renameTo()
????????????? 注意:路徑問題。
?????????? 重命名涉及兩個File對象。
?????????? 將File1重命名成File2
????????????? 在同一目錄下:
????????????????? file2文件已經存在,重命名失敗
????????????????? file2文件不存在,重命名成功
????????????? 在不同目錄下:
????????????????? file2文件已經存在,重命名失敗
????????????????? file2文件不存在,剪切成功
?????????? 例子:cn.itcast3.demo4
package cn.itcast3;import java.io.File;/** File類的普通方法:* public boolean renameTo(File dest) 同目錄:重命名/不同目錄:剪切加重命名*/ public class Demo4 {public static void main(String[] args) {File file = new File("a.txt");File file2 = new File("b.txt");File file3 = new File("d/c.txt");boolean renameTo = file.renameTo(file2);System.out.println(renameTo);boolean renameTo2 = file2.renameTo(file3);System.out.println(renameTo2);}} View Code?????? E:獲取功能
?????????? 基本獲取
????????????? 獲取絕對路徑:getAbsolutePath()
????????????? 獲取相對路徑:getPath()
????????????? 獲取名稱:getName()
????????????? 獲取大小:length()? //英文字母1個字節,中文字母兩個字節
????????????? 獲取最后修改時間:lastModified()
????????????? 例子:cn.itcast3.demo5
package cn.itcast3;import java.io.File; import java.util.Date;/** File類的普通方法:* 1:public String getAbsolutePath() : 返回此抽象路徑名的絕對路徑名字符串。* 2:public String getPath(): 將此抽象路徑名轉換為一個路徑名字符串。* 3:public String getParent():返回此抽象路徑名父目錄的路徑名字符串;如果此路徑名沒有指定父目錄,則返回 null。* 4:public File getParentFile():返回此抽象路徑名父目錄的抽象路徑名;如果此路徑名沒有指定父目錄,則返回 null。* 5:public String getName():返回由此抽象路徑名表示的文件或目錄的名稱。* 6:public long length() 返回:文件存儲內容的長度* 7:public long lastModified():返回上一次修改時間毫秒值*/ public class Demo5 {public static void main(String[] args) {File file = new File("a.txt");File file2 = new File("D:/Lesson/JAVA/JAVA基礎/北京/150315/day19/code/day19/a.txt");//1 System.out.println(file.getAbsolutePath());System.out.println(file2.getAbsolutePath());System.out.println("===========");//2 System.out.println(file.getPath());System.out.println(file2.getPath());System.out.println("===========");//3String p = file.getParent();System.out.println(p);String p2 = file2.getParent();System.out.println(p2);System.out.println("===========");//4File pFile = file.getParentFile();System.out.println(pFile);File pFile2 = file2.getParentFile();System.out.println(pFile2);System.out.println("===========");//5String name = file.getName();System.out.println(name);String name2 = file2.getName();System.out.println(name2);System.out.println("===========");//6 System.out.println(file.length());//7System.out.println(file.lastModified());//返回毫秒值1428829519158LSystem.out.println(new Date(file.lastModified()));//返回日期格式 }} View Code?????????? 高級獲取
????????????? 獲取指定目錄下所有文件或者文件夾的名稱數組:list()
????????????? 獲取指定目錄下所有文件或者文件夾的File數組:listFiles()
????????????? 返回所有盤符:listRoots()
????????????? 例子1:cn.itcast3.demo6
package cn.itcast3;import java.io.File; import java.util.Arrays;/** 文件高級獲取:* 1:public static File[] listRoots() 獲取所有盤符的文件對象* 2:public String[] list() 這些字符串指定此抽象路徑名表示的目錄中的文件和目錄。即該File下的所有文件及目錄(字符串)。* 3:public File[] listFiles() 返回一個抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中的文件。 即File下的所有文件及目錄(File對象)。*/ public class Demo6 {public static void main(String[] args) {//1:File[] listRoots = File.listRoots();System.out.println(Arrays.toString(listRoots));//2:File dir = new File("src/cn/itcast");String[] list = dir.list();System.out.println(Arrays.toString(list));//3:File[] listFiles = dir.listFiles();System.out.println(Arrays.toString(listFiles));for (File file : listFiles) {System.out.println(file.getName());}}} View Code????????????? 例子2:cn.itcast3.demo7:獲取src\cn\itcast目錄下所有.java結尾的文件(注意是文件 ,不是文件夾)
package cn.itcast3;import java.io.File;/** 獲取src\cn\itcast目錄下所有.java結尾的文件*/ public class Demo7 {public static void main(String[] args) {//創建文件對象,表示指定的文件夾File dir = new File("src/cn/itcast");//方法一:(如果有文件夾是.java結尾的,則不能過濾該文件夾) // //獲取該文件夾下的所有File對象字符串表現(文件,文件夾) // String[] list = dir.list(); // //獲取該數組中的每一個元素 // for (String fileordir : list) { // boolean endsWith = fileordir.endsWith(".java"); // if(endsWith) { // System.out.println(fileordir); // } // }//方法二://獲取該文件夾下的所有File對象對象表現(文件,文件夾)File[] listFiles = dir.listFiles();//獲取該數組中的每一個元素for (File fileordir : listFiles) {//先判斷是否為文件if(fileordir.isFile()) {boolean endsWith = fileordir.getName().endsWith(".java");if(endsWith) {System.out.println(fileordir.getName());}}}}} View Code????????????? 文件過濾器:
????????????????? 接口 FilenameFilter? 重寫accept()方法?
????????????????? 方式1,定義類實現FilenameFilter,然后用file.list(該類的實例對象)?
????????????????? 方式2,匿名內部類
????????????? 例子:cn.itcast3.demo8
package cn.itcast3;import java.io.File; import java.io.FilenameFilter; import java.util.Arrays;/** File的方法:* public String[] list(FilenameFilter filter)* public File[] listFiles(FilenameFilter filter)* // 3:public File(File parent,String child)* 文件過濾器* FilenameFilter:* boolean accept(File dir, String name) 將list/listFiles方法所在目錄下所有的File對象都判斷一次是否符合條件。符合條件返回true,不符合,返回false* * 獲取src\cn\itcast目錄下所有.java結尾的文件,要求使用過濾器*/ public class Demo8 {public static void main(String[] args) {//創建文件對象,表示指定的文件夾File dir = new File("src/cn/itcast");//獲取該文件夾下的所有符合條件的File對象字符串表現(文件,文件夾)String[] list = dir.list(new FilenameFilter(){ //匿名內部類 @Overridepublic boolean accept(File dir, String name) {File thisFile = new File(dir,name);if(thisFile.isFile()){if(name.endsWith(".java")) {return true;}}return false;}});System.out.println(Arrays.toString(list));} } View Code?---------------------------------------------------------------------------------------------------------------
例子程序:
1、返回某文件夾下所有以java結尾的文件
a)使用list方法
b)使用listFiles方法
c)使用list方法加文件過濾器
?d)使用listFiles方法加文件過濾器
import java.io.File; import java.io.FilenameFilter; import java.util.Arrays;/*** 7:返回某文件夾下所有以java結尾的文件。* a)使用list方法* b)使用listFiles方法* c)使用list方法加文件過濾器* d)使用listFiles方法加文件過濾器*/ public class Test7 {public static void main(String[] args) {//a)使用list方法 (不能判斷是文件還是文件夾)/* File file=new File("src/cn1");String[] strings=file.list();for(String s:strings){if(s.endsWith(".java")){System.out.println(s);}}*///使用listFiles方法/* File file = new File("src/cn1");File[] files = file.listFiles();for (File f : files) {if (f.isFile()) {if(f.getName().endsWith(".java")){System.out.println(f.getName());}}}*///c)使用list方法加文件過濾器/* File file=new File("src/cn1");String[] strings=file.list(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {File file1=new File(dir,name);if(file1.isFile()){if(file1.getName().endsWith(".java")){return true;}}return false;}});System.out.println(Arrays.toString(strings));*///d)使用listFiles方法加文件過濾器/*File file=new File("src/cn1");File[] files=file.listFiles(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {File file1=new File(dir,name);if(file1.isFile()){if(file1.getName().endsWith(".java")){return true;}}return false;}});for(File f:files){System.out.println(f.getName());}*/} } View Code2、完成一個文件的創建,判斷,刪除。
import java.io.File; import java.io.IOException;/*** 3:完成一個文件的創建,判斷,刪除。*/ public class Test3 {public static void main(String[] args) throws IOException {File file=new File("src/cn2/a.test");//文件的創建 file.createNewFile();//判斷 System.out.println(file.isFile());System.out.println(file.isDirectory());//刪除 file.delete();} } View Code3、完成文件的創建、重命名、刪除。
import java.io.File; import java.io.IOException;/*** 5:完成文件的創建、重命名、刪除。*/ public class Test5 {public static void main(String[] args) throws IOException {//文件的創建File file=new File("d.txt");file.createNewFile();//重命名File file1=new File("src/cn1/e.txt");file.renameTo(file1);//刪除 file1.delete();} } View Code4、完成多級目錄的創建。
import java.io.File; import java.io.IOException;/*** 6:完成多級目錄的創建。*/ public class Test6 {public static void main(String[] args) throws IOException {File dir=new File("src/a/b/c/d/e");dir.mkdirs();File file=new File("src/a/a.txt");file.createNewFile();}} View Code?
總結
以上是生活随笔為你收集整理的IO概述、异常、File文件类_DAY19的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拼多多免密支付怎么关闭2023
- 下一篇: 网红奶茶沪上阿姨包装旗袍图“露大腿”不雅