字符流與字節流的區別


字符流與字節流的區別

(尊重勞動成果,轉載請注明出處:https://blog.csdn.net/cynhafa/article/details/6882061 )
字節流與和字符流的使用非常相似,兩者除了操作代碼上的不同之外,是否還有其他的不同呢?

實際上字節流在操作時本身不會用到緩沖區(內存),是文件本身直接操作的,而字符流在操作時使用了緩沖區,通過緩沖區再操作文件,如下圖所示。
img
下面以兩個寫文件的操作為主進行比較,但是在操作時字節流和字符流的操作完成之后都不關閉輸出流。

范例:使用字節流不關閉執行

package org.lxh.demo12.byteiodemo; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; public class OutputStreamDemo05 { public static void main(String[] args) throws Exception { // 異常拋出, 不處理 // 第1步:使用File類找到一個文件 File f = new File("d:" + File.separator + "test.txt"); // 聲明File 對象 // 第2步:通過子類實例化父類對象 OutputStream out = null; // 准備好一個輸出的對象 out = new FileOutputStream(f); // 通過對象多態性進行實例化 // 第3步:進行寫操作 String str = "Hello World!!!"; // 准備一個字符串 byte b[] = str.getBytes(); // 字符串轉byte數組 out.write(b); // 將內容輸出 // 第4步:關閉輸出流 // out.close(); // 此時沒有關閉 } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

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

范例:使用字符流不關閉執行

package org.lxh.demo12.chariodemo; import java.io.File; import java.io.FileWriter; import java.io.Writer; public class WriterDemo03 { public static void main(String[] args) throws Exception { // 異常拋出, 不處理 // 第1步:使用File類找到一個文件 File f = new File("d:" + File.separator + "test.txt");// 聲明File 對象 // 第2步:通過子類實例化父類對象 Writer out = null; // 准備好一個輸出的對象 out = new FileWriter(f); // 通過對象多態性進行實例化 // 第3步:進行寫操作 String str = "Hello World!!!"; // 准備一個字符串 out.write(str); // 將內容輸出 // 第4步:關閉輸出流 // out.close(); // 此時沒有關閉 } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

程序運行結果:
img

程序運行后會發現文件中沒有任何內容,這是因為字符流操作時使用了緩沖區,而 在關閉字符流時會強制性地將緩沖區中的內容進行輸出,但是如果程序沒有關閉,則緩沖區中的內容是無法輸出的,所以得出結論:字符流使用了緩沖區,而字節流沒有使用緩沖區。

提問:什么叫緩沖區?

在很多地方都碰到緩沖區這個名詞,那么到底什么是緩沖區?又有什么作用呢?

回答:緩沖區可以簡單地理解為一段內存區域。

可以簡單地把緩沖區理解為一段特殊的內存。

某些情況下,如果一個程序頻繁地操作一個資源(如文件或數據庫),則性能會很低,此時為了提升性能,就可以將一部分數據暫時讀入到內存的一塊區域之中,以后直接從此區域中讀取數據即可,因為讀取內存速度會比較快,這樣可以提升程序的性能。

在字符流的操作中,所有的字符都是在內存中形成的,在輸出前會將所有的內容暫時保存在內存之中,所以使用了緩沖區暫存數據。

如果想在不關閉時也可以將字符流的內容全部輸出,則可以使用Writer類中的flush()方法完成。

范例:強制性清空緩沖區

package org.lxh.demo12.chariodemo; import java.io.File; import java.io.FileWriter; import java.io.Writer; public class WriterDemo04 { public static void main(String[] args) throws Exception { // 異常拋出不處理 // 第1步:使用File類找到一個文件 File f = new File("d:" + File.separator + "test.txt");// 聲明File 對象 // 第2步:通過子類實例化父類對象 Writer out = null; // 准備好一個輸出的對象 out = new FileWriter(f); // 通過對象多態性進行實例化 // 第3步:進行寫操作 String str = "Hello World!!!"; // 准備一個字符串 out.write(str); // 將內容輸出 out.flush(); // 強制性清空緩沖區中的內容 // 第4步:關閉輸出流 // out.close(); // 此時沒有關閉 } } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

程序運行結果:
img
此時,文件中已經存在了內容,更進一步證明內容是保存在緩沖區的。這一點在讀者日后的開發中要特別引起注意。

提問:使用字節流好還是字符流好?

學習完字節流和字符流的基本操作后,已經大概地明白了操作流程的各個區別,那么在開發中是使用字節流好還是字符流好呢?

回答:使用字節流更好。

在回答之前,先為讀者講解這樣的一個概念,所有的文件在硬盤或在傳輸時都是以字節的方式進行的,包括圖片等都是按字節的方式存儲的,而字符是只有在內存中才會形成,所以在開發中,字節流使用較為廣泛。

字節流與字符流主要的區別是他們的的處理方式

流分類:
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等。需注意,使用BufferedOutputStream輸出數據時如果沒有關閉流,數據也是不會輸出到文件當中的,即並不是所有字節流都不用到緩沖區,輸入緩沖字節流BufferedInputStream和輸出緩沖字節流BufferedOutputStream還是要用到緩沖區的。

補充:
字符流處理的單元為2個字節的Unicode字符,分別操作字符、字符數組或字符串,而字節流處理單元為1個字節,操作字節和字節數組。所以字符流是由Java虛擬機將字節轉化為2個字節的Unicode字符為單位的字符而成的,所以它對多國語言支持性比較好!如果是音頻文件、圖片、歌曲,就用字節流好點,如果是關系到中文(文本)的,用字符流好點. 所有文件的儲存是都是字節(byte)的儲存,在磁盤上保留的並不是文件的字符而是先把字符編碼成字節,再儲存這些字節到磁盤。在讀取文件(特別是文本文件)時,也是一個字節一個字節地讀取以形成字節序列. 1.字節流可用於任何類型的對象,包括二進制對象,而字符流只能處理字符或者字符串; 2. 字節流提供了處理任何類型的IO操作的功能,但它不能直接處理Unicode字符,而字符流就可以。 字節流與字符流主要的區別是他們的的處理方式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM