---------------------- android培训 、 java培训 、期待与您交流! ----------------------
一、 字符编码
(一)字符编码的基础知识
1、 计算机里只有数字,计算机软件了得一切都是用数字来表示的,屏幕上显示的一个个字符也不例外。
2、 字符a 对应数字97,字符b对应数字98等,这种字符与数字对应的编码规则被称为ASCII(美国标准信息交换码)。ASCII的最高bit位都是0,也就是说这些数字都在0到127之间。
3、 中国大陆将每一个中文字符都用两个字节的数字来表示,中文字符的每个字节的最高位bit都是1,中国大陆为每个中文字符指定的编码规则称为GB2312(国标码)。
4、 在GB2312的基础上,对更多的中文字符(包括繁体)进行了编码,新的编码是十六进制的A4A4,台湾地区对中文字符集的编码规则称为BIG5(大五码)。
5、 各种文本文件中保存的实际上都是数字。而之所以当我们打开文本文件时,看到的时各种文本字符,就是因为我们所使用的软件把数据转换为了该软件支持的字符,显示出来。
6、 在一个国家的本地化系统中出现的一个字符,通过电子邮件传送到另外一个国家的本地化系统中,看到的就不是那个原始字符了,而是另外那个国家的一个字符或乱码。
(二)Unicode编码
1、ISO(国际标准化组织)将全世界所有的符号进行了统一编码,称之为Unicode编码。
2、“中”这个符号。在全世界的任何角落始终对应的都是一个十六进制的数字4e2d。
3、Unicode编码的字符都占用两个字节的大小,对于ASCII码所表示的字符,只是简单地在ASCII码原来占用的一个字节前面,增加一个所有bits为0的字节。
4、Unicode值占用两个字节,在全世界范围内所表示的字符个数不会超过2的16次方(65536),实际上,Unicode编码中还保留了两千多个数值没有用于字符编码。
5、在相当长得一段时间内,本地化字符编码将与Unicode编码共存。
6、Java中的字符使用的都是Unicode编码,Java在通过Unicode保证跨平台特性的前提下,也支持本地化平台字符集。
(三)UTF-8编码(8-----代表8个bits)
1、ASCII码字符保持原样,仍然只占用一个字节,对于其他国家的字符,UTF-8使用两个或三个字节来表示。使用UTF-8编码的文件,通常都要用EF BB BF作为文件开头的三个字节数据。
2、UTF-8的优点:
1)不出现内容为0x00字节
2)便于应用程序检测数据在传输过程中是否发生了错误。
3)直接处理使用ASCII码的英文文档。
3、UTF-8的缺点:有些字符用3个字节
二、 各种过滤流与包装类
1、 包装类的概念与作用
1) DataOutputStream类提供了往各种输出流对象中写入各种类型的数据的方法。若要通过FileOutputStream对象将一个浮点小数写入到文件中,只需传递一个FileOutputStream输出流对象给DataOutputStream实例对象和调用DataOutputStream实例对象的用于写入浮点小数的方法。
2) DataOutputStream并没有对应到任何具体的流设备,一定要给它传递一个对应具体流设备的输出流对象,完成类似DataOutputStream功能的类就是一个包装类,也叫过滤流类或处理流类。
3) DataOutputStream包装类的构造函数语法:
public DataOutputStream(OutputStream out)
2、 BufferedInputStream与BufferedOutputStream类
1) 缓冲流为I/O流增加了内存缓冲区,增加缓冲区有两个基本目的:
(1) 允许Java程序一次不知操作一个字符,这样提高了程序的性能。
(2) 由于有了缓冲区,使得在流上执行skip、mark和reset方法都成为可能。
2) BufferedInputStream和BufferedOutputStream是java提供的两个缓冲区包装类,不管底层系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区。
3) 上述包装类缓冲区与底层系统缓冲区的区别:
底层系统提供的缓冲区直接与目标设备交换生数据;
而包装类缓冲区需要调用包装的输出流对象将缓冲区的数据写入到目标设备或者写入到底层缓冲区中。或者是从包装类包装的输入流对象将目标设备或者底层缓冲区中的数据写入到抱住那个累的缓冲区中。
4) BufferedInputStream的两个构造函数:
BufferedInputStream(InputStream in)
BufferedInpurStream(InputStream in,int size)
5) BufferedOutputStream的两个构造函数:
BufferedOutputStream(OutputStream out)
BufferedOutpurStream(OutputStream out,int size)
6) BufferedReader和BufferedWriter类
BufferedReader的readLine方法可以一次读取一行文本,BufferedWriter的newLine方法可以向字符流中写入不同操作系统下的换行符。
3、 DataInputStream与DataOutputStream类
1) DataOutputStream类提供了三个写入字符串的方法:
public final void writeBytes(String s)
public final void writeChars(String s)
public final void writeUTF(String str)
4、 PrintStream类
1) PrintStream类提供了一系列的print和println方法,可以将基本数据类型的数据格式化成字符串输出。
2) PrintStream的3个构造函数:
PrintStream(OutputStream out)
PrintStream(OutputStream out,boolean autoflush)
PrintStream(OutputStream out,boolean autoflash,Stringencoding)
2)与PrintStream对应的PrintWriter类,即使遇到了文本换行标志(\n),PrintWriter类也不会自动清空缓冲区。
5、 ObjectInputStream与ObjectOutputStream类
1) ObjectInputStream和ObjectOutputStream这两个包装类,用于从底层输入流中读取对象模型的数据和将对象类型的数据写入到底层输出流。
2) ObjectInputStream和ObjectOutputStream类所读写的对象必须实现了Serializable接口。对象中的transient和static类型的成员变量不会被读取和写入。
6、 字节流与字符流的转换
1) InputStreamReader和OutputStreamWriter,是用于将字节流转换成字符流类读写的两个类,InputStreamReader可以将一个字节流中的字节解码成字符后读取,OutputStreamWriter将字符编码成字节后写入到一个字节流中。
2) InputStreamReader的两个主要的构造函数:
InputStreamReader(InputStreamin)
InputStreamReader(InputStreamin,String CharsetName)
3)OutputStreamReader(OutputStreamout)
OutputStreamReader(OutputStream out,String CharsetName)
1) 实际上所有的字符流都是包装类
2) 避免频繁地在字符与字节间进行转换,最好不要直接使用InputStreamReader和OutputStreamWriter类来读写数据,应尽量使用BufferedWriter类包装OutputStreamWriter类,用BufferedReader类包装InputStreamReader