我的Java开发学习之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法
今天用ObjectOutputStream和ObjectInputStream进行对象序列化话操作的时候,报了java.io.EOFException异常。
异常代码如下:
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2554)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at cn.fuxi.io.ReadObject.readObject(ReadObject.java:27)
at cn.fuxi.io.ReadObject.main(ReadObject.java:12)
这个异常是因为我使用ObjectInputStream读取对象时候,没有判断好ObjectInputStream是否读取到了未知长度的文件末尾,导致到了文件末尾,程序无法正常读取文件内容。
后来研究了一下以后,得出三种解救思路:
第一种方法:
在写完对象后,加一句 oos.writeObject(null); 插入null是用来判断是否读取到结尾。oos是ObjectOutputStream实例。
然后读对象的时候,使用while ((obj = ois.readObject()) != null),来判断再次读取一个对象,判定对象是否是空,如果不为null继续读取,如果为null停止读取。
第二种方法:
将若干个对象(数量不定)都装入 一个容器中(如:ArrayList之类的),然后写对象的时候,将该容器写入。
读取的时候,读取出容器,然后再遍历容器,取出自己所需的对象。
第三个方法:
和第二个方法类似,将对象都存入数组中,然后写入数组对象。
读取的时候,取出数组,再遍历数组,取出所需的对象。
下面是具体的代码操作:
1、要进行序列号的对象 Person.java
import java.io.Serializable; public class Person implements Serializable {
/**
*
*/
private static final long serialVersionUID = -6374324573857634276L;
private String name;
private int age; public Person(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} }
2、写入对象的三种方法
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List; public class WriteObject { /**
* @param args
*/
public static void main(String[] args) {
writeObjectByArray();
writeObject();
writeObjectByList();
}
/**
* 直接写入对象
*/
private static void writeObject() {
try {
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("object.txt"));
for (int i = 1; i < 10; i++) {
oos.writeObject(new Person("欧阳鹏[" + i+"]", i));
}
//插入null是用来判断是否读取到结尾
//写入结束标志方便读取(非常重要,如果不写入,在读取的时候无法定位读取结束);
//读取的时候就会报 java.io.EOFException 异常
oos.writeObject(null);
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 通过数组写入对象
*/
private static void writeObjectByArray() {
try {
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("objectByArray.txt"));
Person[] persons = new Person[10];
for (int i = 1; i < 10; i++) {
Person person = new Person("欧阳鹏 Arrays[" + (10+i)+"]", 10+i);
persons[i] = person;
}
oos.writeObject(persons);
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 通过集合写入对象
*/
private static void writeObjectByList() {
try {
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("objectByList.txt"));
List<Person> persons=new ArrayList<Person>();
for (int i = 1; i < 10; i++) {
Person person = new Person("欧阳鹏 List[" + (20+i)+"]", 20+i);
persons.add(person);
}
//写入List
oos.writeObject(persons);
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
} }
3、读取对象的三种方法
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.List; public class ReadObject {
/**
* @param args
*/
public static void main(String[] args) {
readObject();
System.out.println("==============================");
readObjectByArrays();
System.out.println("==============================");
readObjectByList();
}
/**
* 直接读取对象
*/
private static void readObject() {
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
"object.txt"));
Object obj = null;
//如果为null就读取到文件结尾了
//读取结束标志位:是再次读取一个对象,判定对象是否是空,如果不为null继续读取,如果为null停止读取
while ((obj = ois.readObject()) != null) {
////反序列化读取得到Person
Person person = (Person) obj;
System.out.println("名字为:" + person.getName() + " 年龄为:"
+ person.getAge());
}
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 通过数组读取对象
*/
private static void readObjectByArrays() {
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
"objectByArray.txt"));
//反序列化读取得到Person[]
Person[] persons = (Person[]) ois.readObject();
for (int i = 1; i < persons.length; i++) {
Person person = (Person) persons[i];
System.out.println("名字为:" + person.getName() + " 年龄为:"
+ person.getAge());
}
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 通过集合读取对象
*/
private static void readObjectByList() {
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
"objectByList.txt"));
//反序列化读取得到List<Person>
List<Person> persons = (List<Person>) ois.readObject();
for (int i = 0; i <persons.size(); i++) {
Person person=persons.get(i);
System.out.println("名字为:" + person.getName() + " 年龄为:"
+ person.getAge());
}
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
} }
下面是结果:
写入对象后,在src同级目录下,生成3个文件,分别是object.txt 、objectByArray.txt、objectByList.txt 如下图所示。
读取对象,结果如下:
名字为:欧阳鹏[1] 年龄为:1
名字为:欧阳鹏[2] 年龄为:2
名字为:欧阳鹏[3] 年龄为:3
名字为:欧阳鹏[4] 年龄为:4
名字为:欧阳鹏[5] 年龄为:5
名字为:欧阳鹏[6] 年龄为:6
名字为:欧阳鹏[7] 年龄为:7
名字为:欧阳鹏[8] 年龄为:8
名字为:欧阳鹏[9] 年龄为:9
==============================
名字为:欧阳鹏 Arrays[11] 年龄为:11
名字为:欧阳鹏 Arrays[12] 年龄为:12
名字为:欧阳鹏 Arrays[13] 年龄为:13
名字为:欧阳鹏 Arrays[14] 年龄为:14
名字为:欧阳鹏 Arrays[15] 年龄为:15
名字为:欧阳鹏 Arrays[16] 年龄为:16
名字为:欧阳鹏 Arrays[17] 年龄为:17
名字为:欧阳鹏 Arrays[18] 年龄为:18
名字为:欧阳鹏 Arrays[19] 年龄为:19
==============================
名字为:欧阳鹏 List[21] 年龄为:21
名字为:欧阳鹏 List[22] 年龄为:22
名字为:欧阳鹏 List[23] 年龄为:23
名字为:欧阳鹏 List[24] 年龄为:24
名字为:欧阳鹏 List[25] 年龄为:25
名字为:欧阳鹏 List[26] 年龄为:26
名字为:欧阳鹏 List[27] 年龄为:27
名字为:欧阳鹏 List[28] 年龄为:28
名字为:欧阳鹏 List[29] 年龄为:29
==================================================================================================
作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:http://blog.csdn.net/ouyang_peng
==================================================================================================
判断ObjectInputStream是否读到文件末尾,文件长度未知
判断ObjectInputStream是否读到文件末尾,文件长度未知
判断ObjectInputStream是否读到文件末尾,文件长度未知
我的Java开发学习之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法的更多相关文章
- 我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法
本文参考: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html http://www.blogjava.net/ ...
- 我的Java开发学习之旅------>工具类:将播放器的进度值转换成相应的时间格式
在我的博客<我的Java开发学习之旅------>Java 格式化类(java.util.Formatter)基本用法,地址:http://blog.csdn.net/ouyang_pen ...
- 我的Java开发学习之旅------>在Dos环境下Java内部类的编译和运行
习惯了在IDE工具上进行代码编写,连最基本的Javac命令和Java命令都忘记的差不多了,今天对一个Java内部类进行编译和运行的时候,就出糗了.IDE是把双刃剑,它可以什么都帮你做了,你只要敲几行代 ...
- 我的Java开发学习之旅------>Java NIO 报java.nio.charset.MalformedInputException: Input length = 1异常
今天在使用Java NIO的Channel和Buffer进行文件操作时候,报了java.nio.charset.MalformedInputException: Input length = 1异常, ...
- 我的Java开发学习之旅------>Java语言中方法的参数传递机制
实参:如果声明方法时包含来了形参声明,则调用方法时必须给这些形参指定参数值,调用方法时传给形参的参数值也被称为实参. Java的实参值是如何传入方法?这是由Java方法的参数传递机制来控制的,Java ...
- 我的Java开发学习之旅------>工具类:Java获取字符串和文件进行MD5值
ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示"上传成功"!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象.百度了一 ...
- 我的Java开发学习之旅------>工具类:Java使用正则表达式分离出字符串中的中文和英文
今天看到一个工具类使用正则表达式将一大段字符串中的中文和英文都分离出来了,在此记录一下,读者可以收藏! import java.util.ArrayList; import java.util.Col ...
- 我的Java开发学习之旅------>Base64的编码思想以及Java实现
Base64是一种用64个字符来表示随意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,由于二进制文件包括非常多无法显示和打印的字符.所以,假设要让记事本这种 ...
- 我的Java开发学习之旅------>Java利用Comparator接口对多个排序条件进行处理
一需求 二实现Comparator接口 三验证排序结果 验证第一条件首先按级别排序级别最高的排在前面 验证第二条如果级别相等那么按工资排序工资高的排在前面 验证第三条如果工资相当则按入职年数排序入职时 ...
随机推荐
- 【转】彻底弄懂Java中的equals()方法以及与"=="的区别
彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...
- Apache/Nginx为PHP设置、添加$_SERVER服务器环境变量
在PHP开发中为了区分线上生产环境还是本地开发环境, 如果我们能通过判断$_SERVER['RUNTIME_ENVIROMENT']为 'DEV'还是'PRO'来区分该多好, 可惜的是$_SERVER ...
- vs2010下如何调试带输入参数的程序
当main函数的输入参数为空时,我们可以很方便的通过设置断点,单步运行的方法调试,可是如果需要调试的是有输入参数的程序该怎么办呢?最终还是让我找到了: 英文版:Project -> Proper ...
- Linux基础学习3
鸟哥私房菜第十一章 read 用来读取键盘输入的变量,常被用在shell script的交互当中 [root@www ~]# read [-pt] variable 选项不参数: -p :后面可以 ...
- 【spring boot logback】日志使用自定义的logback-spring.xml文件后,application.properties中关于日志的相关配置还会起作用么
本篇 将针对[日志使用自定义的logback-spring.xml文件后,application.properties中关于日志的相关配置还会起作用么]这一个主题进行探索. 这个测试项目是根据[spr ...
- CentOS6.5环境配置笔记
CentOS6.5环境配置笔记 一.概述 服务器系统重装,配置应用运行环境 CentOS6.5 x64 二.修改密码 重新设置登录密码 $passwd 或 $passwd root 三.配置端口号及防 ...
- js 输入框增加删除操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- MD5算法了解(JAVA实现)
MD5算法:尽管已经被破解,但任然广泛应用于各个领域中 如文件校验:当我们下载文件时为了保证文件的安全性,我们能够在其站点上找到相应的md5值进行校验,假设md5值不一致,也就是说文件被人动过(一般都 ...
- poj 3307 Smart Sister 打表解因子生成数问题
题意: 给i,求由仅以2,3,5,7为因子的数中第i个是多少. 分析: 打表. 代码: //poj 3307 //sep9 #include <iostream> using namesp ...
- (转)来自互联网巨头的46个用户体验面试问题(谷歌,亚马逊,facebook及微软)
原文出处: uxdesign - Eleonora Zucconi 译文出处:UXRen - 邓俊杰 如果你是个正在找工作的用户体验研究员,或是一个招聘经理正急需一些启发性问题来测试你的候选人,这 ...