Java進階(四十五)java 字節流與字符流的區別

      網友投稿 799 2025-04-04

      字節流與和字符流的使用非常相似,兩者除了操作代碼上的不同之外,是否還有其他的不同呢?


      實際上字節流在操作時本身不會用到緩沖區(內存),是文件本身直接操作的,而字符流在操作時使用了緩沖區,通過緩沖區再操作文件,如下圖所示。

      下面以兩個寫文件的操作為主進行比較,但是在操作時字節流和字符流的操作完成之后都不關閉輸出流。

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

      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數組 byte b[] = str.getBytes(); // 將內容輸出,進行寫操作 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

      Java進階(四十五)java 字節流與字符流的區別

      20

      21

      22

      1

      程序運行結果:

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

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

      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

      程序運行結果:

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

      提問:什么叫緩沖區?

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

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

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

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

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

      范例:強制性清空緩沖區

      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

      程序運行結果:

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

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

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

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

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

      流分類:

      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等。

      在Java中,它的內核使用 Unicode,也就是說它記住了每個字符的Unicode 內部編碼。與ANSI碼不兼容。字節。按照UNICODE標準所有字符都占2個字節。因為在Java當中字符是采用Unicode編碼標準的,所以“學Java”這個字符串在Java語言中占10個字節。

      Java

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:CHOOSE函數都有哪些用法
      下一篇:用excel計算數據平均值的方法步驟
      相關文章
      亚洲国产精品美女久久久久| 亚洲日韩国产欧美一区二区三区| 亚洲成熟丰满熟妇高潮XXXXX| 激情内射亚洲一区二区三区爱妻 | 亚洲国产高清精品线久久| 亚洲a∨国产av综合av下载| 亚洲av无码一区二区三区天堂| 亚洲熟妇自偷自拍另欧美| 一本色道久久88亚洲精品综合| 亚洲AV无码乱码麻豆精品国产| 亚洲五月综合网色九月色| 亚洲不卡在线观看| 亚洲免费福利在线视频| 国产成人精品日本亚洲直接| 自拍日韩亚洲一区在线| 国产亚洲精品bv在线观看| 亚洲一区二区无码偷拍| 亚洲国产综合AV在线观看| WWW亚洲色大成网络.COM| 国产精品久久久久久亚洲影视| 一级毛片直播亚洲| 亚洲AV无码一区二区三区在线观看| 亚洲 国产 图片| 国产亚洲美日韩AV中文字幕无码成人 | 婷婷亚洲久悠悠色悠在线播放| 久久精品国产精品亚洲色婷婷| 亚洲AV无码国产丝袜在线观看 | 亚洲精品色在线网站| 另类专区另类专区亚洲| 国产偷窥女洗浴在线观看亚洲| 中文字幕亚洲不卡在线亚瑟| 国产日韩亚洲大尺度高清| 亚洲色欲色欲综合网站| 亚洲人成网站18禁止久久影院| 亚洲综合色一区二区三区| 精品国产亚洲AV麻豆| 综合亚洲伊人午夜网| 婷婷久久久亚洲欧洲日产国码AV| 亚洲精品白色在线发布| 国产精品亚洲综合久久| 狼人大香伊蕉国产WWW亚洲|