Java IO流

一) io流 (input output)

單位:
    字節流
        InputStream/OutputStream
    字符流
        Reader/Writer

流向:
    輸入流
        InputStream/Reader
    輸出流
        OutputStream/Writer

如上,IO流根據單位可以分爲字節流和字符流,根據流向有輸入輸出流。

二) 字節流

1) FileInputStream/FileOutputStream
    1) 按字節讀取
                  int read();
                  返回值:如果到文件末尾,返回-1,
    2) 按字節數組讀取(可適當提高效率)
2) 字節高效流
    BufferedInputStream/BufferedOutputStream           //相當於物流快遞中的物流中心

三) 字符流
字符流涉及到的比較頭疼的問題是編碼問題,這裏大概提一下編碼,等有時間我寫一篇總結編碼遇到的問題。

1) 編碼集
    ASCII   
    iso8859-1       西方國家的編碼
    中國
        gbk -> gb2312   
        big5    繁體
    日本
        JIS
    萬國碼
        unicode     以兩個字節存一個字符,java的默認編碼集
        utf-8       能用一個字節存就用一個,存不下用兩個,兩個不行用三個
    ANSI: 平臺碼

現在有一個需求是亂碼問題,該如何解決???現將字符流轉換成字節流,然後再將字節流轉換成對應編碼的字符流,這裏需要用到轉換流

2) 轉換流: InputStreamReader (把字節流轉爲字符流,可以指定編碼集)
    InputStreamReader(InputStream in, String charsetName)
    OutputStreamWriter(OutputStream out,String charsetName)
            解決亂碼問題
package cn.edu.suda;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOliu {

    public static void main(String[] args) {
        /**
         * 簡單實現圖片的讀取與寫入,其中resource/常量池.png是我的圖片在項目下的相對路徑,這個路徑也可以寫絕對的
         * d:/test.png是我的圖片的存放位置
         * 
         */
        File file=new File("resource/常量池.png");
        FileInputStream fis;
        FileOutputStream fos;
        try {
            fis=new FileInputStream(file);
            fos=new FileOutputStream("d:/test.png");
            int data=0;
            while((data=fis.read())!=-1){
                fos.write(data);
            }
            fis.close();
            fos.close();


        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

這是我筆記裏面的內容,截的圖是老師的代碼,有興趣可以自己嘗試
這裏寫圖片描述

3) 字符流              (讀寫字符,不能指定編碼集)
    FileReader/FileWriter
    和轉換流的區別:
        1) 不能指定編碼集,按照系統平臺碼
        2) 不需要字節流
4) 字符高效流
             BufferedReader
              readLine()
             BufferedWriter     
                      newLine()
                      flush()

這裏寫圖片描述

四) 序列化與反序列化
    序列化:    序列化是將對象的狀態寫入到特定的流中的過程
    ObjectOutputStream
        |---   writeObject(Object obj)
    反序列化: 反序列化則是從特定的流中獲取數據重新構建對象的過程
    ObjectInputStream
        |---   Object readObject()

    自定義對象需要實現序列化接口

注意:序列化後如果修改類可能會報錯,需要固定UID

這篇博客有序列化的一個例子,大神,寫的很好
這裏寫圖片描述

注意:自定義對象序列化的時候要實現一個接口

這裏寫圖片描述

在IO流中處理異常的習慣做法:

這裏寫圖片描述

關於這些流之間的差別,我百度到一篇,寫的蠻詳細的

這裏寫圖片描述

java的io流是一個很重要的概念,需要多加練習,筆者仍然記得初學的時候,看似簡單,用的時候報錯報到懷疑人生。。。這次偷個懶,等下次報錯了,專門寫個博客總結報錯。
很開心,博客上的代碼終於好看了,哈哈哈哈哈哈。。。原來代碼的標籤我寫錯了。

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