一、编码表
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—字符标准输出。