最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?超詳細(xì)講解字符流

 更新時間:2022年04月08日 16:23:16   作者:再美不及姑娘你  
字符流就是在字節(jié)流的基礎(chǔ)上,加上編碼,形成的數(shù)據(jù)流,字符流出現(xiàn)的意義是因為字節(jié)流在操作字符時,可能會有中文導(dǎo)致的亂碼,所以由字節(jié)流引申出了字符流

一、字符流的由來

由于使用字節(jié)流操控中文時不是很方便,Java就提供了字符流來進(jìn)行操控中文

實現(xiàn)原理:字節(jié)流+編碼表

為什么用字節(jié)流進(jìn)行復(fù)制帶有中文的文本文件時沒有問題?

因為底層操作會自動進(jìn)行字節(jié)拼接成中文

怎樣識別該字節(jié)是中文呢?

漢字在存儲時,無論是UTF-8還是GBK,第一個字節(jié)都是負(fù)數(shù)用來提示

二、編碼表

字符集:

是一個系統(tǒng)支持的所有字符的集合,包括國家文字、標(biāo)點符號、圖形符號、數(shù)字等

計算機(jī)要準(zhǔn)確的存儲和識別各種字符集符號,就需要進(jìn)行字符編碼,一套字符集必然至少有一套字符編碼

常見的字符集有ASCII字符集、GBXXX字符集、Unicode字符集等

GBK:最常用的中文碼表,是在GB2312標(biāo)準(zhǔn)基礎(chǔ)上的擴(kuò)展規(guī)范,使用了雙字節(jié)編碼方案,共收錄了21003個漢字,完全兼容GB2312標(biāo)準(zhǔn),同時支持繁體漢字以及日韓漢字等

GB18030:最新的中文碼表,收錄漢字70244個,采用多字節(jié)編碼,每個字可以由1個、2個或4個字節(jié)組成。支持中國少數(shù)民族的文字,同時支持繁體漢字以及日韓漢字等

Unicode字符集:

為了表達(dá)任意語言的任意字符而設(shè)計,是業(yè)界的一個標(biāo)準(zhǔn),也稱為統(tǒng)一碼、標(biāo)準(zhǔn)萬國碼;它最多使用4個字節(jié)的數(shù)字來表達(dá)每個字母、符號,或者文字。有三種編碼方案:UTF-8、UTF-16、UTF32,最常用的是UTF-8

UTF-8:可以用來表示Unicode標(biāo)準(zhǔn)中的任意字符,它是電子郵件、網(wǎng)頁及其他存儲或傳送文件的應(yīng)用中,優(yōu)先采用的編碼?;ヂ?lián)網(wǎng)工作小組要求所有的互聯(lián)網(wǎng)協(xié)議都必須支持UTF-8編碼格式。它使用一至四個字節(jié)為每個字符編碼

UTF-8編碼規(guī)則:

128個US-ASCII字符,只需要一個字節(jié)編碼

拉丁文等字符,需要兩個字節(jié)編碼

大部分常用字(含中文),使用三個字節(jié)編碼

其他極少使用的UniCode輔助字符,使用四個字節(jié)編碼

總結(jié):編碼時使用那種規(guī)則,解碼就需要采用對應(yīng)的規(guī)則,否則會亂碼

三、字符串中的編碼解碼問題

編碼方法(IDEA):

byte[] getBytes():使用平臺默認(rèn)的字符集將該String編碼為一系列字節(jié),將結(jié)果存儲到新的字節(jié)數(shù)組中

byte[] getBytes(String charsetName):使用指定的字符集將該String編碼為一系列字節(jié),將結(jié)果存儲到新的字節(jié)數(shù)組中

解碼方法(IDEA):

String(byte[]bytes):通過使用平臺的默認(rèn)字符集解碼指定的字節(jié)數(shù)組來構(gòu)造新的String

String(byte[]bytes,String charsetName):通過指定的字符集解碼指定的字節(jié)數(shù)組來構(gòu)造新的String

IDEA中默認(rèn)的編碼格式是UTF-8

四、字符流的編碼解碼問題

字符流抽象基類:

Reader:字符輸入流的抽象類

Writer:字符輸出流的抽象類

字符流中和編碼解碼問題相關(guān)的兩個類:

InputStreamReader:是從字節(jié)流到字符流的橋梁:它讀取字節(jié),并使用指定的字符集將其解碼為字符。它使用的字符集可以由名稱指定,也可以被明確指定,或者可以接受平臺的默認(rèn)字符集

構(gòu)造方法:

InputStreamReader(InputStream in)    創(chuàng)建一個使用默認(rèn)字符集的InputStreamReader。
InputStreamReader(InputStream in, String charsetName)創(chuàng)建一個使用命名字符集的InputStreamReader。

OutputStreamWruter:是從字符流到字節(jié)流的橋梁:使用自訂的字符集將寫入的字符編碼為字節(jié),它使用的字符集可以由名稱指定,也可以被明確指定,或者可以接受平臺的默認(rèn)字符集

構(gòu)造方法:

OutputStreamWriter(OutputStream out)    創(chuàng)建一個使用默認(rèn)字符編碼的OutputStreamWriter。
OutputStreamWriter(OutputStream out, String charsetName)創(chuàng)建一個使用命名字符集的OutputStreamWriter。
public class ConversionStreamDemo {
    public static void main(String[] args) throws IOException {
        //創(chuàng)建一個默認(rèn)編碼格式的InputStreamReader\OutputStreamWriter
        InputStreamReader ipsr = new InputStreamReader(new FileInputStream("E:\\abc.txt"));
        OutputStreamWriter opsw = new OutputStreamWriter(new FileOutputStream("E:\\abc.txt"));
        //寫入數(shù)據(jù)
        opsw.write("你好啊");
        opsw.close();
        //讀數(shù)據(jù),方式一:一次讀取一個字節(jié)數(shù)據(jù)
        int ch;
        while ((ch = ipsr.read()) != -1) {
            System.out.print((char) ch);
        }
        ipsr.close();
?
    }
}

四、字符流寫數(shù)據(jù)的五種方法

方法名說明
void write(int c)    寫一個字符
void write(char[] cbuf)寫入一個字符數(shù)組
void write(char[] cbuf,int off,int len)寫入字符數(shù)組的一部分
void write(String str)寫入一個字符串
void write(String str,int off,int len)寫入一個字符串的一部分

字符流寫數(shù)據(jù)需要注意緩沖區(qū)的問題,如果想要將緩沖區(qū)的數(shù)據(jù)加載出來需要在寫入方法后加上刷新方法flush();

前三個方法與字節(jié)流寫入方法使用相同,這里重點介紹下面兩種方式

public class OutputStreamWriterDemo {
    public static void main(String[] args) throws IOException {
        //創(chuàng)建一個默認(rèn)編碼格式的OutputStreamWriter對象
        OutputStreamWriter opsw=new OutputStreamWriter(new FileOutputStream("E:\\abc.txt"));
        //方式一:寫入一個字節(jié)
        opsw.write(97);
        opsw.flush();//如果需要在文件中立即顯示輸入的數(shù)據(jù),就需要加入刷新方法
        //方式二:寫入一個字符數(shù)組
        char[]ch={'a','b','c','二'};
        opsw.write(ch);
        opsw.flush();//如果需要在文件中立即顯示輸入的數(shù)據(jù),就需要加入刷新方法
        //方式三:寫入一個字符數(shù)組的一部分
        opsw.write(ch,0,2);
        opsw.flush();//如果需要在文件中立即顯示輸入的數(shù)據(jù),就需要加入刷新方法
        //方式四:寫入一個字符串
        opsw.write("一二三");
        opsw.flush();//如果需要在文件中立即顯示輸入的數(shù)據(jù),就需要加入刷新方法
        //方式五:寫入一個字符串的一部分
        opsw.write("三四五",1,2);
        opsw.flush();//如果需要在文件中立即顯示輸入的數(shù)據(jù),就需要加入刷新方法
    }
}

五、字符流讀數(shù)據(jù)的兩種方法

方法名說明
int read()    一次讀取一個字符數(shù)據(jù)
int read(char[] cbuf)一次讀取一個字符數(shù)組數(shù)據(jù)
public class InputStreamReadDemo {
    public static void main(String[] args) throws IOException {
        //創(chuàng)建一個默認(rèn)編碼格式的InputStreamReader
        InputStreamReader ipsr=new InputStreamReader(new FileInputStream("E:\\abc.txt"));
        //讀取數(shù)據(jù),方式一一次讀取一個字符數(shù)據(jù)
        int ch;
        while ((ch=ipsr.read())!=-1){
            System.out.print((char) ch);
        }
        ipsr.close();
        //方式二:一次讀取一個字符數(shù)組數(shù)據(jù)
        char []ch=new char[1024];
        int len;
        while ((len=ipsr.read(ch))!=-1){
            System.out.print(new String(ch,0,len));
        }
        ipsr.close();
    }
}

小結(jié):如果使用默認(rèn)編碼格式的話,那么字符輸入流InputStreamReader可以使用子類FileReader來替代,字符輸出流OutputStreamWriter可以使用其子類FileWriter來替代,兩者在使用默認(rèn)編碼格式的情況下作用一致。

到此這篇關(guān)于Java 超詳細(xì)講解字符流的文章就介紹到這了,更多相關(guān)Java 字符流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot?整合Mybatis-Plus并輸出SQL日志示例詳解

    SpringBoot?整合Mybatis-Plus并輸出SQL日志示例詳解

    這篇文章主要介紹了SpringBoot整合Mybatis-Plus并輸出SQL日志,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • SpringBoot Jackson日期格式化統(tǒng)一配置的實現(xiàn)

    SpringBoot Jackson日期格式化統(tǒng)一配置的實現(xiàn)

    Spring項目中經(jīng)常需要配置日期時間格式格式,本文主要介紹了SpringBoot Jackson日期格式化統(tǒng)一配置的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • 解決IDEA導(dǎo)入javaWeb項目注解爆紅的問題

    解決IDEA導(dǎo)入javaWeb項目注解爆紅的問題

    這篇文章主要介紹了解決IDEA導(dǎo)入javaWeb項目注解爆紅的問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • java中Lambda常用場景代碼實例

    java中Lambda常用場景代碼實例

    這篇文章主要介紹了java中Lambda常用場景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • maven配置多個鏡像的實現(xiàn)方法

    maven配置多個鏡像的實現(xiàn)方法

    這篇文章主要介紹了maven配置多個鏡像的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java實現(xiàn)Excel表單控件的添加與刪除

    Java實現(xiàn)Excel表單控件的添加與刪除

    本文通過Java代碼示例介紹如何在Excel表格中添加表單控件,包括文本框、單選按鈕、復(fù)選框、組合框、微調(diào)按鈕等,以及如何刪除Excel中的指定表單控件,需要的可以參考一下
    2022-05-05
  • JAVA應(yīng)用系統(tǒng)工具快捷托盤實例代碼

    JAVA應(yīng)用系統(tǒng)工具快捷托盤實例代碼

    JAVA應(yīng)用系統(tǒng)工具快捷托盤實例代碼,需要的朋友可以參考一下
    2013-02-02
  • Java新手環(huán)境搭建 JDK8安裝配置教程

    Java新手環(huán)境搭建 JDK8安裝配置教程

    這篇文章主要為大家詳細(xì)介紹了Java新手環(huán)境搭建,JDK8安裝配置教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • IDEA 設(shè)置顯示內(nèi)存的使用情況和內(nèi)存回收的方法

    IDEA 設(shè)置顯示內(nèi)存的使用情況和內(nèi)存回收的方法

    這篇文章主要介紹了IDEA 設(shè)置顯示內(nèi)存的使用情況和內(nèi)存回收的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Java排列組合字符串的方法

    Java排列組合字符串的方法

    這篇文章主要介紹了Java排列組合字符串的方法
    2018-02-02

最新評論

达日县| 万山特区| 洛隆县| 巴东县| 习水县| 吴忠市| 漳平市| 咸宁市| 天津市| 吴忠市| 江津市| 邵东县| 华容县| 托里县| 霍山县| 航空| 南岸区| 班玛县| 赫章县| 如皋市| 台东县| 察雅县| 湖州市| 开江县| 靖宇县| 尉犁县| 图们市| 岱山县| 中江县| 阿克陶县| 富锦市| 米泉市| 仙游县| 黎平县| 治多县| 孙吴县| 宝山区| 双桥区| 北流市| 洛浦县| 乌兰县|