Java IO总结:
- 两种对称模式:
字节 | 字符 |
---|---|
InputStream | Reader |
OutputStream | Writer |
------------ | -------------- |
输入 | 输出 |
InputStream | OutputStream |
Reader | Writer |
read( ) | write( ) |
两种设计模式
1.装潢模式 - 过滤流
2.适配器模式 - 转换流三种流
1.数据流(原始流)
2.过滤流(处理流)
3.转换流(编码转换)
- FileOutputStream - 指定文件作为输出的目的地 - 数据流(原始流)
PrintStream - 本身没有输出的目的地,要依赖数据流才能使用 - 过滤流(处理流)
过滤流通常都比数据流拥有更多的方法方便对流进行各种的操作
system中的in和out两个流可以进行重定向
try(PrintStream out = new PrintStream(new FileOutputStream("c:/Users/apple/Desktop/乘法.txt"))) {
System.setOut(out);
for(int i = 1;i <= 9;i++){
for(int k = 1;k <= i;k++){
System.out.print(k + "*" + i + "=" + i * k + "\t");
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
- 转换流 - 将字节流适配成字符流(实现从字节到字符的转换)
如果应用程序中需要做编码转换(将8位的编码转换成16位的编码,就需要使用转化流)
try {
InputStreamReader inputReader = new InputStreamReader(System.in);
BufferedReader bufferedReader = new BufferedReader(inputReader);
String string;
while((string = bufferedReader.readLine()) != null){
System.out.println(Integer.parseInt(string));
}
} catch (IOException e) {
e.printStackTrace();
}
- 序列化 (序列化 / 串行化 / 归档 / 腌咸菜)
就是把对象写入流中
如果对象要支持序列化操作,那么对象关联性的其他对象也要支持序列化
public class Test03 {
//存档
public static void main(String[] args) {
Student student = new Student("王大锤", 20, "1234567890");
student.setCar(new Car("Benz", 200));
System.out.println(student);
try (OutputStream out = new FileOutputStream("c:/Users/apple/Desktop/stu.txt")){
//创建过滤流
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(student);
System.out.println("存档成功");
}
catch (IOException e) {
e.printStackTrace();
}
}
}
- 反序列化
就是从流中读取对象
public class Test04 {
//读档
public static void main(String[] args) {
try (InputStream in = new FileInputStream("c:/Users/apple/Desktop/stu.txt")){
ObjectInputStream ois = new ObjectInputStream(in);
//Object object = ois.readObject();
Student object = (Student) ois.readObject();
System.out.println(object);
}
catch (IOException e) {
e.printStackTrace();
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
- transient关键字
被它修饰的属性不参与序列化和反序列化