JAVA 字節流和字符流度讀寫的區別

java處理文件的類裏面,stream結尾都是採用字節流,reader和writer結尾都是採用字符流。兩者的區別就是讀寫的時候一個是按字節讀寫,一個是按字符。 

字符流的底層就是字節流。而字符流主要是讀取文本文件內容的,可以一個字符一個字符的讀取,也可以一行一行的讀取文本文件內容。而字節流讀取單位爲byte.byte作爲計算機存儲最基本單位,可以用字節流來讀取很多其他格式的文件,比如圖片視頻等等。基於B/S和C/S的文件傳輸都可以採用字節流的形式。在讀寫文件需要對內容按行處理,比如比較特定字符,處理某一行數據的時候一般會選擇字符流。只是讀寫文件,和文件內容無關的,一般選擇字節流。 (注:除了字符和字節流之外,java還有一種叫對象流。有興趣可以去查API學習一下。)

字節流就是按照字節來進行傳輸,字符流是按照字符來傳輸.最基本的是字節流,字符流可以說是對字節流的一個包裝流.比如你知道了一個字符是8個字節,那麼你讓字節流一次傳輸8個字節,那不就相當於一次傳輸一個字符,也就是字符流了。

字節流與和字符流的使用非常相似,兩者除了操作代碼上的不同之外,是否還有其他的不同呢?
實際上字節流在操作時本身不會用到緩衝區(內存),是文件本身直接操作的,而字符流在操作時使用了緩衝區,通過緩衝區再操作文件,如圖

下面以兩個寫文件的操作爲主進行比較,但是在操作時字節流和字符流的操作完成之後都不關閉輸出流。
範例:使用字節流不關閉執行

複製代碼
    // 通過字節流 寫文件
    public static void ByteWrite() {
        File file = new File("d:\\test\\test.txt");
        try {
            OutputStream outputStream = new FileOutputStream(file);
            String textString = "Hello World!!!";
            byte[] data = textString.getBytes();
            outputStream.write(data);
            //outputStream.close();
        } catch (IOException e) {
            System.out.println("字節流寫入文件出錯。");
            e.printStackTrace();
        }
    }
複製代碼

程序運行結果:

 此時沒有關閉字節流操作,但是文件中也依然存在了輸出的內容,證明字節流是直接操作文件本身的。而下面繼續使用字符流完成,再觀察效果。
範例:使用字符流不關閉執行

複製代碼
    // 通過字符流 寫文件
    public static void StringWrite() {
        File file = new File("d:\\test\\test.txt");
        try {
            FileWriter writer = new FileWriter(file);
            String textString = "Hello World!!!";
            writer.write(textString);
            // writer.flush();
            // writer.close();
        } catch (IOException e) {
            System.out.println("字符流寫入文件出錯.");
            e.printStackTrace();
        }
    }
複製代碼

程序運行結果:

程序運行後會發現文件中沒有任何內容,這是因爲字符流操作時使用了緩衝區,而   在關閉字符流時會強制性地將緩衝區中的內容進行輸出,但是如果程序沒有關閉,則緩衝區中的內容是無法輸出的,所以得出結論:字符流使用了緩衝區,而字節流沒有使用緩衝區。
提問:什麼叫緩衝區?
在很多地方都碰到緩衝區這個名詞,那麼到底什麼是緩衝區?又有什麼作用呢?
回答:緩衝區可以簡單地理解爲一段內存區域。
可以簡單地把緩衝區理解爲一段特殊的內存。
某些情況下,如果一個程序頻繁地操作一個資源(如文件或數據庫),則性能會很低,此時爲了提升性能,就可以將一部分數據暫時讀入到內存的一塊區域之中,以後直接從此區域中讀取數據即可,因爲讀取內存速度會比較快,這樣可以提升程序的性能。
在字符流的操作中,所有的字符都是在內存中形成的,在輸出前會將所有的內容暫時保存在內存之中,所以使用了緩衝區暫存數據。
如果想在不關閉時也可以將字符流的內容全部輸出,則可以使用Writer類中的flush()方法完成。

提問:使用字節流好還是字符流好?
學習完字節流和字符流的基本操作後,已經大概地明白了操作流程的各個區別,那麼在開發中是使用字節流好還是字符流好呢?
回答:使用字節流更好。
在回答之前,先爲讀者講解這樣的一個概念,所有的文件在硬盤或在傳輸時都是以字節的方式進行的,包括圖片等都是按字節的方式存儲的,而字符是只有在內存中才會形成,所以在開發中,字節流使用較爲廣泛。
字節流與字符流主要的區別是他們的的處理方式
流分類: 1.Java的字節流    InputStream是所有字節輸入流的祖先,而OutputStream是所有字節輸出流的祖先。 2.Java的字符流   Reader是所有讀取字符串輸入流的祖先,而writer是所有輸出字符串的祖先。 InputStream,OutputStream,Reader,writer都是抽象類。所以不能直接new 

字節流是最基本的,所有的InputStream和OutputStream的子類都是,主要用在處理二進制數據,它是按字節來處理的 但實際中很多的數據是文本,又提出了字符流的概念,它是按虛擬機的encode來處理,也就是要進行字符集的轉化 這兩個之間通過 InputStreamReader,OutputStreamWriter來關聯,實際上是通過byte[]和String來關聯 在實際開發中出現的漢字問題實際上都是在字符流和字節流之間轉化不統一而造成的
在從字節流轉化爲字符流時,實際上就是byte[]轉化爲String時, public String(byte bytes[], String charsetName) 有一個關鍵的參數字符集編碼,通常我們都省略了,那系統就用操作系統的lang 而在字符流轉化爲字節流時,實際上是String轉化爲byte[]時, byte[]    String.getBytes(String charsetName) 也是一樣的道理

至於java.io中還出現了許多其他的流,按主要是爲了提高性能和使用方便, 如BufferedInputStream,PipedInputStream等


轉自:http://www.cnblogs.com/jun9207/p/5197697.html

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