1 编码
1.1 字符编码表(字符集)
ASCII 码表:
保存了数字,字母等
A - 65,a - 97,0 - 48GB2312 码表:
保存了常用的汉字(6-7千个),一个中文占两个字节,且都为负数GBK 码表:
保存了基本所有的汉字(20000多个),不管中文还是英文都为2个字节,这两个字节可为正负Unicode 码表:
统一码标(万国码标)
不管是中文还是英文都是两个字节UTF-8 码表:
一个字节就可以存储的数据不用两个字节存储
这个码表更加标准化,在每一个字节头加入了编码信息ISO-8859-1 码表:
拉丁码表
Tomcat默认编码
都是负数
在GBK中一个中文两个字节
在UTF-8中一个中文三个字节
2 编码转换流
2.1 OutputStreamWrite
可以写一个字符串,字符数组
是字符流向字节的桥梁
2.2 OutputStreamWrite
可以接收一个字符串,字符数组
是字节向字符流的桥梁
public class streamDemo {
@Test
public void outputStreamDemo() throws IOException {
File file = new File("");
String src = file.getAbsolutePath()+"/src/com/looc/demo10/1.txt";
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(src),"UTF-8");
writer.write("啦啦啦啦");
writer.close();
}
@Test
public void inputStreamReader() throws IOException{
File file = new File("");
String src = file.getAbsolutePath()+"/src/com/looc/demo10/1.txt";
InputStreamReader reader = new InputStreamReader(new FileInputStream(src),"utf-8");
char[] chars = new char[4];
int len = 0;
String str;
while ((len = reader.read(chars))!=-1){
str = new String(chars,0,len);
System.out.print(str);
}
reader.close();
}
}
InputStreamReader 是 fileReader 的父类
fileReader 封装的时候就设置默认编码为GBK了
OutputStreamWrite 是 fileWrite 的父类
fileWrite 封装的时候就设置了默认编码为UTF-8
3. 序列化流与反序列化流
3.1 序列化流
写对象到文件
ObjectOutputStream
- 构造:
ObjectOutPutStream(FileOutputStream out); - 方法:
writeObject(Object obj);//obj这个对象需要实现Serializable接口Serializable 启标记作用
3.2 反序列化流
从文件中读取对象
ObjectInputStream
- 构造:
ObjectInPutStream(FileInputStream out); - 方法:
Object readeObject();
//之前写完对象之后,如果修改所属对象,原来的类即失效,这个时候就会出现无效类异常
JVM判断一个类是否有效,通过一个类的版本号判断
当写完一个类的时候,内部有一个版本号,当你修改这个类的时候,版本号就会随之发生变化
private static final long serialVersionUID
transient 关键字
用来修饰成员变量,使不使用transient修饰对成员变量完全没有影响
但是序列化的时候有用,如果一个成员被transient修饰,那么序列化的时候就会忽略改成员变量
4 打印流
打印字符流 打印字符流
两个打印东西方法一样
使用几乎一样,底层不同
4.1 PrintWriter 打印字符流
可以打印到:
- 字符串的文件名
- FIle对象
- 其他的OutputStream流
- 其他的Writer流
4.2 PrintStream 打印字符流
可以打印到
- 字符串的文件名
- FIle对象
- 其他的OutputStream流