有必要多看几遍的

关于字符和字节,例如文本文件,XML这些都是用字符流来读取和写入。而如RAR,EXE文件,图片等非文本,则用字节流来读取和写入。

读写对象,传输对象在Java中很常使用,在javaBean中就经常用到。一般来说,对象要能被对写,自身要实现特定的接口,Serializable或Externalizable接口。

实现Serializable接口对象的读写

实现了Serializable的对象,会被全序列化,当我们在进行序列化时,一般对象中存在我们不需要序列化的数据。但Serializable会全序列化,影响效率,一般来说,可能并不是最好的选择。

class Person implements Serializable{

private int age;

private String name;

public Person(int age, String name){

this.age = age;

this.name = name;

}

@Override

public String toString(){

return "[age:" + age + ",name:" + name + "]";

}

}

public class TestObject {

public static void main(String[] args) throws IOException, ClassNotFoundException {

String path = "F:/io/person.txt";

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(path));

out.writeObject(new Person(20, "nick"));

out.writeObject(new Person(21, "liu"));

out.writeObject(new Person(22, "mike"));

out.close();

ObjectInputStream in = new ObjectInputStream(new FileInputStream(path));

for (int i = 0; i < 3; i++) {

System.out.println(in.readObject());

}

in.close();

}

}

结果为:

[age:20,name:nick]

[age:21,name:liu]

[age:22,name:mike]

transient使实现Serializable对象不全序列化

transient是一个关键字,配合Serializable使用,表示该数据不需要序列化。

class Person implements Serializable{

private int age;

private transient String name;//注意这里使用了transient

public Person(int age, String name){

this.age = age;

this.name = name;

}

@Override

public String toString(){

return "[age:" + age + ",name:" + name + "]";

}

}

public class TestObject {

public static void main(String[] args) throws IOException, ClassNotFoundException {

String path = "F:/io/person.txt";

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(path));

out.writeObject(new Person(20, "nick"));

out.writeObject(new Person(21, "liu"));

out.writeObject(new Person(22, "mike"));

out.close();

ObjectInputStream in = new ObjectInputStream(new FileInputStream(path));

for (int i = 0; i < 3; i++) {

System.out.println(in.readObject());

}

in.close();

}

}

结果为:

[age:20,name:null]

[age:21,name:null]

[age:22,name:null]

可见,name确实没有被序列化

实现Externalizable接口对象的局部数据读写

实现Externalizable,则必须实现writeExternal(ObjectOutput out)和readExternal(ObjectInput in)这两个方法,而这两个方法正是关键。

对于Serializable对象,对象不会调用它的构造器。但是Externalizable对象会调用它所有的默认构造器。而我们一般对对象初始化,不是在默认的构造器,这样的话,对象中的数据都没有初始化。

所以我们要在writeExternal中,写我们需要的数据,在readExternal中取我们需要的数据。

class Person implements Externalizable{

private int age;

private String name;

private String address;

public Person(){

}

public Person(int age, String name, String address){

this.age = age;

this.name = name;

this.address = address;

}

@Override

public void writeExternal(ObjectOutput out) throws IOException {

out.writeInt(age);

out.writeObject(name);

}

@Override

public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {

age = in.readInt();

name = (String) in.readObject();

}

@Override

public String toString(){

return "[age:" + age + ",name:" + name + ",address:" + address + "]";

}

}

public class TestObject {

public static void main(String[] args) throws IOException, ClassNotFoundException {

String path = "F:/io/person.txt";

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(path));

out.writeObject(new Person(20, "nick", "beijing"));

out.writeObject(new Person(21, "liu", "guangzhou"));

out.writeObject(new Person(22, "mike", "shanghai"));

out.close();

ObjectInputStream in = new ObjectInputStream(new FileInputStream(path));

for (int i = 0; i < 3; i++) {

System.out.println((Person) in.readObject());

}

in.close();

}

}

结果为:

[age:20,name:nick,address:null]

[age:21,name:liu,address:null]

[age:22,name:mike,address:null]

可见,在writeExternal中,并没有写入address,因为我不需要它。所以我只读取到age和name。

java io 读取多个对象_Java IO系列(五):读写对象ObjectOutputStream和ObjectInputStream详解...相关推荐

  1. java责任链模式审批请假_Java使用责任链模式处理学生请假问题详解

    本文实例讲述了Java使用责任链模式处理学生请假问题.分享给大家供大家参考,具体如下: 一. 模式定义 在责任链模式中,很多对象由每一个对象对其下家的引用而连接起来,形成一条链.客户端应用请求在这个链 ...

  2. python训练模型函数参数_keras读取训练好的模型参数并把参数赋值给其它模型详解...

    介绍 本博文中的代码,实现的是加载训练好的模型model_halcon_resenet.h5,并把该模型的参数赋值给两个不同的新的model. 函数式模型 官网上给出的调用一个训练好模型,并输出任意层 ...

  3. java读取一个应用程序_Java IO – 在写入其他应用程序时读取一个大文件

    我想使用java来读取weblogic日志文件,而weblogic正在将日志写入其中(缓冲),但我只想读取内容,当我开始阅读它时. 我怎样才能做到这一点 ? public class DemoRead ...

  4. java的io流的file类_java IO流 (一) File类的使用

    1.File类的理解 * 1. File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹) * 2. File类声明在java.io包下 * 3. File类中涉及到关于文件或文件目录的创建.删 ...

  5. java 值对象_java 中设计模式(值对象)的实例详解

    java 中设计模式(值对象)的实例详解 应用场景:在Java开发时,需要来回交换大量的数据,比如要为方法传入参数,也要获取方法的返回值,该如何能更好的进行数据的交互?这个时候就需要用到我们的值对象设 ...

  6. java输入流读取几行文本_Java基础笔记Day_16

    IO流(字节流) IO流概述及其分类 ** InputStream(字节输入流)和Reader(字符输入流)通俗的理解都是读(read)的.** ​ ** OutputStream(字节输出流)和Wr ...

  7. java声明对象_Java中类的声明与对象创建

    类是一个模板,它描述一类对象的行为和状态:对象是类的一个具体的实例,由类构造对象的过程称为创建类的实例.如:路灯是一个类,每一个路灯就是该类的对象. 1.类声明 类声明格式 [public] [abs ...

  8. java 5 多线程_Java基础系列五、多线程

    1.什么是进程?什么是线程? 进程概念:在计算机中运行的软件,是操作系统中最基础的组成部分 .进程是容器,里面装的都是线程. 线程概念:就是运行在进程中的一段代码,是进程中最小组织单元. 注意: 1. ...

  9. java解析日志数据_Java实时监控日志文件并输出的方法详解

    Java实时监控日志文件并输出的方法详解 想在前台显示数据同步过程中产生的日志文件,在网上找到解决方案,做了代码测试好用.这里做个记录 java.io.RandomAccessFile可以解决同时向文 ...

最新文章

  1. 用于参考的学生信息管理系统(数据库简单 可自己参考创建)
  2. WINCE6.0+S3C2443的启动过程---内核启动
  3. 实战(多图):旧路由器刷panabit系统!一台路由器的新生……
  4. web----DNS解析
  5. 经struts2中的action后,jsp中css失效的问题
  6. SOAWebservice系列课程(1)--The Essentials of Service Orientation
  7. SAP CRM HANA report模型的数据库存储表
  8. 阻止函数源码在控制台输出
  9. 字符串转数字测试--知识备忘
  10. (51)FPGA面试题-Verilog中function与task之间的区别是什么?
  11. [BZOJ1563][NOI2009]诗人小G[决策单调性优化]
  12. ROS入门 常用工具
  13. HTML黑客帝国代码雨
  14. drop_caches 释放哪些
  15. UVALive 7269 Snake Carpet
  16. nvm use报错exit status 1解决方法
  17. 现代大学英语精读第二版(第四册)学习笔记(原文及全文翻译)——10B - None of This Is Fair(毫无公平可言)
  18. vue中element中的input框和laod中防抖和节流结合使用(性能优化)使用lodash相关方法
  19. 【[中文直播] 第21期 | UE4数据驱动开发 | Epic 大钊】课程笔记
  20. 重庆博物馆的智慧公厕管理系统

热门文章

  1. [信息安全] 3.HTTPS工作流程
  2. .Net Core应用搭建的分布式邮件系统设计
  3. mysql sql语句书写之面试部分
  4. [转]Xdebug----Failed loading
  5. 投巧解决JavaScript split方法出现空字符的问题
  6. [转]如何进行单元测试
  7. linux之通过grep使用or、and、not操作
  8. php运行条件,PHP配置环境要求 php运行的先决条件
  9. 趁爸妈不在家约男朋友回家吃饭,然而......
  10. 如果在我爸的朋友圈当杠精,会挨揍吗?