Java常用類庫(3)——IO流
1.本章內容:
1)對於計算機資源的讀取和取出
2)對檔案的增刪改以及查詢的操作
3)對檔案位元組上的進行讀入或者寫出
4)對文字檔案進行字元上的讀入或者寫出
一:IO流中,File物件
1.File物件是檔案和目錄的抽象表示
2.File中常見的構造方法:
1)一參構造方法:File file = new File("檔案目錄名(如果該目錄下沒有該檔案,就建立,否則返回false)");
1 import java.io.File; 2 import java.io.IOException; 3 4 public class Test { 5 public staticvoid main(String[] args) throws IOException { 6 //建立File物件 7 File file = new File("D://Java"); 8 boolean newFile = file.createNewFile(); 9 System.out.println(newFile?"建立成功":"建立失敗"); 10 } 11 }
2)二參構造方法:File file = new File("資料夾名","檔名字")
1 import java.io.File; 2import java.io.IOException; 3 4 public class Test { 5 public static void main(String[] args) throws IOException { 6 File file = new File("D://java"); 7 //建立資料夾 8 file.mkdir(); 9 //建立兩參的構造方法 10 File a = new File(file,"javaee"); 11 boolean newFile = a.createNewFile();12 System.out.println(newFile); 13 } 14 }
3.File中常見的方法:
1)createNewFile();當檔案不存在時,建立檔案
2)delete();刪除檔案或者目錄
3)exists();判斷是否存在該檔案或者目錄
4)getAbsolutePath();獲取檔案或者目錄的絕對地址
5)getName();獲取檔案或者目錄的名稱
6)getParent();返回此路徑的父類檔名稱
7)length();返回路徑代表的檔案長度
8)list();返回一個字串陣列,表示抽象路徑下的檔案和目錄的名稱
listFiles();獲取抽象路徑名下的檔案的名字
9)mikdir();建立資料夾
10)minkdirs();建立多級資料夾
11)renameTo();複製檔案內容到另一個新建立的檔案下面
1 import java.io.IOException; 2 3 public class Test { 4 public static void main(String[] args) throws IOException { 5 File file = new File("D://java"); 6 File file2 = new File("D://python"); 7 file.renameTo(file2); 8 } 9 }
12)判斷的方法:\
13)分隔符:pathSeparator表示分號,separator表示"\",都是用來表示檔案的分割的
4.遍歷檔案
1 import java.io.File; 2 import java.io.IOException; 3 4 public class Test { 5 public static void main(String[] args) throws IOException { 6 //建立檔案物件 7 File file = new File("e://"); 8 //呼叫方法,獲得該物件路徑下的檔案和目錄的陣列 9 File[] files = file.listFiles(); 10 listFile(files); 11 12 } 13 public static void listFile(File [] file){ 14 if(file!=null && file.length>0){ 15 for(File files : file){ 16 if(files.isFile()) { 17 if (files.getName().endsWith(".txt")) { 18 if (files.length() > 200 * 1024 * 1024) { 19 System.out.println("找到了檔案" + files.getAbsolutePath()); 20 } 21 } 22 }else{ 23 File[] files1 = files.listFiles(); 24 listFile(files1); 25 } 26 } 27 } 28 } 29 }
5.檔案過濾器:
6.相對路徑和絕對路徑:
1)相對路徑:在Java程式碼中,是相對於專案路徑的路徑,這是一個不完整的便捷路徑
2)絕對路徑:從碟符開始,是一個完整的路徑
二:IO流:
1.IO流的概述:
1)可以將資料傳送這種操作看作是資料流動,按照流動的方向分為資料流入(input)和資料流出(output)
2)java中IO流的操作實際上是對Java.io包下的類的使用,利用這些常用類對資料進行讀取(input)和寫出(output)
2.IO流的分類:
1)按照資料的流動方向:輸入流(input)和輸出流(output)
2)按照流動的資料型別來分:字元流和位元組流
3)學習路徑:(一下都是頂級的父類)
位元組流:
—— 輸入流:InputStream
—— 輸出流:OutputStream
字元流:
——輸入流:Reader
——輸出流:Writer
4)一切物件皆字元:計算機中,一切的資料(視訊,音訊,文字等)都是以二進位制來儲存的,在資料傳輸時也是有二進位制來儲存的,後續學習的任何流都是通過二進位制 來傳輸的。
3.位元組輸出流:OutputSteam
1)將Java程式碼的檔案寫入記憶體中
2)位元組輸出流中常用的方法:
2.1)close();關閉流
2.2)flush();重新整理流(該父類的子類中,有些流具有緩衝的作用,要使用到重新整理)
2.3)write(byte[]);一次寫入一個字元
write(byte[] ,int begin,int len);寫入一個字元陣列的子陣列
write(int a);寫入一個int型別的數,該數不超過225,底層實際還是字元
3)常用的構造方法:
3.1)FileOutputSream(File file);建立檔案輸出流以寫入由指定的 File
物件表示的檔案
3.2) FileOutputSream(File file,boolean append);
3.3) FileOutputStream(String name);建立檔案輸出流以寫入具有指定名稱的檔案。
3.4) FileOutputStream(String name,boolean append);
是否有append的區別:當append為true時,表示過載物件時,檔案追加在檔案內,如果為false或者不寫時,表示清空原始檔,從新寫入新的檔案
4)程式碼演示
1 import java.io.File; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 5 public class Test { 6 public static void main(String[] args) throws IOException { 7 //建立FileOutputStream物件 8 FileOutputStream fos = new FileOutputStream("D://java");//如果沒有該檔案,就自動建立 9 //寫入一個位元組字元 10 fos.write(65); 11 //關閉位元組流 12 fos.close(); 13 System.out.println("已經寫出來了"); 14 15 } 16 }
1 import java.io.File; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 5 public class Test { 6 public static void main(String[] args) throws IOException { 7 //建立FileOutputStream物件 8 FileOutputStream fos = new FileOutputStream("D://java",true);//如果沒有該檔案,就自動建立 9 //寫入一組字元 10 byte [] bytes = {65,66,67,68,69}; 11 fos.write(bytes); 12 //關閉位元組流 13 fos.close(); 14 System.out.println("已經寫出來了"); 15 16 } 17 }
1 import java.io.File; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 5 public class Test { 6 public static void main(String[] args) throws IOException { 7 //建立FileOutputStream物件 8 FileOutputStream fos = new FileOutputStream("D://java",true);//如果沒有該檔案,就自動建立 9 //寫入一組字元 10 byte [] bytes ="ABCDEF".getBytes();//getBytes()該方法,將字串轉換為一個位元組陣列 11 fos.write(bytes,1,2);//從1下表開始,寫兩個長度 12 //關閉位元組流 13 fos.close(); 14 System.out.println("已經寫出來了"); 15 16 } 17 }
4.位元組輸入流FileInoutStream
4.1)將檔案中的東西寫入Java程式碼中
4.2)FileInputOutput類中常用的方法:
1)close();關閉流
2)read(byte a);讀入一個位元組
3)read(byte [] a);讀入一組位元組陣列
4.3)FileInputSream類中常見的構造方法
1)FileInputStream(File file);
2)FileInputStream(String name);
4.4)程式碼演示:
1 import java.io.FileInputStream; 2 import java.io.FileNotFoundException; 3 import java.io.IOException; 4 5 public class Test { 6 public static void main(String[] args) throws IOException { 7 //建立FileInoutStream物件 8 FileInputStream fis = new FileInputStream("D://java"); 9 //建立一個位元組陣列 10 byte [] bytes = new byte[10]; 11 //呼叫方法,採用一次讀入一個位元組陣列的方式 12 int len = fis.read(bytes); 13 System.out.println(new String(bytes,0,len)); 14 len = fis.read(bytes); 15 System.out.println(new String(bytes,0,len)); 16 len = fis.read(bytes); 17 System.out.println(new String(bytes,0,len)); 18 fis.close(); 19 } 20 }
5.字元編碼:
5.1)UTF-8:unicode編碼,支援多個國家的編碼
5.2)亂碼的發生:輸入端和輸出端的編碼不匹配
6.字元輸出:
1)只能用來讀寫文字
2)常用的構造方法:
3)常用的方法:
4)程式碼:
1 import java.io.FileWriter; 2 import java.io.IOException; 3 4 public class Test { 5 public static void main(String[] args) throws IOException { 6 FileWriter fw = new FileWriter("D://java",true); 7 fw.append("鋤禾日當午").append("汗滴禾下土").append("誰知盤中餐"); 8 fw.write("粒粒皆辛苦"); 9 fw.close(); 10 } 11 }
七:字元讀取:
1)常用的構造方法:同字元寫入相同
3)字元的寫入需要重新整理:flush();
2)程式碼演示(一次讀取一個字元)
1 import java.io.FileReader; 2 import java.io.IOException; 3 4 public class Test { 5 public static void main(String[] args) throws IOException { 6 FileReader fr = new FileReader("D://java"); 7 while(true){ 8 int read = fr.read(); 9 if(read==-1){ 10 break; 11 }
fr.flush();
fr.close(); 12 System.out.println((char)read); 13 } 14 15 } 16 }
3)程式碼演示(一次讀取一個字元陣列)
1 import java.io.FileReader; 2 import java.io.IOException; 3 4 public class Test { 5 public static void main(String[] args) throws IOException { 6 FileReader fr = new FileReader("D://java"); 7 //建立一個字元陣列 8 char [] chars = new char[100]; 9 int len = fr.read(chars); 10 String str = new String(chars,0,len); 11 System.out.println(str); 12 } 13 }
8.位元組轉換流(位元組轉換為字元)
8.1)位元組輸入流的轉換:InputStreamReader();
8.1.1) 程式碼演示:
1 import java.io.*; 2 3 public class Test { 4 public static void main(String[] args) throws IOException { 5 //建立位元組輸入流 6 FileInputStream fis = new FileInputStream("D://java"); 7 //建立轉換流 8 InputStreamReader isr = new InputStreamReader(fis,"UTF-8"); 9 while(true){ 10 int read = isr.read(); 11 if(read==-1){ 12 break; 13 } 14 System.out.println((char)read); 15 } 16 } 17 }
8.2)位元組輸出流轉換:OutputStreamWriter;
8.2.1) 程式碼演示:
1 import java.io.*; 2 3 public class Test { 4 public static void main(String[] args) throws IOException { 5 //建立位元組輸出流物件 6 FileOutputStream fos = new FileOutputStream("D://java"); 7 //建立位元組轉換流 8 OutputStreamWriter osw = new OutputStreamWriter(fos); 9 //寫入資料 10 osw.write("床前明月光,地上鞋一堆"); 11 osw.flush(); 12 osw.close(); 13 } 14 }
8.列印流:
1 import java.io.*; 2 3 public class Test { 4 /** 5 * 字元輸出流(列印流) 6 * @param args 7 * @throws IOException 8 */ 9 public static void main(String[] args) throws IOException { 10 // //建立列印流物件 11 // PrintStream ps = new PrintStream("D://java"); 12 // //寫入資料 13 // ps.println("唧唧復唧唧,木蘭當戶織"); 14 // ps.println("不聞機杼聲,唯聞女嘆息"); 15 // ps.println("問女何所思,問女何所憶"); 16 17 18 // //建立列印流物件 19 // PrintWriter ps = new PrintWriter("D://java"); 20 // //寫入資料 21 // ps.println("唧唧復唧唧,木蘭當戶織"); 22 // ps.println("不聞機杼聲,唯聞女嘆息"); 23 // ps.println("問女何所思,問女何所憶"); 24 25 /** 26 * 在位元組轉換為字元的時候,建議採用一下方法,將位元組流轉換為列印流 27 */ 28 //建立位元組輸出流 29 FileOutputStream fos = new FileOutputStream("D://java"); 30 //建立列印流物件 31 PrintWriter pw = new PrintWriter(fos); 32 pw.println("唧唧復唧唧,木蘭當戶織"); 33 pw.println("不聞機杼聲,唯聞女嘆息"); 34 pw.println("問女何所思,問女何所憶"); 35 pw.flush(); 36 pw.close(); 37 } 38 }
9.快取讀取流:
9.1)將字元輸入流,轉換為可以快取,可以一次性讀取一行的字元緩衝流
9.2)程式碼演示:
1 import java.io.*; 2 3 public class Test { 4 /** 5 * 字元輸出流(列印流) 6 * @param args 7 * @throws IOException 8 */ 9 public static void main(String[] args) throws IOException { 10 //建立字元輸入流物件 11 FileReader fw = new FileReader("D://java"); 12 //將字元輸入流轉換為字元緩衝流 13 BufferedReader br = new BufferedReader(fw); 14 String text = br.readLine(); 15 System.out.println(text); 16 } 17 }
三:收集異常日誌:
1 import java.io.*; 2 import java.text.SimpleDateFormat; 3 import java.util.Date; 4 5 public class Test { 6 /** 7 * 日誌異常收集 8 * @param args 9 * @throws IOException 10 */ 11 public static void main(String[] args) throws IOException { 12 try{ 13 String s = null; 14 System.out.println(s.toString()); 15 }catch (Exception e){ 16 //建立寫入流 17 PrintWriter fw = new PrintWriter("D://java"); 18 //建立日期格式化物件 19 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); 20 //建立當前日期物件 21 Date date = new Date(); 22 fw.println(sdf.format(date)); 23 e.printStackTrace(fw); 24 fw.close(); 25 } 26 } 27 }
四:properties配置檔案
1.properties既屬於集合類的知識,又涉及到IO流
2.Properties為他的類,properties是他的檔案
3.程式碼演示:將檔案寫入磁碟
1 import java.io.FileWriter; 2 import java.io.IOException; 3 import java.util.Properties; 4 5 public class Test { 6 /** 7 * Properties類和properties檔案 8 * 將檔案寫入磁碟 9 * @param args 10 */ 11 public static void main(String[] args) throws IOException { 12 //建立Properties類物件 13 Properties pro = new Properties(); 14 //因為他底層使用Map集合,鍵值對的形式,呼叫方法,傳入引數 15 pro.put("name","金蘋果"); 16 pro.put("info","講訴了農夫種植金蘋果的心酸過程"); 17 //建立一個字元輸入流,將該檔案寫入磁碟 18 FileWriter fw = new FileWriter("D://java.properties"); 19 pro.store(fw,"圖書儲存"); 20 fw.close(); 21 } 22 }
4.程式碼演示:將檔案內容從磁盤裡面讀出來
1 import java.io.FileReader; 2 import java.io.IOException; 3 import java.util.Properties; 4 5 public class Test { 6 /** 7 * Properties類和properties檔案 8 * 將檔案寫入磁碟 9 * @param args 10 */ 11 public static void main(String[] args) throws IOException { 12 //建立Properties類物件 13 Properties pro = new Properties(); 14 //建立一個字元輸出流 15 FileReader fr = new FileReader("D://java.properties"); 16 //呼叫方法,將檔案從磁碟中讀取出來 17 pro.load(fr); 18 System.out.println(pro.get("name")); 19 System.out.println(pro.get("info")); 20 fr.close(); 21 } 22 }
五:序列化和反序列化:
1.序列化是將Java編寫的類儲存到檔案中,他是一些看不懂得東西,反序列化就是將檔案裡面的東西寫到程式中來
2.序列化技術:
1 import java.io.FileOutputStream; 2 import java.io.ObjectOutputStream; 3 import java.io.Serializable; 4 5 public class Test { 6 /** 7 * 序列化技術,將類儲存到檔案中,以便永久儲存 8 * @param args 9 */ 10 public static void main(String[] args) throws Exception { 11 //建立圖書物件 12 Book book = new Book("金蘋果","講訴了農夫種植蘋果的心酸過程"); 13 //建立序列化物件 14 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D://java01")); 15 oos.writeObject(book); 16 oos.close(); 17 } 18 //implements Serializable 用於標記該類將要序列化 19 static class Book implements Serializable { 20 String name; 21 String info; 22 public Book(){}; 23 24 public Book(String name, String info) { 25 this.name = name; 26 this.info = info; 27 } 28 29 @Override 30 public String toString() { 31 return "Book{" + 32 "name='" + name + '\'' + 33 ", info='" + info + '\'' + 34 '}'; 35 } 36 } 37 }
3.反序列化技術:
1 import java.io.FileInputStream; 2 import java.io.ObjectInputStream; 3 import java.io.Serializable; 4 5 public class Test { 6 /** 7 * 反序列化技術,檔案中儲存的類,寫到程式中 8 * 9 * @param args 10 */ 11 public static void main(String[] args) throws Exception { 12 //建立反序列化物件 13 ObjectInputStream obs = new ObjectInputStream(new FileInputStream("D://java01")); 14 // Object o = obs.readObject(); 15 // System.out.println(o); 16 Book o = (Book)obs.readObject(); 17 System.out.println(o); 18 } 19 20 //implements Serializable 用於標記該類將要序列化 21 static class Book implements Serializable { 22 String name; 23 String info; 24 25 public Book() { 26 } 27 28 public Book(String name, String info) { 29 this.name = name; 30 this.info = info; 31 } 32 33 @Override 34 public String toString() { 35 return "Book{" + 36 "name='" + name + '\'' + 37 ", info='" + info + '\'' + 38 '}'; 39 } 40 } 41 }
(如果反序列化中的類中有其他的引用資料型別,那麼那個引用資料型別也要實現標記介面)
4.序列化和反序列化是用來資料傳輸或者本地儲存的
5.
六:try-with-resources:
1.簡化了程式碼的異常處理,他是自動進行了close()操作
2.程式碼演示:
1 import java.io.FileNotFoundException; 2 import java.io.FileReader; 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 public class Test { 7 /** 8 *try-with-resource既是異常中的知識點,也是IO流中的知識點 9 * @param args 10 */ 11 public static void main(String [] args)throws FileNotFoundException{ 12 // //1.7版本: 13 // try(FileReader fr = new FileReader("D://java01")) { 14 // int num = fr.read(); 15 // System.out.println((char)num); 16 // 17 // } catch (IOException e) { 18 // e.printStackTrace(); 19 // } 20 21 //1.9版本 22 FileReader fr = new FileReader("D://java01"); 23 PrintWriter fw = new PrintWriter("D://java01"); 24 try(fr;fw){ 25 int c = fr.read(); 26 System.out.println((char)c); 27 28 }catch (IOException e){ 29 e.printStackTrace(); 30 } 31 } 32 }
3.使用try-with-resources的類必須實現Closeable()或者AutoCloseable()介面。