疯狂java IO流续~~

来源:互联网 发布:数控铣削编程 编辑:程序博客网 时间:2024/05/16 18:35
Java传统IO的基本体系:
 
              字节输入流     字节输出流           字符输入流    字符输出流
           InputStream     OutputStream          Reader           Writer
访问文件     FileXxx
访问数组:   ByteArrayXxx                       CharArrayXxx
访问管道    PipedXxx
访问字符串                                       StringXxx
过滤流   FilterInputStream  FilterOutputStream  FilterReader    FilterWriter
缓冲流     BufferedXxx
打印流                       PrintStream                          PrintWriter
转换流                                       InputStreamReader   OutputStreamWriter
特殊流    DataInputStream    DataOutputStream
         ObjectInputStream  ObjectOutputStream




RandomAccessFile  -  1. 它只能访问文件。相当于DataInputStream和DataOutputStream组合
                      2. 任意, 由seek(int pos)。


序列化


       内存中Java对象 ←→ 二进制流


  目的:
      A. 在有些时候,需要把对象存储到外部存储器中持久化保存。
      B. 有有些时候,需要把对象通过网络传输。
      ……
     




■ 可序列化的对象,Java要求序列化的类实现下面任意两个接口:
    - Serializable : 接口只是一个标记性的接口,实现该接口无需实现任何方法。
    - Externalizable:实现该接口要实现方法。




■ 序列化的IO流:
    ObjectInputStream   - 负责从二进制流“恢复”对象。readObject
    ObjectOutputStream  - 负责把对象保存到二进制流中。writeObject


■ 引用变量的序列化机制
    A。 引用变量所引用对象的所有属性的类都应该是可序列化的。
    B。 序列化的底层机制:
        (1) 每序列化一个对象,都会给该对象设置一个编号。
        (2) 如果程序第一次序列化某个对象。系统会真的将该对象序列化、并输出。
        (3) 如果要序列化的对象是之前已序列化的。此时系统指数输出一个编号。


        这种序列化机制,就是为了保存磁盘里的二进制流与内存中的对象是对应的。
■ transient - 修饰符。
                用于修饰实例变量。(不能与static同时使用!)
                transient 用于执行被修饰的Field不会被序列化。


    static修饰的是类变量 - 序列化机制负责序列化实例。
      static修饰的类变量存储在类信息中,并不是在存储在对象里
    ——因此static修饰的类变量不会被序列化!
    


    为什么要用transient ?
     对于一些敏感信息,比如银行卡帐号、密码,就不应该被序列化出来,
     此时就可以通过transient来修饰这些属性。


■ 完全自定义序列化


     对于一些敏感信息,可以使用transient来阻止对它们进行序列化。
     但将一些属性完全阻止在序列化之外,有时候也并不完善。


     此时可以借助于“定制序列化”, 可以对属性进行一些“加密”。


    自定义序列化机制,为序列化类增加如下两个方法:
      private void writeObject(java.io.ObjectOutputStream out)
            throws IOException
      private void readObject(java.io.ObjectInputStream in)
            throws IOException, ClassNotFoundException;


■ 版本号
    
    当我们的类经常时,有时候系统无法确定“反序列化”时的class文件是否还正确。


    建议显式为 “可序列化”指定一个版本号。
    /*  即使你不指定,系统默认也有一个版本号,但不稳定。 */
    
    serialver.exe - 专门用于查看来类的版本号。
   
     serialver -show : 显示图形化界面。
     serialver 完整的类名 :显示指定的类的版本号。


    定义版本号,十分简单:


    static final long serialVersionUID = 50L;


    自定义版本号的好处:更稳定。
     只有当我们修改了类定义时,可由程序员显式地控制改变版本号。
    
Java 7
    传统的Java里,只有一个File类,即代表文件,又代表目录。


/**   Arrays、Objects、Collections、Paths、Files    **/


    Path  - 接口,代表一个平台无关的目录。 
             提供了大量的方法来操作目录。
    Paths - 工具类。所有方法都是static的。
    Files - 操作文件的工具类。
             提供了大量的方法来操作文件。
             该类所包含的大量方法可能与我们日常一般的期望有些出入。