1. 程式人生 > >Java IO 字節流與字符流 (二)

Java IO 字節流與字符流 (二)

減少 rgs 作文 設計 fileinput src != tro 關閉

概述

IO流用來處理設備之間的數據傳輸

Java對數據的操作時通過流的方式

Java用於操作流的對象都在IO包中

流按操作的數據分為:字節流和字符流

流按流向不同分為:輸入流和輸出流

IO流常用基類

字節流的抽象基類

InputStream,OuputStream

字符流的抽象基類

Reader,Writer

註:

這些基類的子類都是以基類的名稱結尾的,如FileReader,FileInputStream

字節流

技術分享

字節流:以字符為導向的流

簡單介紹一個例子,演示字節流對圖片的復制

   1: import java.io.*;
   2:  
   3: class IOCopyPicDemo 
   4: {
   5:     public static void main(String[] args) throws IOException
   6:     {
   7:         //創建字節文件讀取流
   8:         FileInputStream fis = new FileInputStream("pic1.png");
   9:         //創建字節文件輸入流
  10:         FileOutputStream fos = new FileOutputStream("pic2.png");
  11:  
  12:         //定義緩沖區
  13:         byte[] buf = new byte[1024];
  14:         
  15:         //讀取字節到緩沖區,並寫入輸出流,即寫入到文件
  16:         int len = -1;
  17:         while( (len = fis.read(buf)) != -1)
  18:         {
  19:             fos.write(buf,0,len);
  20:         }
  21:         
  22:         //關閉資源
  23:         fis.close();
  24:         fos.close();
  25:         
  26:     }
  27: }

字符流

技術分享

字符流:以字符為導向的流

字符流只能操作文本,下面是字符流拷貝文本文件的例子

   1: import java.io.*;
   2:  
   3: class IOFileCopyDemo 
   4: {
   5:     public static void main(String[] args) throws IOException
   6:     {
   7:         //創建字符文件輸入流
   8:         FileReader fr = new FileReader("IODemo1.java");
   9:         
  10:         //創建字符文件輸出流
  11:         FileWriter fw = new FileWriter("IODemo2.java");
  12:         
  13:         //字符緩沖區
  14:         char[] data = new char[1024];
  15:         
  16:         int len = -1;
  17:         
  18:         //讀入字符,並寫入文件
  19:         while( (len = fr.read(data)) != -1)
  20:         {
  21:             fw.write(data,0,len);
  22:         }
  23:  
  24:         //關閉資源
  25:         fw.close();
  26:         fr.close();
  27:         
  28:     }
  29: }

轉換流

InputStreamReader,OutputStreamWriter

InputStreamReader(InputStream in):接收字節流,轉換為字符流

InputStreamReader(InputStream in, Charset cs):接收字節流,按照指定的編碼表轉換為字符流

其實FileReader就是使用系統默認編碼表的轉換流,其內部使用的也是字節流,因此,下面兩句是一樣的

FileReader fr = new FileReader(“1.txt”);

InputStreamReader isr = new InputStreamReader(new FileInputStream(“1.txt”),”GDK”);

緩沖區與裝飾設計模式

緩沖區

顧名思義,對數據起到一個緩沖的作用,減少了流之間的耦合性,減少了每次與硬盤設備之間的通信,提供了效率

BufferedWriter,BufferedReader,BufferedInputStream,BufferedOutputStream實現了對對應流的緩沖(其實內部就是定義了一個數組,無論讀一個數組或者一個字,內部都會事先讀取好一個足夠大的緩沖區數組,供你使用)

裝飾設計模式

當我們對一個體系中的類進行功能加強時,如果對每個類都定義其子類,會使得整個體系顯得非常臃腫,而且擴展性不好,沒出現一個新類,就要對其創建一個用於功能增強的子類,整個時候就出現了裝飾類,這個裝飾類就是對一個體系的類都進行功能的加強,使用時傳入體系中類的對象,同時這個裝飾類又應該屬於這個體系

例如:BufferedReader,對Reader體系中的所有類進行加強,加入緩沖技術,方法的接口中使用的是父類引用,利用多態提高了功能擴展性

裝飾設計模式的演變過程

技術分享

IO異常處理方式

IO的異常基類為IOException,是Exception的子類,代表需要被程序員處理

由於IO涉及到了各種資源,所以try處理時,必須要在finally塊中進行關閉資源操作

   1: /*
   2: IO異常處理
   3: */
   4:  
   5: import java.io.*;
   6:  
   7: class IOExceptionHandleDemo 
   8: {
   9:     public static void main(String[] args) 
  10:     {
  11:         FileWriter fw = null;
  12:         FileReader fr = null;
  13:         try
  14:         {
  15:             fw = new FileWriter("IODemo1.txt");
  16:             fr = new FileReader("IODemo2.txt");
  17:             fw.write(fr.read());
  18:  
  19:         }
  20:         catch (IOException e)
  21:         {
  22:             System.out.println(e.toString());
  23:         }
  24:         finally
  25:         {
  26:             if(fw != null)
  27:             {
  28:                 try
  29:                 {
  30:                     fw.close();
  31:                 }
  32:                 catch (IOException e)
  33:                 {
  34:                     System.out.println("close exception!");
  35:                 }
  36:             }
  37:             if(fr != null)
  38:             {
  39:                 try
  40:                 {
  41:                     fr.close();
  42:                 }
  43:                 catch (IOException e)
  44:                 {
  45:                     System.out.println("close exception!");
  46:                 }
  47:             }
  48:         }
  49:     }
  50: }

Java IO 字節流與字符流 (二)