欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java 字節(jié)流和字符流的區(qū)別詳解

 更新時(shí)間:2019年09月04日 14:22:28   作者:zhangniuniu  
這篇文章主要介紹了java 字節(jié)流和字符流的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

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

實(shí)際上字節(jié)流在操作時(shí)本身不會(huì)用到緩沖區(qū)(內(nèi)存),是文件本身直接操作的,而字符流在操作時(shí)使用了緩沖區(qū),通過(guò)緩沖區(qū)再操作文件,如圖所示。

下面以兩個(gè)寫文件的操作為主進(jìn)行比較,但是在操作時(shí)字節(jié)流和字符流的操作完成之后都不關(guān)閉輸出流。

范例:使用字節(jié)流不關(guān)閉執(zhí)行

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類找到一個(gè)文件  
   File f = new File("d:" + File.separator + "test.txt"); // 聲明File 對(duì)象  
// 第2步:通過(guò)子類實(shí)例化父類對(duì)象  
   OutputStream out = null;      
// 準(zhǔn)備好一個(gè)輸出的對(duì)象  
   out = new FileOutputStream(f);   
// 通過(guò)對(duì)象多態(tài)性進(jìn)行實(shí)例化  
// 第3步:進(jìn)行寫操作  
   String str = "Hello World!!!";   
// 準(zhǔn)備一個(gè)字符串  
   byte b[] = str.getBytes();     
// 字符串轉(zhuǎn)byte數(shù)組  
   out.write(b);           
// 將內(nèi)容輸出  
// 第4步:關(guān)閉輸出流  
  // out.close();         
// 此時(shí)沒有關(guān)閉  
    }  
  }

程序運(yùn)行結(jié)果:

此時(shí)沒有關(guān)閉字節(jié)流操作,但是文件中也依然存在了輸出的內(nèi)容,證明字節(jié)流是直接操作文件本身的。而下面繼續(xù)使用字符流完成,再觀察效果。

范例:使用字符流不關(guān)閉執(zhí)行

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類找到一個(gè)文件  
    File f = new File("d:" + File.separator + "test.txt");// 聲明File 對(duì)象  
    // 第2步:通過(guò)子類實(shí)例化父類對(duì)象  
    Writer out = null;        
// 準(zhǔn)備好一個(gè)輸出的對(duì)象  
    out = new FileWriter(f);      
// 通過(guò)對(duì)象多態(tài)性進(jìn)行實(shí)例化  
    // 第3步:進(jìn)行寫操作  
    String str = "Hello World!!!";   
// 準(zhǔn)備一個(gè)字符串  
    out.write(str);          
// 將內(nèi)容輸出  
    // 第4步:關(guān)閉輸出流  
    // out.close();         
// 此時(shí)沒有關(guān)閉  
  }  
} 

程序運(yùn)行結(jié)果:

程序運(yùn)行后會(huì)發(fā)現(xiàn)文件中沒有任何內(nèi)容,這是因?yàn)樽址鞑僮鲿r(shí)使用了緩沖區(qū),而 在關(guān)閉字符流時(shí)會(huì)強(qiáng)制性地將緩沖區(qū)中的內(nèi)容進(jìn)行輸出,但是如果程序沒有關(guān)閉,則緩沖區(qū)中的內(nèi)容是無(wú)法輸出的,所以得出結(jié)論:字符流使用了緩沖區(qū),而字節(jié)流沒有使用緩沖區(qū)。

提問:什么叫緩沖區(qū)?

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

回答:緩沖區(qū)可以簡(jiǎn)單地理解為一段內(nèi)存區(qū)域。

可以簡(jiǎn)單地把緩沖區(qū)理解為一段特殊的內(nèi)存。

某些情況下,如果一個(gè)程序頻繁地操作一個(gè)資源(如文件或數(shù)據(jù)庫(kù)),則性能會(huì)很低,此時(shí)為了提升性能,就可以將一部分?jǐn)?shù)據(jù)暫時(shí)讀入到內(nèi)存的一塊區(qū)域之中,以后直接從此區(qū)域中讀取數(shù)據(jù)即可,因?yàn)樽x取內(nèi)存速度會(huì)比較快,這樣可以提升程序的性能。

在字符流的操作中,所有的字符都是在內(nèi)存中形成的,在輸出前會(huì)將所有的內(nèi)容暫時(shí)保存在內(nèi)存之中,所以使用了緩沖區(qū)暫存數(shù)據(jù)。

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

范例:強(qiáng)制性清空緩沖區(qū)

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類找到一個(gè)文件  
    File f = new File("d:" + File.separator + "test.txt");// 聲明File  
對(duì)象  
    // 第2步:通過(guò)子類實(shí)例化父類對(duì)象  
    Writer out = null;         
// 準(zhǔn)備好一個(gè)輸出的對(duì)象  
    out = new FileWriter(f);      
// 通過(guò)對(duì)象多態(tài)性進(jìn)行實(shí)例化  
    // 第3步:進(jìn)行寫操作  
    String str = "Hello World!!!";   
// 準(zhǔn)備一個(gè)字符串  
    out.write(str);          
// 將內(nèi)容輸出  
    out.flush();           
// 強(qiáng)制性清空緩沖區(qū)中的內(nèi)容  
    // 第4步:關(guān)閉輸出流  
    // out.close();        
// 此時(shí)沒有關(guān)閉  
  }  
} 

程序運(yùn)行結(jié)果:

此時(shí),文件中已經(jīng)存在了內(nèi)容,更進(jìn)一步證明內(nèi)容是保存在緩沖區(qū)的。這一點(diǎn)在讀者日后的開發(fā)中要特別引起注意。

提問:使用字節(jié)流好還是字符流好?

學(xué)習(xí)完字節(jié)流和字符流的基本操作后,已經(jīng)大概地明白了操作流程的各個(gè)區(qū)別,那么在開發(fā)中是使用字節(jié)流好還是字符流好呢?

回答:使用字節(jié)流更好。

在回答之前,先為讀者講解這樣的一個(gè)概念,所有的文件在硬盤或在傳輸時(shí)都是以字節(jié)的方式進(jìn)行的,包括圖片等都是按字節(jié)的方式存儲(chǔ)的,而字符是只有在內(nèi)存中才會(huì)形成,所以在開發(fā)中,字節(jié)流使用較為廣泛。

字節(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é)來(lái)處理的 但實(shí)際中很多的數(shù)據(jù)是文本,又提出了字符流的概念,它是按虛擬機(jī)的encode來(lái)處理,也就是要進(jìn)行字符集的轉(zhuǎn)化 這兩個(gè)之間通過(guò) InputStreamReader,OutputStreamWriter來(lái)關(guān)聯(lián),實(shí)際上是通過(guò)byte[]和String來(lái)關(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等

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring純注解開發(fā)模式讓開發(fā)簡(jiǎn)化更簡(jiǎn)化

    Spring純注解開發(fā)模式讓開發(fā)簡(jiǎn)化更簡(jiǎn)化

    Spring3.0引入了純注解開發(fā)的模式,框架的誕生是為了簡(jiǎn)化開發(fā),那注解開發(fā)就是簡(jiǎn)化再簡(jiǎn)化。Spring的特性在整合MyBatis方面體現(xiàn)的淋漓盡致哦
    2022-08-08
  • springcloud引入spring-cloud-starter-openfeign失敗的解決

    springcloud引入spring-cloud-starter-openfeign失敗的解決

    這篇文章主要介紹了springcloud?引入spring-cloud-starter-openfeign失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 深入淺析Netty 在 Dubbo 中是如何應(yīng)用的

    深入淺析Netty 在 Dubbo 中是如何應(yīng)用的

    國(guó)內(nèi)知名框架 Dubbo 底層使用的是 Netty 作為網(wǎng)絡(luò)通信,那么內(nèi)部到底是如何使用的呢?今天通過(guò)本文給大家詳細(xì)講解,對(duì)Netty 在 Dubbo中應(yīng)用相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧
    2020-05-05
  • elasticsearch集群cluster示例詳解

    elasticsearch集群cluster示例詳解

    這篇文章主要為大家介紹了elasticsearch集群cluster示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • Java的Cglib動(dòng)態(tài)代理實(shí)現(xiàn)方式詳解

    Java的Cglib動(dòng)態(tài)代理實(shí)現(xiàn)方式詳解

    這篇文章主要介紹了Java的Cglib動(dòng)態(tài)代理實(shí)現(xiàn)方式詳解,CGLIB是強(qiáng)大的、高性能的代碼生成庫(kù),被廣泛應(yīng)用于AOP框架,它底層使用ASM來(lái)操作字節(jié)碼生成新的類,為對(duì)象引入間接級(jí)別,以控制對(duì)象的訪問,需要的朋友可以參考下
    2023-11-11
  • Java面試必備之JMM高并發(fā)編程詳解

    Java面試必備之JMM高并發(fā)編程詳解

    高并發(fā)(High?Cuncurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一,它通常是指,通過(guò)設(shè)計(jì)保證系統(tǒng)能夠同時(shí)并發(fā)處理很多請(qǐng)求
    2022-07-07
  • SpringBoot全局異常處理之解決404/500錯(cuò)誤

    SpringBoot全局異常處理之解決404/500錯(cuò)誤

    在搭建項(xiàng)目框架的時(shí)候用的是springboot,想統(tǒng)一處理異常,但是發(fā)現(xiàn)404的錯(cuò)誤總是捕捉不到,總是返回的是springBoot自帶的錯(cuò)誤結(jié)果信息,這篇文章主要給大家介紹了關(guān)于SpringBoot全局異常處理之解決404/500錯(cuò)誤的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • spring boot使用properties定義短信模板的方法教程

    spring boot使用properties定義短信模板的方法教程

    這篇文章主要給大家介紹了關(guān)于spring boot使用properties定義短信模板的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Springboot 如何指定獲取出 yml文件里面的配置值

    Springboot 如何指定獲取出 yml文件里面的配置值

    這篇文章主要介紹了Springboot 如何指定獲取出 yml文件里面的配置值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java中比較器Comparator和Comparable的區(qū)別

    Java中比較器Comparator和Comparable的區(qū)別

    這篇文章主要介紹了Java中比較器Comparator和Comparable的區(qū)別,我們?cè)谑褂?Collections.sort()對(duì)鏈表進(jìn)行排序時(shí),常常需要根據(jù)不同情況自定義排序規(guī)則,今天我們來(lái)看看比較器之間的區(qū)別,需要的朋友可以參考下
    2023-08-08

最新評(píng)論