java io 读取多个对象_Java IO系列(五):读写对象ObjectOutputStream和ObjectInputStream详解...
有必要多看几遍的
关于字符和字节,例如文本文件,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详解...相关推荐
- java责任链模式审批请假_Java使用责任链模式处理学生请假问题详解
本文实例讲述了Java使用责任链模式处理学生请假问题.分享给大家供大家参考,具体如下: 一. 模式定义 在责任链模式中,很多对象由每一个对象对其下家的引用而连接起来,形成一条链.客户端应用请求在这个链 ...
- python训练模型函数参数_keras读取训练好的模型参数并把参数赋值给其它模型详解...
介绍 本博文中的代码,实现的是加载训练好的模型model_halcon_resenet.h5,并把该模型的参数赋值给两个不同的新的model. 函数式模型 官网上给出的调用一个训练好模型,并输出任意层 ...
- java读取一个应用程序_Java IO – 在写入其他应用程序时读取一个大文件
我想使用java来读取weblogic日志文件,而weblogic正在将日志写入其中(缓冲),但我只想读取内容,当我开始阅读它时. 我怎样才能做到这一点 ? public class DemoRead ...
- java的io流的file类_java IO流 (一) File类的使用
1.File类的理解 * 1. File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹) * 2. File类声明在java.io包下 * 3. File类中涉及到关于文件或文件目录的创建.删 ...
- java 值对象_java 中设计模式(值对象)的实例详解
java 中设计模式(值对象)的实例详解 应用场景:在Java开发时,需要来回交换大量的数据,比如要为方法传入参数,也要获取方法的返回值,该如何能更好的进行数据的交互?这个时候就需要用到我们的值对象设 ...
- java输入流读取几行文本_Java基础笔记Day_16
IO流(字节流) IO流概述及其分类 ** InputStream(字节输入流)和Reader(字符输入流)通俗的理解都是读(read)的.** ** OutputStream(字节输出流)和Wr ...
- java声明对象_Java中类的声明与对象创建
类是一个模板,它描述一类对象的行为和状态:对象是类的一个具体的实例,由类构造对象的过程称为创建类的实例.如:路灯是一个类,每一个路灯就是该类的对象. 1.类声明 类声明格式 [public] [abs ...
- java 5 多线程_Java基础系列五、多线程
1.什么是进程?什么是线程? 进程概念:在计算机中运行的软件,是操作系统中最基础的组成部分 .进程是容器,里面装的都是线程. 线程概念:就是运行在进程中的一段代码,是进程中最小组织单元. 注意: 1. ...
- java解析日志数据_Java实时监控日志文件并输出的方法详解
Java实时监控日志文件并输出的方法详解 想在前台显示数据同步过程中产生的日志文件,在网上找到解决方案,做了代码测试好用.这里做个记录 java.io.RandomAccessFile可以解决同时向文 ...
最新文章
- 用于参考的学生信息管理系统(数据库简单 可自己参考创建)
- WINCE6.0+S3C2443的启动过程---内核启动
- 实战(多图):旧路由器刷panabit系统!一台路由器的新生……
- web----DNS解析
- 经struts2中的action后,jsp中css失效的问题
- SOAWebservice系列课程(1)--The Essentials of Service Orientation
- SAP CRM HANA report模型的数据库存储表
- 阻止函数源码在控制台输出
- 字符串转数字测试--知识备忘
- (51)FPGA面试题-Verilog中function与task之间的区别是什么?
- [BZOJ1563][NOI2009]诗人小G[决策单调性优化]
- ROS入门 常用工具
- HTML黑客帝国代码雨
- drop_caches 释放哪些
- UVALive 7269 	Snake Carpet
- nvm use报错exit status 1解决方法
- 现代大学英语精读第二版(第四册)学习笔记(原文及全文翻译)——10B - None of This Is Fair(毫无公平可言)
- vue中element中的input框和laod中防抖和节流结合使用(性能优化)使用lodash相关方法
- 【[中文直播] 第21期 | UE4数据驱动开发 | Epic 大钊】课程笔记
- 重庆博物馆的智慧公厕管理系统
热门文章
- [信息安全] 3.HTTPS工作流程
- .Net Core应用搭建的分布式邮件系统设计
- mysql sql语句书写之面试部分
- [转]Xdebug----Failed loading
- 投巧解决JavaScript split方法出现空字符的问题
- [转]如何进行单元测试
- linux之通过grep使用or、and、not操作
- php运行条件,PHP配置环境要求 php运行的先决条件
- 趁爸妈不在家约男朋友回家吃饭,然而......
- 如果在我爸的朋友圈当杠精,会挨揍吗?