Java學習筆記六

一、編碼表
1.因爲計算機語言是用二進制表示的,爲了將計算機在全世界使用,那麼就要使相同的二進制在不同地區表示不同的語言,這就形成了二進制數據與語言一一對應的表————–編碼表。
2.常用編碼表:

  • ASCII———-美國地區使用的編碼表,一個字符佔一個字節
  • ISO8859-1:拉丁碼錶。歐洲碼錶,一個字符佔一個字節
  • GB2312/GBK/GB18030: 中國大陸用的編碼表,gbk是gb2312的升級版,gb18030是gbk的升級版。一箇中文字符佔兩個字節;一個英文字符佔一個字節。
  • BIG5碼:通行於臺灣、香港地區的一個繁體字編碼方案,俗稱“大五碼”。一個英文字符佔一個字節,一箇中文字符佔一個或兩個字節。
  • unicode碼:國際通用碼,收錄各國語言,一個字符用兩個字節,java就是用的這種編碼。
  • UTF-8: utf系列碼中比較常用的,一箇中文字符佔三個字節,一個英文字符佔一個字節。
  • -

3.內碼和外碼:內碼是指數據存儲到內存中所使用的內存中的編碼方式;外碼:除內存中的編碼外,都是外碼。java中字符char在內存中使用的編碼方式是utf-16(一個字符佔兩個字節)。
4.所謂編碼就是將看得懂得變成看不懂的;所謂解碼就是將看不懂的變成看的懂得。
5.編碼通常說的是字符編碼。
6.字符編碼過程:首先拿到輸入的內容,根據指定的編碼方式到編碼表中找出對應的字節數。
解釋:
接下來我們講解一個程程序用以實驗不同編碼方式

    String chinese = "中";
        String english = "A"; 
        System.out.println("中文字符:"+chinese+"  英文字符:"+english);
        byte[] chineseBy = chinese.getBytes(); 
        byte[] englishBy = english.getBytes(); 
        System.out.println("指定的編碼方式:.getBytes()默認編碼方式");
        System.out.print("中文編碼後:");
        for (byte b : chineseBy) {
            System.out.print(b+" ");
        }
        System.out.println("");
        System.out.print("英文編碼後:");
        for (byte b : englishBy) {
            System.out.print(b+"   ");
        }

        System.out.println("");
        System.out.println("");
        chineseBy = chinese.getBytes("gbk"); 
        englishBy = english.getBytes("gbk"); 
        System.out.println("指定的編碼方式:gbk");
        System.out.print("中文編碼後:");
        for (byte b : chineseBy) {
            System.out.print(b+" ");
        }
        System.out.println("");
        System.out.print("英文編碼後:");
        for (byte b : englishBy) {
            System.out.print(b+"   ");
        }

        System.out.println("");
        System.out.println("");
        chineseBy = chinese.getBytes("ASCII"); 
        englishBy = english.getBytes("ASCII"); 
        System.out.println("指定的編碼方式:ASCII");
        System.out.print("中文編碼後:");
        for (byte b : chineseBy) {
            System.out.print(b+" ");
        }
        System.out.println("");
        System.out.print("英文編碼後:");
        for (byte b : englishBy) {
            System.out.print(b+"   ");
        }

        System.out.println("");
        System.out.println("");
        chineseBy = chinese.getBytes("UTF-8"); 
        englishBy = english.getBytes("UTF-8"); 
        System.out.println("指定的編碼方式:UTF-8");
        System.out.print("中文編碼後:");
        for (byte b : chineseBy) {
            System.out.print(b+" ");
        }
        System.out.println("");
        System.out.print("英文編碼後:");
        for (byte b : englishBy) {
            System.out.print(b+"   ");
        }

        System.out.println("");
        System.out.println("");
        /*unicodeLittle:採用Unicode編碼,並對編碼後的結果反轉 (4e2d反轉爲2d4e) ,這種方式有字符串標記位(-2 -1)*/
        chineseBy = chinese.getBytes("UNICODELittle"); 
        englishBy = english.getBytes("UNICODELittle"); 
        System.out.println("指定的編碼方式:UNICODELittle");
        System.out.print("中文編碼後:");
        for (byte b : chineseBy) {
            System.out.print(b+" ");
        }
        System.out.println("");
        System.out.print("英文編碼後:");
        for (byte b : englishBy) {
            System.out.print(b+"   ");
        }

        System.out.println("");
        System.out.println("");
        /*unicode:採用Unicode編碼,這種方式有字符串標記位(-2 -1)*/
        chineseBy = chinese.getBytes("UNICODE"); 
        englishBy = english.getBytes("UNICODE"); 
        System.out.println("指定的編碼方式:UNICODE");
        System.out.print("中文編碼後:");
        for (byte b : chineseBy) {
            System.out.print(b+" ");
        }
        System.out.println("");
        System.out.print("英文編碼後:");
        for (byte b : englishBy) {
            System.out.print(b+"   ");
        }

        System.out.println("");
        System.out.println("");
        /*UNICODEBigunmarked:採用Unicode編碼,這種方式沒有字符串標記位(-2 -1)*/
        chineseBy = chinese.getBytes("UNICODEBigunmarked"); 
        englishBy = english.getBytes("UNICODEBigunmarked"); 
        System.out.println("指定的編碼方式:UNICODEBigunmarked");
        System.out.print("中文編碼後:");
        for (byte b : chineseBy) {
            System.out.print(b+" ");
        }
        System.out.println("");
        System.out.print("英文編碼後:");
        for (byte b : englishBy) {
            System.out.print(b+"   ");
        } 

調用 .getBytes時沒有指定編碼方式,則默認使用操作系統默認的編碼方式(我的是gbk編碼的),所以沒有指定編碼方式和指定 gbk 編碼方式 輸出結果一致。
二、管道流的基本使用

try(PipedInputStream pis = new PipedInputStream();
                PipedOutputStream pos = new PipedOutputStream();){
            pos.connect(pis);
            for(int i = 0; i < 10; i++){
                pos.write(i);
                System.out.println("寫入:"+i);
            }
            int i = -1;
            while((i = pis.read()) != -1){
                System.out.println("讀到:"+i);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

小知識點:
1、輸入流:從IO設備中讀取數據。
2、輸出流:寫數據到IO設備。
3、int available():返回輸入流中的字節數量。
4、IO包裝類:

  • ObjectInputStream、ObjectOutputStream :操作對象,讀寫的對象必須被串行化,對象中的transient(臨時)和static類型的成員變量不會被讀取和寫入。
  • DataInputStream、DataOutputStream : 可以操作八大基本數據類型
  • BufferInputStream、BufferOutputStream :利用緩存技術
  • BufferReader—提供readLine()、BufferWriter—提供newLine(); :利用緩存技術
  • PrintStream—字節標準輸出、PrintWriter—字符標準輸出。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章