zoukankan      html  css  js  c++  java
  • 串行化

    串行化 以标准格式将任意的Java数据结构转换为字节流。例如,下面的程序输出随机整数数组:

     

    import java.io.*;

    import java.util.*;

    public class serial1 {

       public static void main(String args[]) {

            ArrayList al = new ArrayList();

            Random rn = new Random();

            final int N = 100000;

            for (int i = 1; i <= N; i++)

                al.add(new Integer(rn.nextInt()));

            try {

                FileOutputStream fos = new FileOutputStream("test.ser");

                BufferedOutputStream bos = new BufferedOutputStream(fos);

                ObjectOutputStream oos = new ObjectOutputStream(bos);

                oos.writeObject(al);

                oos.close();

            } catch (Throwable e) {

                System.err.println(e);

            }

       }

    }

    而下面的程序读回数组:

     import java.io.*;

    import java.util.*;

    public class serial2 {

       public static void main(String args[]) {

            ArrayList al = null;

            try {

                FileInputStream fis = new FileInputStream("test.ser");

                BufferedInputStream bis = new BufferedInputStream(fis);

                ObjectInputStream ois = new ObjectInputStream(bis);

                al = (ArrayList) ois.readObject();

                ois.close();

            } catch (Throwable e) {

                System.err.println(e);

            }

       }

    }

    注意我们使用缓冲提高I/O操作的速度。

    有比串行化更快的输出大量数据然后读回的方法吗?可能没有,除非在特殊的情况下。例如,假设你决定将文本输出为64位的整数而不是一组8字节。作为文本的长整数的最大长度是大约20个字符,或者说二进制表示的2.5倍长。这种格式看起来不会快。然而,在某些情况下,例如位图,一个特殊的格式可能是一个改进。然而使用你自己的方案而不是串行化的标准方案将使你卷入一些权衡。

    除了串行化实际的I/O和格式化开销外(使用DataInputStream和 DataOutputStream), 还有其他的开销,例如在串行化恢复时的创建新对象的需要。

    注意DataOutputStream 方法也可以用于开发半自定义数据格式,例如:

     import java.io.*;

    import java.util.*;

    public class binary1 {

       public static void main(String args[]) {

            try {

                FileOutputStream fos = new FileOutputStream("outdata");

                BufferedOutputStream bos = new BufferedOutputStream(fos);

                DataOutputStream dos = new DataOutputStream(bos);

                Random rn = new Random();

                final int N = 10;

                dos.writeInt(N);

                for (int i = 1; i <= N; i++) {

                     int r = rn.nextInt();

                     System.out.println(r);

                     dos.writeInt(r);

                }

                dos.close();

            } catch (IOException e) {

               System.err.println(e);

            }

       }

    }

    和:

     import java.io.*;

    public class binary2 {

       public static void main(String args[]) {

            try {

                FileInputStream fis = new FileInputStream("outdata");

                BufferedInputStream bis = new BufferedInputStream(fis);

                DataInputStream dis = new DataInputStream(bis);

                int N = dis.readInt();

                for (int i = 1; i <= N; i++) {

                     int r = dis.readInt();

                     System.out.println(r);

                }

                dis.close();

            } catch (IOException e) {

                System.err.println(e);

            }

       }

    }

    这些程序将10个整数写入文件然后读回它们。

     

  • 相关阅读:
    QA的几个经典问题(1)
    QA的几个经典问题(2)
    通过Android录音进行简单音频分析
    Android在TextView中实现RichText风格
    Handler Should be static or leaks Occur?
    如何查看华为EMUI系统APK源码?
    ServiceManager: Permmission failure: android.permission.RECORD_AUDIO
    Android 4.4以上的存储读写权限
    如何使用Android中hide的类和方法进行开发?
    在Mac mini上编译Android源码
  • 原文地址:https://www.cnblogs.com/borter/p/9434282.html
Copyright © 2011-2022 走看看