六、对象的序列化和反序列化
  1、将Object对象转换成byte序列,反之叫对象的反序列化
  2、序列化流(ObjectOutputStream),是过滤流---writeObject()
  反序列化流(ObjectInputStream),    ----readObject
  3、序列化接口(Serializable)
  对象必须实现序列化接口,才能进行序列化,否则将出现异常
  这个接口没有任何方法,只是一个标准,是标记接口
  对象序列化后,如果对再次对类文件修改,那么反序列化的时候会出问题,那么怎么解决呢?
  需要在类中设置序列版本id,标记,这样无论怎么修改读取的时候都不会再有问题   serialVersionUID
  4、transient关键字
  声明的元素不会进行JVM默认的序列化,也可以自己完成这个元素的序列化
  网络中传输时,并不是所有的元素都是有必要传输的,尤其是要考虑节约网络流量的时候
  在有些情况下,可以帮助我们提高性能(ArrayList在数组没有放满的时候,只把有效元素序列化)
  5、序列化中 子类和父类构造函数的调用问题
  父类实现了序列化接口,子类不需要再次实现,能进行序列化
  对子类对象进行反序列化操作时,如果其父类没有显示的实现序列化接口,那么其父类的构造函数会被调用
  七、输入输出流的一些包装类
  1、打印流
  PrintStream  :字节打印流
  PrintWriter  :字符打印流
  集成了Print()格式化输出方法,可以操作任意类型的数据
  2、标准输入输出流
  System类的in、out字段
  默认输入设备是键盘,输出设备是显示器
  标准IO重定向
  System.setIn(InputStream);
  //重定向输出可以将打印到控制台的日志写到文件
  System.setOut(PrintStream);
  System.err(PrintStream);
  3、进程控制
  在Java内部执行其他操作系统的程序,并要求控制这些程序的输入输出时
  向OSExecute.command()传递一个command字符串
  Process process = new ProcessBuilder(command.split(" ")).start();
  OSExecute.command("javap test");
  //javap是java的一个反编译程序
  八、IO操作过程中异常处理
  自己编程要用try-catch-finally包围起来,如果有异常尽量处理,千万不要仅仅是用printStackTrace()打印栈信息,在finally中进行流的关闭(判断引用不为空的话关闭),以确保一定能得到执行