Java字符流與字節(jié)流區(qū)別與用法分析
本文實(shí)例講述了Java字符流與字節(jié)流區(qū)別與用法。分享給大家供大家參考,具體如下:
字節(jié)流與字符流主要的區(qū)別是他們的的處理方式
流分類:
1.Java的字節(jié)流
InputStream是所有字節(jié)輸入流的祖先,而OutputStream是所有字節(jié)輸出流的祖先。
2.Java的字符流
Reader是所有讀取字符串輸入流的祖先,而writer是所有輸出字符串的祖先。
InputStream,OutputStream,Reader,writer都是抽象類。所以不能直接new
字節(jié)流是最基本的,所有的InputStream和OutputStream的子類都是,主要用在處理二進(jìn)制數(shù)據(jù),它是按字節(jié)來處理的
但實(shí)際中很多的數(shù)據(jù)是文本,又提出了字符流的概念,它是按虛擬機(jī)的encode來處理,也就是要進(jìn)行字符集的轉(zhuǎn)化
這兩個(gè)之間通過 InputStreamReader,OutputStreamWriter來關(guān)聯(lián),實(shí)際上是通過byte[]和String來關(guān)聯(lián)
在實(shí)際開發(fā)中出現(xiàn)的漢字問題實(shí)際上都是在字符流和字節(jié)流之間轉(zhuǎn)化不統(tǒng)一而造成的
在從字節(jié)流轉(zhuǎn)化為字符流時(shí),實(shí)際上就是byte[]轉(zhuǎn)化為String時(shí),
public String(byte bytes[], String charsetName)
有一個(gè)關(guān)鍵的參數(shù)字符集編碼,通常我們都省略了,那系統(tǒng)就用操作系統(tǒng)的lang
而在字符流轉(zhuǎn)化為字節(jié)流時(shí),實(shí)際上是String轉(zhuǎn)化為byte[]時(shí),
byte[] String.getBytes(String charsetName)
也是一樣的道理
至于java.io中還出現(xiàn)了許多其他的流,按主要是為了提高性能和使用方便,
如:BufferedInputStream,PipedInputStream等
具體實(shí)現(xiàn)
字節(jié)流 FileInputStream FileOutputStream
字符流 FileReader FileWriter
字符流處理的單元為2個(gè)字節(jié)的Unicode字符,分別操作字符、字符數(shù)組或字符串,而字節(jié)流處理單元為1個(gè)字節(jié),操作字節(jié)和字節(jié)數(shù)組。所以字符流是由Java虛擬機(jī)將字節(jié)轉(zhuǎn)化為2個(gè)字節(jié)的Unicode字符為單位的字符而成的,所以它對多國語言支持性比較好!如果是音頻文件、圖片、歌曲,就用字節(jié)流好點(diǎn),如果是關(guān)系到中文(文本)的,用字符流好點(diǎn).
所有文件的儲存是都是字節(jié)(byte)的儲存,在磁盤上保留的并不是文件的字符而是先把字符編碼成字節(jié),再儲存這些字節(jié)到磁盤。在讀取文件(特別是文本文件)時(shí),也是一個(gè)字節(jié)一個(gè)字節(jié)地讀取以形成字節(jié)序列.
字節(jié)流可用于任何類型的對象,包括二進(jìn)制對象,而字符流只能處理字符或者字符串; 2. 字節(jié)流提供了處理任何類型的IO操作的功能,但它不能直接處理Unicode字符,而字符流就可以。
字節(jié)流轉(zhuǎn)換成字符流可以用 InputSteamReader OutputStreamWriter
轉(zhuǎn)換成BufferdReader BufferedWriter 他們具有緩沖區(qū)
例如:讀取文件 從字節(jié)流輸入到字符流輸入
定義一個(gè)字節(jié)流:
FileInputStream fileInputStream = new FileInputStream("d:/text.txt"); // 定義一個(gè)指向D:/TEXT.TXT 的字節(jié)流 InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); //字節(jié)流轉(zhuǎn)換成InputStreamReader BufferedReader bufferedReader = new BufferedReader(inputSteamReader); //InputStreamReader 轉(zhuǎn)換成帶緩存的bufferedReader
可以把讀出來的內(nèi)容賦值給字符
String ss = new String(); String s; while((s = bufferedReader.readLine())!=null){ ss += s; } FileInputStream fileInputStream = new FileInputStream("d:/text.txt"); // 定義一個(gè)指向D:/TEXT.TXT 的字節(jié)流 InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); //字節(jié)流轉(zhuǎn)換成InputStreamReader BufferedReader bufferedReader = new BufferedReader(inputSteamReader); //InputStreamReader 轉(zhuǎn)換成帶緩存的bufferedReader 可以把讀出來的內(nèi)容賦值給字符 String ss = new String(); String s; while((s = bufferedReader.readLine())!=null){ ss += s; }
例如:寫入文件 從字節(jié)流輸出到字符流輸出
FileOutputStream fileOutputStream = new FileOutputStream("d:/text.txt"); //定義一個(gè)指向D:/TEXT.TXT文件 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream); BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter); bufferedWriter.write(s); bufferedWriter.close(); outputStreamWriter.close(); fileOutputStream.close(); FileOutputStream fileOutputStream = new FileOutputStream("d:/text.txt"); //定義一個(gè)指向D:/TEXT.TXT文件 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream); BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter); bufferedWriter.write(s); bufferedWriter.close(); outputStreamWriter.close(); fileOutputStream.close();
例程:
將字符串轉(zhuǎn)化為字節(jié)流 #region 將字符串轉(zhuǎn)化為字節(jié)流
/**/ /// <summary> /// 將字符串轉(zhuǎn)化為字節(jié)流 /// </summary> /// <param name="_Source"> 字串 </param> /// <returns> 字節(jié)流 </returns> public static byte [] String2Bytes( string strSource) { System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(); System.IO.BinaryWriter binaryWriter = new System.IO.BinaryWriter(memoryStream); binaryWriter.Write( strSource ); byte [] buffer = memoryStream.GetBuffer(); return buffer; } #endregion
將字節(jié)流轉(zhuǎn)化為字符串 #region 將字節(jié)流轉(zhuǎn)化為字符串
/**/ /// <summary> /// 將字節(jié)流轉(zhuǎn)化為字符串 /// </summary> /// <param name="bytData"> 字節(jié)流 </param> /// <returns> 字串 </returns> public static string Bytes2String( byte [] bytData) { // 字節(jié)流->字符串 System.IO.MemoryStream memoryStream2 = new System.IO.MemoryStream(bytData); System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(memoryStream2); string s2 = binaryReader.ReadString(); return s2; } #endregion
希望本文所述對大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Java分布式學(xué)習(xí)之Kafka消息隊(duì)列
Kafka是由Apache軟件基金會開發(fā)的一個(gè)開源流處理平臺,由Scala和Java編寫。Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費(fèi)者在網(wǎng)站中的所有動作流數(shù)據(jù)2022-07-07玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法
這篇文章主要介紹了玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09java?webservice超時(shí)時(shí)間設(shè)置方法代碼
當(dāng)我們使用WebService進(jìn)行調(diào)用時(shí),有時(shí)會出現(xiàn)超時(shí)的情況,下面這篇文章主要給大家介紹了關(guān)于java?webservice超時(shí)時(shí)間設(shè)置方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01springMVC返回復(fù)雜的json格式數(shù)據(jù)方法
下面小編就為大家分享一篇springMVC返回復(fù)雜的json格式數(shù)據(jù)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03SpringBoot使用Redis的zset統(tǒng)計(jì)在線用戶信息
這篇文章主要介紹了SpringBoot使用Redis的zset統(tǒng)計(jì)在線用戶信息,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot框架,感興趣的朋友可以了解下2021-04-04淺談Hibernate中的三種數(shù)據(jù)狀態(tài)(臨時(shí)、持久、游離)
下面小編就為大家?guī)硪黄獪\談Hibernate中的三種數(shù)據(jù)狀態(tài)(臨時(shí)、持久、游離)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09