Java--IO总结及序列化反序列化

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关键字
    被它修饰的属性不参与序列化和反序列化

你可能感兴趣的:(Java--IO总结及序列化反序列化)