欢迎光临散文网 会员登陆 & 注册

java对象流

2022-08-25 12:33 作者:虚云幻仙  | 我要投稿

/**
* 对象流ObjectInputStream/ObjectOutputStream
* 处理流,将对象序列化(类似编码)通过节点流存储、反序列化(类似解码)通过节点流读取对象。常用于将对象保存至文件、网络传输及从文件、网络中读取对象
* 序列化/串行化serialization对象时需要对象实现Serializable可串行化的/可序列化的 接口
*/

public class ObjectStream1 {
   public static void main(String[] args) {
       try (ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("iostream/testObject.objects")))){
           //字节节点流一般会外套缓冲流,因为字节流读取文件是逐字节进行读取的,所以后缀是否有和后缀写什么都不会影响文件的读取,而因为文件中写入的是对象,所以一般常用的各种类型的软件都不可能正确读取内容,也就不需要设定为txt了
           oos.writeBoolean(true);
           oos.writeByte(255);
           oos.writeChar('a');
           oos.writeDouble(Math.random());
           oos.writeUTF("对象流也可以存取基础数据类型,用法和数据流相同,但两者不是继承关系");
           oos.flush();
           //用记事本打开结果为: wq a?鈹墫圔? c瀵硅薄娴佷篃鍙互瀛樺彇鍩虹鏁版嵁绫诲瀷锛岀敤娉曞拰鏁版嵁娴佺浉鍚岋紝浣嗕袱鑰呬笉鏄户鎵垮叧绯?
       } catch (Exception e) {
           e.printStackTrace();
       }
       try(ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("iostream/testObject.objects")))){
           boolean bo = ois.readBoolean();
           byte by = ois.readByte();
           char ch = ois.readChar();
           double dou = ois.readDouble();
           String st = ois.readUTF();
           System.out.println(bo+"\t"+by+"\t"+ch+"\t"+dou+"\t"+st);
           //和数据流相同,必须按照存储顺序进行数据类型的读取,直接返回原数据类型,结果为:true  -1 a  0.50018980655707
           // 对象流也可以存取基础数据类型,用法和数据流相同,但两者不是继承关系,对象流在实例化时会实例化一个数据流对象,一部分基础数据类型的存取方法是通过数据流对象完成的

       } catch (FileNotFoundException e) {
           throw new RuntimeException(e);
       } catch (IOException e) {
           throw new RuntimeException(e);
       }
   }
}

class UserObject implements Serializable{
   //创建可序列化对象,需要实现Serializable接口,Serializable接口内没有任何方法,是一个标记接口,想要序列化必须打标记
   //创建javabean

   private int id;
   private String name;
   private boolean gender;
   //gender性别

   public UserObject(int id, String name, boolean gender) {
       this.id = id;
       this.name = name;
       this.gender = gender;
   }

   public UserObject() {
   }

   public int getId() {
       return id;
   }

   public void setId(int id) {
       this.id = id;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public boolean isGender() {
       return gender;
   }

   public void setGender(boolean gender) {
       this.gender = gender;
   }

   @Override
   public String toString() {
       return "UserObject{" +
               "id=" + id +
               ", name='" + name + '\'' +
               ", gender=" + gender +
               '}';
   }
}

class ObjectStream2{
   public static void main(String[] args) {
       UserObject user1 = new UserObject(1,"zhao",true);
       UserObject user2 = new UserObject(2,"sun",false);
       UserObject user3 = new UserObject(3,"li",true);

       try(ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("iostream/testObject.objects")))) {
           oos.writeObject(user1);
           oos.writeObject(user2);
           oos.writeObject(user3);
           //序列化
           oos.flush();
       } catch (FileNotFoundException e) {
           throw new RuntimeException(e);
       } catch (IOException e) {
           throw new RuntimeException(e);
       }

       try(ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("iostream/testObject.objects")))) {
           UserObject u1 = (UserObject) ois.readObject();
           //反序列化.readObject()返回Object对象,需要强转回User,这意味着读取方需要知道对象的原始类型并且读取方JVM虚拟机能找到这个类(否则抛ClassNotFoundException)
           UserObject u2 = (UserObject) ois.readObject();
           UserObject u3 = (UserObject) ois.readObject();
           System.out.println(u1);
           System.out.println(u2);
           System.out.println(u3);
           //结果为UserObject{id=1, name='zhao', gender=true} UserObject{id=2, name='sun', gender=false} UserObject{id=3, name='li', gender=true}
       } catch (FileNotFoundException e) {
           throw new RuntimeException(e);
       } catch (IOException e) {
           throw new RuntimeException(e);
       } catch (ClassNotFoundException e) {
           throw new RuntimeException(e);
       }
   }
}

java对象流的评论 (共 条)

分享到微博请遵守国家法律