亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java字符流實例分析

發布時間:2022-04-11 14:29:13 來源:億速云 閱讀:168 作者:iii 欄目:開發技術

這篇文章主要介紹“Java字符流實例分析”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java字符流實例分析”文章能幫助大家解決問題。

    一、字符流的由來

    由于使用字節流操控中文時不是很方便,Java就提供了字符流來進行操控中文

    實現原理:字節流+編碼表

    為什么用字節流進行復制帶有中文的文本文件時沒有問題?

    因為底層操作會自動進行字節拼接成中文

    怎樣識別該字節是中文呢?

    漢字在存儲時,無論是UTF-8還是GBK,第一個字節都是負數用來提示

    二、編碼表

    字符集:

    是一個系統支持的所有字符的集合,包括國家文字、標點符號、圖形符號、數字等

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

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

    GBK:最常用的中文碼表,是在GB2312標準基礎上的擴展規范,使用了雙字節編碼方案,共收錄了21003個漢字,完全兼容GB2312標準,同時支持繁體漢字以及日韓漢字等

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

    Unicode字符集:

    為了表達任意語言的任意字符而設計,是業界的一個標準,也稱為統一碼、標準萬國碼;它最多使用4個字節的數字來表達每個字母、符號,或者文字。有三種編碼方案:UTF-8、UTF-16、UTF32,最常用的是UTF-8

    UTF-8:可以用來表示Unicode標準中的任意字符,它是電子郵件、網頁及其他存儲或傳送文件的應用中,優先采用的編碼。互聯網工作小組要求所有的互聯網協議都必須支持UTF-8編碼格式。它使用一至四個字節為每個字符編碼

    UTF-8編碼規則:

    128個US-ASCII字符,只需要一個字節編碼

    拉丁文等字符,需要兩個字節編碼

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

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

    總結:編碼時使用那種規則,解碼就需要采用對應的規則,否則會亂碼

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

    編碼方法(IDEA):

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

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

    解碼方法(IDEA):

    String(byte[]bytes):通過使用平臺的默認字符集解碼指定的字節數組來構造新的String

    String(byte[]bytes,String charsetName):通過指定的字符集解碼指定的字節數組來構造新的String

    IDEA中默認的編碼格式是UTF-8

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

    字符流抽象基類:

    Reader:字符輸入流的抽象類

    Writer:字符輸出流的抽象類

    字符流中和編碼解碼問題相關的兩個類:

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

    構造方法:

    InputStreamReader(InputStream in)    創建一個使用默認字符集的InputStreamReader。
    InputStreamReader(InputStream in, String charsetName)創建一個使用命名字符集的InputStreamReader。

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

    構造方法:

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

    四、字符流寫數據的五種方法

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

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

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

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

    五、字符流讀數據的兩種方法

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

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

    關于“Java字符流實例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    左权县| 彭阳县| 武清区| 灌阳县| 乾安县| 洞头县| 万宁市| 将乐县| 古田县| 新巴尔虎左旗| 壶关县| 花莲县| 曲水县| 南岸区| 焦作市| 石柱| 监利县| 塘沽区| 东源县| 阿合奇县| 宜黄县| 岳普湖县| 桐庐县| 乌兰察布市| 牟定县| 河西区| 开封市| 新宾| 灵寿县| 铅山县| 荆州市| 九寨沟县| 黑山县| 兴化市| 南通市| 平潭县| 望江县| 梨树县| 彰化市| 洛南县| 龙里县|