摘自http://blog.csdn.net/fjdingsd/article/details/46765803

使用ObjectInputStream的readObject()方法如何判断读取到多个对象的结尾

import java.io.EOFException;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream; import cn.com.mybolg.bean.Person; /*
* 若文件中有若干个Object对象,你用ObjectInputStream中的readObject()去读,何时判读到结尾?
* 方法之一:(常用的方法)将若干个对象(数量不定)都装入一个容器中(如:ArrayList之类),
* 然后将容器这一个对象写入就行了。读取时,只要读取一个对象(即容器对象)就行了。
*
* 方法之二:(若不想用容器),则由于数量不定,正是用EOFException来判断结束。
* 代码结构如下:(无论是readInt()读int,还是readObject()读对象)
* try{
* while(true) {
* Object o=ois.radObject();
* 处理已读出的对象o;
* }
* }
* catch(EOFException e){
* //已从流中读完。
* }
* finallly {
* 流的关闭。 }
*/ public class ObjectInputStreamDemo { public static void main(String[] args) throws IOException, ClassNotFoundException { FileInputStream fis = new FileInputStream("F:\\person.object");
ObjectInputStream osi = new ObjectInputStream(fis); try {
while(true) {
Person p = (Person) osi.readObject();
System.out.println(p.getName()+":"+p.getAge());
}
}
catch(EOFException e) { }
finally {
osi.close();
}
} }

以下是自己的试验:

往文件里存多个对象也没问题,调用writeObject()一直往里写即可,readObject()一次返回一个对象,再readObject()一次返回第二个对象,自动在每个对象后面做标记。并且同一个文件中可以依次存入不同类的对象。先存入一个Person对象,再存入一个Demo对象,再存个Haha对象都可以。按顺序读就行了。

package packa;

import java.io.*;

class ObjectInputOutputStream
{
public static void main(String[] args)throws Exception
{
writeObj();
readObj();
} private static void writeObj()throws Exception
{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.object")); oos.writeObject(new Person("liu", 30, "kr"));
oos.writeObject(new Person2("liu", "kr", "kr2"));
oos.writeObject(new Person3(10, 30, 50)); oos.close();
} private static void readObj()throws Exception
{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.object"));
System.out.println(ois.readObject());
System.out.println(ois.readObject());
System.out.println(ois.readObject()); ois.close();
}
}
package packa;

import java.io.*;

class Person implements Serializable
{
public static final long serialVersionUID = 44L; String name;
transient int age;
static String country = "cn"; Person(String name, int age, String country)
{
this.name = name;
this.age = age;
this.country = country;
} public String toString()
{
return name + " " + age + " " + country;
} }
class Person2 implements Serializable
{
public static final long serialVersionUID = 45L; String name;
String country;
String country2; Person2(String name, String country, String country2)
{
this.name = name;
this.country = country;
this.country2 = country2;
} public String toString()
{
return name + " " + country + " " + country2;
} }
class Person3 implements Serializable
{
public static final long serialVersionUID = 46L; int age;
int age2;
int age3; Person3(int age, int age2, int age3)
{
this.age = age;
this.age2 = age2;
this.age3 = age3;
} public String toString()
{
return age + " " + age2 + " " + age3;
} }

使用ObjectInputStream的readObject()方法如何判断读取到多个对象的结尾的更多相关文章

  1. Effective Java 第三版——88. 防御性地编写READOBJECT方法

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  2. Java安全之原生readObject方法解读

    Java安全之原生readObject方法解读 0x00 前言 在上篇文章分析shiro中,遇到了Shiro重写了ObjectInputStream的resolveClass导致的一些基于Invoke ...

  3. cin判断读取结束 C++语言

    cin是C++的输入流,可以通过>>进行读取. 判断读取结束,一般有两种方法,具体取决于与输入的约定. 1 以特殊值结尾. 如输入整数,以-1结束,那么当读到-1的时候,就确定读取结束了. ...

  4. pandas学习(常用数学统计方法总结、读取或保存数据、缺省值和异常值处理)

    pandas学习(常用数学统计方法总结.读取或保存数据.缺省值和异常值处理) 目录 常用数学统计方法总结 读取或保存数据 缺省值和异常值处理 常用数学统计方法总结 count 计算非NA值的数量 de ...

  5. 编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时会产生Additional information: 阅读器关闭时尝试调用 Read 无效问题,解决方法与解释

    在自学杨中科老师的视频教学时,拓展编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时 会产生Additional information: 阅读器关闭时尝试调用 ...

  6. 使用Object.prototype.toString.call()方法精确判断对象的类型

    在JavaScript里使用typeof判断数据类型,只能区分基本类型,即:number.string.undefined.boolean.object. 对于null.array.function. ...

  7. java算法:统计数字-将数字转换成字符串,然后使用字符串String.valueOf()方法进行判断

    题目: 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值. 样例 样例 1: 输入: k = 1, n = 1 输出: 1 解释: 在 [0, 1] 中,我们发现 1 出现了 ...

  8. php -- 魔术方法 之 判断属性是否存在或为空:__isset()

    属性重载:当访问一个不存在或者权限不够的属性的时候,能够触发一系列的魔术方法,就叫做属性重载 __isset($name):当使用 isset()函数或者empty()函数 判断属性是否存在或者是否为 ...

  9. 判断变量是否为json对象

    var m ={a:'A'}; if(typeof m == 'object' && JSON.stringify(m).indexOf('{') == 0){//判断变量m是不是js ...

随机推荐

  1. UVa1587.Digit Counting

    题目连接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=247&p ...

  2. js相对定位

    效果图:

  3. (36)JS运动之使物体向右运动

    基本思路:样式要是绝对定位,不然的话根本走不起来.当开启一个定时器的时候.必须先清除定时器.这是为了防止鼠标连续点击button而开启多个定时器,导致物体的速度加快等原因,其次要控制好物体的运动和停止 ...

  4. 2016-XCTF Final-Richman

    抽时间将XCTF Final中Richman这个题总结了下.题目及ida idb所在的链接在:http://files.cnblogs.com/files/wangaohui/richman-blog ...

  5. win7 AnkhSVN 安装报错

    重装系统后,需要安装AnkhSVN,结果一直报如下错误 An error occurred during the installation of assembly"Microsoft.VC8 ...

  6. 学习使用Vim(二)——User Manuals, Getting Started

    Vim的用户手册主要包含以下三个部分:     Getting Started;     Editing Effectively;     Tuning Vim;     分别代表基本编辑技巧,更优化 ...

  7. Java学习——内部类

    内部类的访问规则:1,内部类可以直接访问外部类中的成员,包括私有. 之所以可以直接访问外部类中的成员,是因为内部类中持有了 一个外部类的引用,格式 外部类名.this2,外部类要访问内部类,必须建立内 ...

  8. MyBatis调用Oracle的存储过程

    Mapper.xml文件: --------------------------------- <parameterMap type="map" id="class ...

  9. 转:Dictionary<int,string>怎么获取它的值的集合?急!急!急!

    怎么获取Dictionary<int, string>的值?我知道这个是键值对的,我知道可以根据key得到value,但关键是现在连key也不知道啊就是想让这个显示在listbox中,应该 ...

  10. C++程序设计实践指导1.1删除序列中相同的数改写要求实现

    改写要求1:改写为以指针为数据结构 #include <iostream> #include <cstdlib> using namespace std; class ARP ...