1. 字符编码
Unicode编码:
ISO将全世界所有的字符进行了统一的编码,称之为Unicode
“中”在全世界的任何一个角落,始终对应的都是一个十六进制的数字4e2d
如果所有的计算机都使用Unicode编码,在中国的本地系统中显示的“中这个字符”发送到世界各地显示的仍然是“中这个字符
Unicode只占用两个字节,在全世界范围内,表示的字符个数不会超过2的16次方,实际上,Unicode编码中还保留了两千个多个数值没有用于字符编码
在相当长的一段时间内,本地话字符将与Unicode共存
Java中的字符使用的都是Unicode编码,java在通过Unicode保证跨平台的特性前提下,也支持本地平台的字符集
Utf-8编码
ASCII码字符保持原样,仍然只占用一个字节,对于其他国家的字符,utf-8使用两个或三个字节来表示,使用UTF-8编码的文件,通常要用EFBB BF作为文件开头的三个字节数据
2. 各种过滤与包装类
(1). 过滤与包装类
通过FileOutpuStream对象将一个浮点小数写入到文件中,是否有点困难?能否通过FileOutputStream对象直接将一个整数写入到文件呢?
假如有个DataOutputStream类中提供了各种输出流对象写入各种类型的数据(当然包括浮点小数)的方法。你现在所要做的工作就是:传递一个FileOutputStream输出流对象给DataOutputStream实例对象调用DataOutputStream实例对象用于写入浮点小数的方法。
DataOutputStream并没有反应到任何具体的流设备,一定要给它传递一个对应具体流设备的输出对象,完成类似DataOutputStream功能的类就是一个包装类,也叫过滤流或处理流类
(2).BufferedInputStream与BufferedOutputStream类
缓冲流为I/O流增加了内存缓冲区,增加缓冲区有两个基本目的:
允许java程序一次不止操作一个字节,这样提高了程序的性能。
由于有了缓冲区,使得在流上执行skip、mark和reset方法成为可能
BufferedInputStream与BufferedOutputStream是java提供的两个缓冲区包装类,不管底层系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区,想想这种缓冲区底层系统提供的缓冲区区别。
BufferedIputStream的两个构造函数
BufferedInputStream(InputStream in);
BufferedInputStream(IntpuStream inint size);
BufferedOutputStream的两个构造函数
BufferedOutputStream(InputStream out);
BufferedOutputStream(OutpuStream out,int size);
(3)BufferedReader和BufferedWriter类
BufferedReader的readLine方法可以一次读取一行文本,BufferedWriter的writeLine方法可以向不同的字符流中写入不同操作系统下的换行符。
(4) DataInputStream与DataOutoutStream类
DataOutoutStreaml类提供了三个写入字符串的方法
Public finalvoid writeBytes(String s)
Public finalvoid writeChars(String s)
Public finalvoid writeUTF(String str)
为什么DataInputStream类中有一个readUFT方法,而没有“readBytes”和readChars方法
(5)PrintStream类
PrintStream类提供了一系列的print和println方法,可以将基本数据类型的数据格式化成字符串。
格式化输出是什么意思呢?例如97的格式化输出的实际字节数据为0x39和0x37。
PrintStream类的三个构造函数
PrintStream(OutputStream out)
PrintStream(OutputStream out,boolean autoflush)
PrintStream(OutputStream out, booleanautoflush,String encoding)
PrintlnStream对应的PrintWrite类,即使遇到了文本换行标识符(\n)Printwrite类也不会自动清空缓冲区。
PrintWriter的print能根据操作系统的不同生成相应的文本换行标识符,在window下的文本标识换行符是“\r\n”在linux下是“\n”
(6)ObjectInputStream和ObjectOutputStream
ObjectInputStream和ObjectOutputStream这两个包装类用于底层输入流中读取类型对象的数据和将对象类型的数据写入底层输出流
ObjectInputStream和ObjectOutputStream所读写的对象必须实现Serializble接口,对象中的stransien和static类型的成员变量不会被读取和写入
Decorator设计模式
在程序中用一个对象(the Decorator)包装另外的一个对象,称之为Decorator模式。
public static void main(String[] args) {
try {
throw new Exception("test");
} catch (Exception e) {
//字符串和输出流的桥梁StringWriter
StringWriter sw = new StringWriter();
//创建输出流并包装writer对象
PrintWriter pw = new PrintWriter(sw);
//参数传递
e.printStackTrace(pw);
//打印异常的详细信息
System.out.println(sw.toString());
}
}