今天阿敏分享信息,聊到了java的IO流,下面就以此地來複習回顧一下IO流吧!
IO流的分類:
1、根據處理的數據類型不同:字節流和字符流。
2、根據流向不同:輸入流和輸出流。
3、根據流的功能不同:節點流和處理流。
IO流的四大抽象類:
字符流:Reader、Writer
字節流:InputStream、OutputSteam
字節流和字符流的區別:
1、字節流是每次讀一個字節就返回一個字節,而字符流
可以讀多個字節再返回。
2、字節流可以處理所有類型的數據,字符流只能處理字符數據。
總結:只是處理純文本數據,就優先考慮使用字符流。
1、根據處理的數據類型不同:字節流和字符流。
2、根據流向不同:輸入流和輸出流。
3、根據流的功能不同:節點流和處理流。
IO流的四大抽象類:
字符流:Reader、Writer
字節流:InputStream、OutputSteam
字節流和字符流的區別:
1、字節流是每次讀一個字節就返回一個字節,而字符流
可以讀多個字節再返回。
2、字節流可以處理所有類型的數據,字符流只能處理字符數據。
總結:只是處理純文本數據,就優先考慮使用字符流。
以下是他貼的代碼:讀文本文件
- FileReader fr=null;
- try {
- fr = new FileReader("D:\\test.sql");
- int ch = 0;
- while(( ch = fr.read()) != -1){
- System.out.println((char)ch);
- }
- } catch (IOException e) {
- e.printStackTrace();
- }finally{
- if(fr!=null){
- try {
- fr.close();
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
- }
以下例子是簡單的對一個文本文件讀取,複製到另一個文本文件,爲了提高效率可以考慮用包裝流。其中還可以指定字符集。
- BufferedReader bufr = null;
- BufferedWriter bufw = null;
- try {
- bufr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\test.sql"), "GBK"));
- bufw = new BufferedWriter(new FileWriter("D:\\test1.sql"));
- String line = null;
- while(( line = bufr.readLine()) != null){
- bufw.write(line);
- bufw.flush();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }finally{
- try {
- if(bufw!=null){
- bufw.close();
- }
- if(bufr!=null){
- bufr.close();
- }
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- }
在日常應用讀取文本文件最好就是
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 接口 。
對象流。。好少用,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
用於給類指定一個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{
};
try{
}catch(){
}finally{
};
這個是java控制異常的處理流程。當然finally不一定要。
finally的作用就是,每次運行代碼,最終都會執行finally的代碼塊,例如用於,流的關閉。
finally的作用就是,每次運行代碼,最終都會執行finally的代碼塊,例如用於,流的關閉。
總結:日常應用用得最多的就是文本流,其中也有可能文本+圖片的,這時可以用字節流,而一般爲了提高效率,都會使用包裝流對X流進行包裝,最後,當成功打開流時,用完後不要忘記關閉哦。
======================================================================================================
以上就是阿敏同學分享的東西,下面我也來分享下我自己遇到的一個java的IO問題:
也就是讀取jar包中的密鑰文件,大體的情況是這樣的,在我參與的某個項目當中,用戶爲了提高系統的安全性需要用到非對稱的加密,而我所採用的非對稱加密算法是RSA加密,頁面上的用戶登錄密碼採用RSA的公鑰(javascript文件)進行加密,而後臺採用java類寫的解密方法解密,解密的過程需要讀取密鑰文件,所以就涉及到I/O方面的開銷。
剛開始我只能讀jar包外面的密鑰文件,但是jar包內的密鑰文件,我老是讀取不到,後才找到方法。
- private static String RSAKeyStore = "c:/conf/RSAKey.txt";
- public static KeyPair getKeyPair() throws Exception {
- FileInputStream fis = new FileInputStream(RSAKeyStore);
- ObjectInputStream oos = new ObjectInputStream(fis);
- KeyPair kp = (KeyPair) oos.readObject();
- oos.close();
- fis.close();
- return kp;
- }
上面的方法就是第一次寫的,寫的方法就加載非jar包內的文件,這樣的方式去讀jar包內的文件是不可行的,如果想能讀jar內的文件可以用下面的方法:
- ....
- private static String RSAKeyStore = "/net/thinkeye/util/RSAKey.txt";
- public static KeyPair getKeyPair() throws Exception {
- System.out.println("[開始]============[加載密鑰]============[開始]");
- InputStream fis = RSAUtil.class.getResourceAsStream(RSAKeyStore);
- ObjectInputStream oos = new ObjectInputStream(fis);
- KeyPair kp = (KeyPair) oos.readObject();
- oos.close();
- fis.close();
- System.out.println("[結束]============[加載密鑰]============[結束]");
- return kp;
- }
也就是讀jar包內的文件,把FileInputStream 的文件直接改爲InputStream ,直接使用類的getResourceAsStream方法去讀jar包內文件,然後再轉成對象流就ok了。
不信你試試。呵呵!至於更多的方法使用大家可以上網去找下,我也不多講了。