一、編碼表
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—字符標準輸出。