談談java的I/O流【阿敏分享】

今天阿敏分享信息,聊到了java的IO流,下面就以此地來複習回顧一下IO流吧!

 

IO流的分類:
1、根據處理的數據類型不同:字節流和字符流。
2、根據流向不同:輸入流和輸出流。
3、根據流的功能不同:節點流和處理流。

IO流的四大抽象類:
字符流:Reader、Writer
字節流:InputStream、OutputSteam

字節流和字符流的區別:
1、字節流是每次讀一個字節就返回一個字節,而字符流
可以讀多個字節再返回。
2、字節流可以處理所有類型的數據,字符流只能處理字符數據。

總結:只是處理純文本數據,就優先考慮使用字符流。
 
下面是阿敏從網上找到的圖,挺全:
 
以下是他貼的代碼:讀文本文件
 
  1. FileReader fr=null
  2.         try { 
  3.             fr = new FileReader("D:\\test.sql"); 
  4.             int ch = 0
  5.             while(( ch = fr.read()) != -1){ 
  6.                 System.out.println((char)ch); 
  7.             } 
  8.         } catch (IOException e) { 
  9.             e.printStackTrace(); 
  10.         }finally{ 
  11.             if(fr!=null){ 
  12.                 try { 
  13.                     fr.close(); 
  14.                 } catch (IOException e1) { 
  15.                     e1.printStackTrace(); 
  16.                 } 
  17.  
  18.             } 
  19.         } 
以下例子是簡單的對一個文本文件讀取,複製到另一個文本文件,爲了提高效率可以考慮用包裝流。其中還可以指定字符集。
 
  1. BufferedReader bufr = null
  2.         BufferedWriter bufw = null
  3.         try { 
  4.  
  5.             bufr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\test.sql"), "GBK")); 
  6.             bufw = new BufferedWriter(new FileWriter("D:\\test1.sql")); 
  7.             String line = null
  8.             while(( line = bufr.readLine()) != null){ 
  9.                 bufw.write(line); 
  10.                 bufw.flush(); 
  11.             } 
  12.         } catch (IOException e) { 
  13.             e.printStackTrace(); 
  14.         }finally{ 
  15.             try { 
  16.                 if(bufw!=null){ 
  17.                     bufw.close(); 
  18.                 } 
  19.                 if(bufr!=null){ 
  20.                     bufr.close(); 
  21.                 } 
  22.             } catch (IOException e1) { 
  23.                 e1.printStackTrace(); 
  24.             } 
  25.         } 
在日常應用讀取文本文件最好就是
new BufferedReader(new InputStreamReader(new FileInputStream(filename), "GBK"))
這樣指定一個字符集 亂碼 沒問題。
 
 10**敏  10:58:33
對象流。。好少用,webservice中的VO傳輸就用到這個了
10**敏  11:00:55
ObjectInputStream
       Object readObject();
ObjectOutputStream
       void writeObject(Object):
主用就是用到以上兩個方法
注意:寫入對象必須實現Serializable 接口 。
 
 10**敏  11:03:32
用於給類指定一個UID,而UID是通知類中的可序列化成員的數字簽名運算出來的一個long型的值。。所有在weblogic或者Socket中傳輸。要是報了一個錯什麼序列版本不一致,你就知道就是這個UID,即兩邊的jar包不一樣導致
所以有些人開發網絡傳輸時,會指定一個UID值,而不是自動生成

上邊的例子中
  bufr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\test.sql"), "GBK"));
其中InputStreamReader 是一個轉換流,
特點:
1、是字節流和字符流之間的橋樑。
2、該流對象中可以對讀取到的字節數據進行指定編碼表的編碼轉換。

這裏字節流就不細說了,代碼實現跟字符流大同小異。
哦,還有一個比較少用的LineNumberReader
 
 
 
以上IO流的例子中,存在代碼
try{
}catch(){
}finally{
};
這個是java控制異常的處理流程。當然finally不一定要。
finally的作用就是,每次運行代碼,最終都會執行finally的代碼塊,例如用於,流的關閉。
 
總結:日常應用用得最多的就是文本流,其中也有可能文本+圖片的,這時可以用字節流,而一般爲了提高效率,都會使用包裝流對X流進行包裝,最後,當成功打開流時,用完後不要忘記關閉哦。
 
 
======================================================================================================
以上就是阿敏同學分享的東西,下面我也來分享下我自己遇到的一個java的IO問題:
也就是讀取jar包中的密鑰文件,大體的情況是這樣的,在我參與的某個項目當中,用戶爲了提高系統的安全性需要用到非對稱的加密,而我所採用的非對稱加密算法是RSA加密,頁面上的用戶登錄密碼採用RSA的公鑰(javascript文件)進行加密,而後臺採用java類寫的解密方法解密,解密的過程需要讀取密鑰文件,所以就涉及到I/O方面的開銷。
剛開始我只能讀jar包外面的密鑰文件,但是jar包內的密鑰文件,我老是讀取不到,後才找到方法。
 
  1. private static String RSAKeyStore = "c:/conf/RSAKey.txt";
  2. public static KeyPair getKeyPair() throws Exception { 
  3.         FileInputStream fis = new FileInputStream(RSAKeyStore); 
  4.         ObjectInputStream oos = new ObjectInputStream(fis); 
  5.         KeyPair kp = (KeyPair) oos.readObject(); 
  6.         oos.close(); 
  7.         fis.close(); 
  8.         return kp; 
  9.     } 
上面的方法就是第一次寫的,寫的方法就加載非jar包內的文件,這樣的方式去讀jar包內的文件是不可行的,如果想能讀jar內的文件可以用下面的方法:
 
  1. .... 
  2. private static String RSAKeyStore = "/net/thinkeye/util/RSAKey.txt"
  3. public static KeyPair getKeyPair() throws Exception { 
  4.         System.out.println("[開始]============[加載密鑰]============[開始]"); 
  5.         InputStream fis = RSAUtil.class.getResourceAsStream(RSAKeyStore); 
  6.         ObjectInputStream oos = new ObjectInputStream(fis); 
  7.         KeyPair kp = (KeyPair) oos.readObject(); 
  8.         oos.close(); 
  9.         fis.close(); 
  10.         System.out.println("[結束]============[加載密鑰]============[結束]"); 
  11.         return kp; 
  12.     } 
 
也就是讀jar包內的文件,把FileInputStream 的文件直接改爲InputStream ,直接使用類的getResourceAsStream方法去讀jar包內文件,然後再轉成對象流就ok了。
 
不信你試試。呵呵!至於更多的方法使用大家可以上網去找下,我也不多講了。
 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章