当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
javaIO流之对象流应用
发布时间:2010/12/12 20:11:48 来源:城市学习网 编辑:ziteng
  java io 流比较常用的功能就是可以用来读写数据,但是除了这些功能之外,我们还可以利用io流来完成一些其他的功能,例如我们就可以利用对象流去做对象的clone,并且这种clone是一种深度的clone.
  用对象做clone的基本思路就是将要clone的对象读入流中,然后将流中的对象读出来,就是对原来的对象一个clone。
  Java代码
  package com.unis.io.stream;
  import java.io.ByteArrayInputStream;
  import java.io.ByteArrayOutputStream;
  import java.io.IOException;
  import java.io.ObjectInputStream;
  import java.io.ObjectOutputStream;
  import java.io.Serializable;
  public abstract class CloneUtil {
  @SuppressWarnings("unchecked")
  public static <T extends Serializable> T clone(T obj) throws IOException,
  ClassNotFoundException {
  ByteArrayOutputStream bos = null;
  ObjectOutputStream oos = null;
  ObjectInputStream ois = null;
  try {
  bos = new ByteArrayOutputStream();
  oos = new ObjectOutputStream(bos);
  oos.writeObject(obj);
  oos.flush();
  ois = new ObjectInputStream(new ByteArrayInputStream(bos
  .toByteArray()));
  } finally {
  ois.close();
  oos.close();
  bos.close();
  }
  return (T) ois.readObject();
  }
  }
  我们可以写一个对象进行测试一下,在这里我就不测试了。
  在这里我要说的就是另外一个问题---单例
  我们知道单例的一个重要的特点就是单例的类只能创建一个实例。
  下面我给出一个最常见的单例类
  Java代码
  package com.unis.io.stream;
  import java.io.Serializable;
  public class Singleton implements Serializable{
  private static final long serialVersionUID = -4716870336119609481L;
  private final static Singleton instance = new Singleton();
  private Singleton(){
  }
  public static Singleton getInstance(){
  return instance;
  }
  }
  上面是一个很常见的单例类,现在就用我们刚才写的clone方法来clone这个单例类,看是什么结果
  测试方法:
  Java代码
  Singleton s1 = Singleton.getInstance();
  Singleton s2 = CloneUtil.clone(s1);
  System.out.println(s1==s2);
  我们看到的结果是输出的是false。因此用这种单例克隆出来的对象不是同一个对象。
  所以用这种方式创建的单例是不安全的。
  下面我们用枚举的方式去创建一个单例类
  Java代码
  package com.unis.io.stream;
  public enum Singleton2 {
  INSTANCE;
  private String name;
  public String getName() {
  return name;
  }
  public void setName(String name) {
  this.name = name;
  }
  }
  同样用我们的clone方法去测试
  Java代码
  Singleton2 s3 = Singleton2.INSTANCE;
  Singleton2 s4 = CloneUtil.clone(s3);
  s4.setName("sdf");
  System.out.println(s3==s4);
  System.out.println(s3.getName());
  我们发现输出的结果是true。说明被clone出来的对象和源对象是同一个对象。
  因此我们以后在用单例的时候尽量用这种方式。
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved