一:File 1.1 File:文件和目錄(文件夾)路徑名的抽象表示形式。 1.2 File的構造方法: File(String pathname):把一個路徑名稱封裝成File對象 File(String parent, String child):把一個父路徑和一個子路徑封裝成一個File對象 File(File parent, String child):把一個父路徑File對象和一個子路徑封裝成一個File對象 1.3 創建功能: A:創建文件 public booleancreateNewFile():如果文件不存在,就創建。否則,不創建。 需求:D盤下造一個文件a.txt B:創建目錄 public boolean mkdir():如果目錄不存在,就創建。否則,不創建。 需求:D盤下造一個文件夾test public booleanmkdirs():如果目錄不存在,就創建。否則,不創建。 即時父目錄不存在,也可以連父目錄一起創建。 需求:D盤下造一個文件夾(D:/aaa/bbb/ccc) 需求:D盤下造一個文件夾("D:\\ddd\\eee\\f.txt"); package com.edu_01; import java.io.File; import java.io.IOException; /** 1.1 File:文件和目錄(文件夾)路徑名的抽象表示形式。 1.2 File的構造方法: File(String pathname):把一個路徑名稱封裝成File對象 File(String parent, String child):把一個父路徑和一個子路徑封裝成一個File對象 File(File parent, String child):把一個父路徑File對象和一個子路徑封裝成一個File對象 * */ public class FileDemo { publicstatic void main(String[] args) throws IOException { //File(Stringpathname):把一個路徑名稱封裝成File對象 //Filefile = new File("D://a.txt"); //System.out.println(file.createNewFile());//當文件不存在的時候,創建文件,如果文件存在,不創建 System.out.println("------------"); //File(Stringparent, String child):把一個父路徑和一個子路徑封裝成一個File對象 //Filefile = new File("D://test", "a.txt"); //java.io.IOException:系統找不到指定的路徑, //創建文件的時候一定要保證路徑存在 //System.out.println(file.createNewFile()); System.out.println("-----------------"); //File(Fileparent, String child):把一個父路徑File對象和一個子路徑封裝成一個File對象 Filefile = new File("D://test"); Filefile2 = new File(file, "a.txt"); System.out.println(file2.createNewFile()); } } 注意事項: A:你要造什麼東西,就應該用對應的方法。 1.4 刪除功能: public boolean delete():既可以刪除文件,又可以刪除目錄。 路徑問題: A:絕對路徑 就是以盤符開始的路徑(d:\\test\\aaa\\b.txt) B:相對路徑 就是不以盤符開始的路徑(a.txt) 一般都是相對應當前的項目而言的。 注意事項: A:Java程序的刪除不走回收站。 B:如果目錄內還有內容就不能刪除。 1.5 判斷功能 public boolean isDirectory():是否是目錄 public boolean isFile():是否是文件 public boolean exists():是否存在 public boolean canRead():是否可讀 public boolean canWrite():是否可寫 public boolean isHidden():是否隱藏 package com.edu_02; import java.io.File; import java.io.IOException; /** * 1.5 判斷功能 public boolean isDirectory():是否是目錄 public boolean isFile():是否是文件 public boolean exists():是否存在 public boolean canRead():是否可讀 public boolean canWrite():是否可寫 public boolean isHidden():是否隱藏 */ public class FileDemo3 { publicstatic void main(String[] args) throws IOException { //在D://a.txt Filefile = new File("D://a.txt"); //System.out.println(file.createNewFile()); System.out.println("是否是目錄:"+file.isDirectory()); System.out.println("是否是文件:"+file.isFile()); System.out.println("是否存在:"+file.exists()); System.out.println("是否可讀:"+file.canRead()); System.out.println("是否可寫:"+file.canWrite()); System.out.println("是否隱藏:"+file.isHidden()); } } 1.6獲取功能 public String getAbsolutePath():獲取絕對路徑 public String getPath():獲取相對路徑 public String getName():獲取名稱 二:字節流及字節高效流 2.1 I/O流的分類 * IO流分類: * 流向: * 輸入流 * 輸出流 * 數據類型: * 字節流 * 字節輸入流 * 字節輸出流 * 字符流 * 字符輸入流 * 字符輸出流 * * 注意:一般我們在討論IO的分類時,默認是按照數據類型分的。 * * 字節流: * 字節輸入流 InputStream(抽象類) * 字節輸出流 OutputStream(抽象類) * 字符流: * 字符輸入流 Reader * 字符輸出流 Writer * * 學習習慣: * 字節流 * 字符流 * 2.2 * 需求:請用字節流往一個文本文件中寫一句話:"helloworld"。 * 分析: * 首先要知道是字節流 * 寫數據我們就應該知道是字節輸出流 * 所以最終選擇了OutputStream * 而OutputStream是抽象類,所以我們應該找其子類 * 文件這個單詞是File,所以我們就大膽的猜測下:FileOutputStream存在否。 * * 我們如何往一個文件寫數據呢? * 或者說就是字節輸出流的操作步驟是什麼呢? * A:創建字節輸出流對象 * B:調用寫數據的方法 * C:釋放資源 package cokm.edu_01; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; /** * 2.2 * 需求:請用字節流往一個文本文件中寫一句話:"helloworld"。 * 分析: * 首先要知道是字節流 * 寫數據我們就應該知道是字節輸出流 * 所以最終選擇了OutputStream * 而OutputStream是抽象類,所以我們應該找其子類 * 文件這個單詞是File,所以我們就大膽的猜測下:FileOutputStream存在否。 * * 我們如何往一個文件寫數據呢? * 或者說就是字節輸出流的操作步驟是什麼呢? * A:創建字節輸出流對象 * B:調用寫數據的方法 * C:釋放資源 * */ public class OutputStreamDemo { publicstatic void main(String[] args) throws IOException { /** * 怎麼使用文件輸出流往文件中途寫數據? * 1.創建文件輸出流對象 * 2.調用輸出流對象的方法給文件中寫數據 * 3.釋放資源 */ //publicFileOutputStream(String name) //publicFileOutputStream(File file) //創建文件輸出流對象 FileOutputStreamfos = new FileOutputStream("a.txt"); //publicFileOutputStream(File file) //Filefile = new File("a.txt"); //FileOutputStreamfos = new FileOutputStream(file); /** * FileOutputStream fos = newFileOutputStream("a.txt"); * 做了那些事情? * 1.創建fos對象指向文件a.txt * 2.創建一個文件a.txt */ //調用輸出流的寫數據的方法給文件中寫數據 //publicvoid write(byte[] b) byte[]byf = "helloworld".getBytes(); fos.write(byf); //釋放資源,關流操作 fos.close(); //關流之後,我們還能繼續往文件中寫數據碼 //這樣是不行的。。 //fos.write("java".getBytes());//java.io.IOException:Stream Closed } } 做法: A: 兩個構造的區別? FileOutputStream(File file) FileOutputStream(Stringname) FileOutputStreamfos = newFileOutputStream("fos.txt"); 請問上面這個操作做了哪幾件事情? * 1.創建了一個文件輸出流fos,指向文件a.txt * 2.創建了a.txt這個文件 B: fos.write("helloworld".getBytes()); C: fos.close();關流 D: fos.write("java".getBytes()); 2.3 FileOutputStream寫數據的方法 write(byte[] b) write(int b) :一次寫一個字節 write(byte[] b, int off, int len) :一次寫一個字節數組的一部分 2.4 字節輸入流: 具體操作步驟: * 字節輸入流操作步驟: * A:創建字節輸入流對象 FileInputStream fis = new FileInputStream("a.txt"); * B:調用方法讀取數據 一次讀取一個字節:read()-- 測試讀取不到內容的時候的返回值(並且用循環改進) * C:釋放資源 fis.close * 練習: * A:把a.txt的內容複製到b.txt中 * C:把d:\\複製視頻文件 * 數據源: * IODemo.java -- 讀取數據 -- InputStream -- FileInputStream -- 一次讀取一個字節 * 目的地: * Copy.java -- 寫出數據 -- OutputStream-- FileOutputStream -- 一次寫一個字節 2.5 字節輸入流: 具體操作步驟: * 字節輸入流操作步驟: * A:創建字節輸入流對象 FileInputStream fis = new FileInputStream("a.txt"); * B:調用方法讀取數據(一次讀取一個字節數組,提升效率) 一次讀取一個字節數組:public int read(byte[] b):返回實際讀取長度,數據被讀取到數組中。 -- 測試方法返回長度?根據String類的構造方法構造字符串 * C:釋放資源 fis.close 2.5 * 字節緩衝區流(也叫高效流): * BufferedInputStream(read() 一次讀取一個字節,public int read(byte[] b):返回實際讀取長度,數據被讀取到數組中。) * BufferedOutputStream(write(byte[]b)) * * 流 * 低級流: 基本的流,可以直接操作文件。 * 高級流:是操作基本流的流。 2.6 * 字節流複製文件: * A:基本字節流一次讀寫一個字節 * B:基本字節流一次讀寫一個字節數組 * C:高效字節流一次讀寫一個字節 * D:高效字節流一次讀寫一個字節數組 獲取時間的方法: System.currentTimeMillis() 三:編碼問題?? *String中的編碼和解碼問題。 * * 編碼: * 把我們能夠看懂的字符轉換爲看不懂的數據 * 解碼: * 把我們看不懂的數據轉換爲看得懂的字符 * * 舉例: * 電報/潛伏(餘則成 深海) * * 編碼表: * 小本子,這個本子上記錄了很多的漢字和對應的數據值。 * * 延安: * 今晚興慶公園見 * * 發報員: * 今晚興慶公園見 * 轉換成數據 * 發送數據 * * 餘則成: * 接收數據 * 記錄完畢後,就找出小本子,通過對應的數據值找到對應的字符 * 今晚興慶公園見 public byte[] getBytes(StringcharsetName) 按照給定的編碼方式,編碼字節數組(gbk,utf-8) String(byte[] bytes, String charsetName) 按照給定的編碼方式解碼字符數組 String s = "中國好"; byte[]bytes = s.getBytes("utf-8"); System.out.println(Arrays.toString(bytes)); //String(byte[]bytes, String charsetName) System.out.println(newString(bytes,"gbk")); 結論:用什麼編碼,就必須用什麼解碼。。 異常: 1.1 異常:就是程序出現的不正常的情況。 * 異常: * 錯誤:這是非常嚴重的問題,一般我們處理不了,一般在這裏指的是硬件問題。 * 異常: * 編譯時期異常 開始就必須要處理的,如果不處理,後面就走不了。 * 運行時期異常 開始可以不用處理。這種問題一旦發生,就是我們的程序問題,需要我們修改程序。 * * 體系結構: *Throwable: * Error: * Exception: * 非RuntimeException:編譯時期異常 * RuntimeException:運行時期異常 * 異常演示: * 除數不能爲0 * *java.lang.ArithmeticException: / by zero * * 針對異常,JVM默認的處理方案: * 一旦遇到程序出現了問題,就會把問題的類名,錯誤原因,錯誤的位置等信息打印在控制檯,以便我們觀察。 * 並且,會自動從當前出問題的地方停止掉。 * * 這種處理方案雖然可以,但是不夠好。 * 哪裏不好呢? * 其實程序出問題,不應該直接停止,因爲我們的程序可能是由多部分組成的, * 其中一個部分出問題了,不應該影響其他部分的執行。 * 所以,我們應該想辦法讓其他的部分能夠執行下去。 1.2 * 我們是如何處理異常,保證各個部分不影響的呢? * 兩種方案: * A:try...catch...finally * B:throws * *try...catch...finally: * try{ * 可能出現異常的代碼 * }catch(異常類名 變量名) { * 針對異常的代碼處理 * }finally { * 釋放資源的地方 * } * * 我們簡化一下第一個: *try{ * 可能出現異常的代碼 * }catch(異常類名 變量名) { * 針對異常的代碼處理 * } package com.edu_01; /** * * 我們是如何處理異常,保證各個部分不影響的呢? * 兩種方案: * A:try...catch...finally * B:throws * * try...catch...finally: * try{ * 可能出現異常的代碼 * }catch(異常類名變量名) { * 針對異常的代碼處理 * }finally{ * 釋放資源的地方 * } * * 我們簡化一下第一個: * try{ * 可能出現異常的代碼 * }catch(異常類名變量名) { * 針對異常的代碼處理 * } * */ publicclass ExceptionDemo3 { publicstaticvoid main(String[] args) { System.out.println("start"); int a= 10; int b = 0; try{ //可能出現異常的代碼 System.out.println(a/b);//當除數爲0的時候會拋出ArithmeticException這個異常 //接着程序會拿着這個異常和catch裏面的異常類已經對比 }catch(ArithmeticException e){ //當程序拋出ArithmeticException這個異常之後給出的具體的處理方法 System.out.println("你的除數不能爲0"); } System.out.println("end"); } } 1.3 * 多個異常的處理(演示數組索引越界異常,除數爲0異常) * A:針對每一個出現問題的地方寫一個try...catch語句 * B:針對多個異常,採用一個try,多個catch的情況。 * try...catch...catch... * * 遇到try裏面的問題,就自動和catch裏面進行匹配。 * 一旦匹配就執行catch裏面的內容,執行完畢後,接着執行後面的代碼。 * * 注意: * 如果異常間有子父關係,父必須在最後。 1.4 * 編譯時期異常和運行時期異常的區別: * 編譯時期異常:Java程序必須顯示處理,否則程序就會發生錯誤,無法通過編譯 * FileNotFoundException(文件未找到異常) * 運行時期異常:無需顯示處理,也可以和編譯時異常一樣處理 * ArithmeticException 1.5 *Throwable中的方法:(演示除數爲0異常) *printStackTrace():打印異常信息,程序從出問題的地方開始就會打印創建一個該異常對應的對象, 該對象直接調用打印方法 1.6(演示編譯器異常,運行期異常) *try...catch 是直接進行了處理。 * 而throws則是把異常處理的事情交給了調用者。 * *throws用在方法上,聲明方法有異常,交給調用者處理。 * 但是呢,如果是編譯時期異常,調用就必須處理。 * 如果是運行時期異常,調用者可以處理,也可以不處理。 1.7 *throws:(演示文件未找到異常,除數爲0異常) * 用在方法聲明後面,跟的是異常類名 * 可以跟多個異常類名,用,號隔開 * 表示拋出異常,由該方法的調用者來處理 * throws表示出現異常的一種可能,並不一定會發生這些異常 1.8 * 異常處理: *try...catch...finally * *finally:一般用於釋放資源。在數據庫操作或者IO流比較常見。 * * 特點: * 被finally控制的語句體一定會執行 * * 特殊情況:在執行到finally之前jvm退出了(比如System.exit(0)) 1.9 *finally相關的面試題: *final,finally的區別? * final:最終的意思。可以修飾類,方法,變量。 * 修飾類,類不能被繼承 * 修飾方法,方法不能被重寫 * 修飾變量,變量是常量 * finally: * 異常處理的一部分。被finally控制的代碼一定會執行。 * 特殊情況:在執行到finally之前,jvm退出了。 1.9.1 * 注意: * A:子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞) * B:如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異常或者是他的子集,子類不能拋出父類沒有的異常 C:如果被重寫的方法沒有異常拋出,那麼子類的方法絕對不可以拋出異常,如果子類方法內有異常發生,那麼子類只能try,不能throws 上述僅僅針對編譯時期異常 與運行時期異常無關。 1.9.2 throw和throws的區別? *throws: * 用在方法聲明後面,跟的是異常類名 * 可以跟多個異常類名,用逗號隔開 * 表示拋出異常,由該方法的調用者來處理 * throws表示出現異常的一種可能性,並不一定會發生這些異常 * *throw: * 用在方法體內,跟的是異常對象名 * 只能拋出一個異常對象名 * 表示拋出異常,由方法體內的語句處理 * throw則是拋出了異常,執行throw則一定拋出了某種異常? 案例演示:演示編譯時期異常(文件未找到異常)和運行時期異常(除數爲0異常)使用上的區別 *throw: * 如果throw的是編譯時期異常,在方法聲明上必須用throws進行標記 * 如果throw的是運行時期異常,在方法聲明上可以用throws進行標記,也可以不用。 package com.edu_03; import java.io.FileInputStream; import java.io.FileNotFoundException; /** * throw和throws的區別? *throws: * 用在方法聲明後面,跟的是異常類名 * 可以跟多個異常類名,用逗號隔開 * 表示拋出異常,由該方法的調用者來處理 * throws表示出現異常的一種可能性,並不一定會發生這些異常 * *throw: * 用在方法體內,跟的是異常對象名 * 只能拋出一個異常對象名 * 表示拋出異常,由方法體內的語句處理 * throw則是拋出了異常,執行throw則一定拋出了某種異常? * */ public class ThrowDemo { publicstatic void main(String[] args) { method(); try{ method2(); }catch (FileNotFoundException e) { e.printStackTrace(); } } privatestatic void method2() throws FileNotFoundException{ try{ FileInputStreamfis = new FileInputStream("D://a.txt"); }catch(FileNotFoundExceptione){ //當遇見這個異常之後,直接拋出(這就是我給出的處理方法) //如果【拋出的是編譯時期異常的話,必須在方法聲明上給予聲明 thrownew FileNotFoundException(); } } privatestatic void method() throws ArithmeticException{ inta = 10; intb = 2; if(b==0) { //在這裏拋出的是運行時期異常,拋出這個異常的同時,可以在方法聲明上給予聲明,也可以不聲明 thrownew ArithmeticException(); }else{ System.out.println(a/b); } } }
十二、十三天總結筆記
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.