1、IO流的分類
1.根據處理數據類型的不同分為: 字符流:1)Reader 讀取字符流的抽象類 常用方法: read() 讀取單個字符 read(char[] cbuf) 將字符讀入數組。 read(char[] cbuf, int off, int len) 將字符讀入數組的某一部分。 close() 關閉該流並釋放與之關聯的所有資源。 2)Writer 寫入字符流的抽象類 常用方法:write(int c) 寫入單個字符。 write(String str) 寫入字符串 write(String str, int off, int len) 寫入字符串的某一部分。 write(char[] cbuf) 寫入字符數組。 write(char[] cbuf, int off, int len) 寫入字符數組的某一部分。 flush() 刷新該流的緩沖。 close() 關閉此流,但要先刷新它。 字節流: 1)InputStream 此抽象類是表示字節輸入流的所有類的超類 常用方法:read() 從輸入流中讀取數據的下一個字節。 read(byte[] b) 從輸入流中讀取一定數量的字節,並將其存儲在緩沖區數組 b 中。 read(byte[] b, int off, int len) 將輸入流中最多 len 個數據字節讀入 byte 數組。 close() 關閉此輸入流並釋放與該流關聯的所有系統資源。 2) OutputStream 此抽象類是表示字節輸出流的所有類的超類 常用方法:write(int b) 將指定的字節寫入此輸出流。 write(byte[] b) 將 b.length 個字節從指定的 byte 數組寫入此輸出流。 write(byte[] b, int off, int len) 將指定 byte 數組中從偏移量 off 開始的 flush() 刷新此輸出流並強制寫出所有緩沖的輸出字節。 close() 關閉此輸出流並釋放與此流有關的所有系統資源。 2.根據數據流向不同分為:輸入流和輸出流 3.字符流的由來: 因為數據編碼的不同,而有了對字符進行高效操作的流對象。本質其實就是基於字節流讀取時,去查了指定的碼表。 4.字節流和字符流的區別: (1)讀寫單位不同:字節流以字節(8bit)為單位,字符流以字符為單位,根據碼表映射字符,一次可能讀多個字節。 (2)處理對象不同:字節流能處理所有類型的數據(如圖片、avi等),而字符流只能處理字符類型的數據。 (3)字節流在操作的時候本身是不會用到緩沖區的,是文件本身的直接操作的;而字符流在操作的時候下后是會用到緩沖區的,是通過緩沖區來操作文件,我們將在下面驗證這一點。 5.結論:優先選用字節流。首先因為硬盤上的所有文件都是以字節的形式進行傳輸或者保存的,包括圖片等內容。但是字符只是在內存中才會形成的,所以在開發中,字節流使用廣泛。 6.輸入流和輸出流 對輸入流只能進行讀操作,對輸出流只能進行寫操作,程序中需要根據待傳輸數據的不同特性而使用不同的流。
2、IO流的結構圖
3、字節流復制文件
1 package FileInputStream; 2 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 7 // 字節流復制文件 8 public class Copy字節流復制文件 { 9 public static void main(String[] args) { 10 // 復制文件的起始時間 11 long s = System.currentTimeMillis(); 12 // 定義輸入\輸出流為mull 13 FileInputStream fis = null; 14 FileOutputStream fos = null; 15 // 手動拋出異常 16 try { 17 // 讀取文件 18 fis = new FileInputStream("d:\\digui.mp4"); 19 // 讀取完畢復制的文件 20 fos = new FileOutputStream("d:\\dd.mp4"); 21 // 定義一個字節數組 存到數組b中 22 byte[] b = new byte[1024 * 10]; 23 // 起始長度為0 24 int len = 0; 25 // while(){} 循環 一邊讀取 ,一邊寫入(復制)文件 26 while ((len = fis.read(b)) != -1) { 27 fos.write(b, 0, len); 28 fos.flush(); // 文件刷新 29 } 30 } catch (Exception e) { 31 System.out.println(e); 32 throw new RuntimeException("文件復制失敗"); // 手動拋除異常 33 // 最終執行語句 34 } finally { 35 // 復制的文件不為空時 關閉釋放資源 36 if (fos != null) { 37 try { 38 fos.close(); 39 } catch (IOException e) { 40 e.printStackTrace(); 41 } finally { 42 if (fis != null) { 43 try { 44 fis.close(); 45 } catch (IOException e) { 46 System.out.println(e); 47 throw new RuntimeException("文件復制失敗"); 48 } 49 } 50 } 51 } 52 } 53 // 復制文件的結束時間 單位:ms 毫秒 54 long e = System.currentTimeMillis(); 55 System.out.println(e-s); 56 } 57 }
4、字符流復制文件
1 package Demo; 2 3 import java.io.FileReader; 4 import java.io.FileWriter; 5 import java.io.IOException; 6 //字符流復制文件 FileReader read讀取 7 // FileWriter write寫入 8 public class Copy字符流復制文件 { 9 public static void main(String[] args) { 10 long s = System.currentTimeMillis(); 11 FileReader fr = null; // 字符輸入流 12 FileWriter fw = null; // 字符輸出流 13 try { 14 fr = new FileReader("d:\\b.txt"); 15 fw = new FileWriter("d:\\b22.txt"); 16 char[] c = new char[1024]; // 字符類char 17 int len = 0; 18 while((len=fr.read(c))!=-1){ 19 fw.write(c,0,len); 20 fw.flush(); 21 } 22 } catch (Exception e) { 23 e.printStackTrace(); 24 }finally{ 25 if(fw!=null){ 26 try { 27 fw.close(); 28 } catch (IOException e) { 29 e.printStackTrace(); 30 }finally{ 31 if(fr!=null){ 32 try { 33 fr.close(); 34 } catch (IOException e) { 35 e.printStackTrace(); 36 } 37 } 38 } 39 } 40 } 41 long e = System.currentTimeMillis(); 42 System.out.println(e-s); 43 } 44 }