java出现异常Exception in thread "main" java.io.EOFException
publicstaticvoidmain(Stringargs[])throwsException{Filef=newFile("d:"+File.separator+"...
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
RandomAccessFile rdf=new RandomAccessFile(f,"rw");
School sch = new School("西南大学");
Student2 s1=new Student2("zhangsa",30);
Student2 S2=new Student2("mnc",30);
sch.getAllStudents().add(s1);
sch.getAllStudents().add(S2);
Iterator<Student2> iter=sch.getAllStudents().iterator();
ObjectOutputStream oos= null ;
oos = new ObjectOutputStream(new FileOutputStream(f)) ;
while(iter.hasNext()){
Student2 a5=iter.next();
oos.writeObject(a5) ;
}
Object obj = null ; // 接收读取的内容
ObjectInputStream ois =null;
try{
ois = new ObjectInputStream(new FileInputStream(f)) ; // 实例化对象输入流
obj = ois.readObject(); //循环下面的数据
System.out.println(obj);
while(obj!=null){
obj = ois.readObject(); //循环下面的数据
System.out.println(obj);
}
}catch(Exception e){
throw e ;
}finally{
if(ois!=null){
ois.close() ; // 关闭
}
}
} 展开
File f=new File("d:"+File.separator+"test2.txt");
RandomAccessFile rdf=new RandomAccessFile(f,"rw");
School sch = new School("西南大学");
Student2 s1=new Student2("zhangsa",30);
Student2 S2=new Student2("mnc",30);
sch.getAllStudents().add(s1);
sch.getAllStudents().add(S2);
Iterator<Student2> iter=sch.getAllStudents().iterator();
ObjectOutputStream oos= null ;
oos = new ObjectOutputStream(new FileOutputStream(f)) ;
while(iter.hasNext()){
Student2 a5=iter.next();
oos.writeObject(a5) ;
}
Object obj = null ; // 接收读取的内容
ObjectInputStream ois =null;
try{
ois = new ObjectInputStream(new FileInputStream(f)) ; // 实例化对象输入流
obj = ois.readObject(); //循环下面的数据
System.out.println(obj);
while(obj!=null){
obj = ois.readObject(); //循环下面的数据
System.out.println(obj);
}
}catch(Exception e){
throw e ;
}finally{
if(ois!=null){
ois.close() ; // 关闭
}
}
} 展开
4个回答
展开全部
/*
本人也在学习java,关于这个问题查了半天资料,大概了解了怎么回事。整理一下思路,如下:
ObjectInputStream和ObjectOutputStream类可以对对象进行读取操作,ObjectOutputStream要求写入的对象必须实现Serialiable接口(可序列化),而ObjectInputStream对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。写入就不说了,在读取的时候使用readObject()方法。
方法签名:public final Object readObject()throws IOException,ClassNotFoundException 描述:当 InputStream 中出现问题或者遇到不应反序列化的类时,将抛出异常。所有异常对于 InputStream 而言都是致命的,将使其处于不确定状态;是忽略还是恢复流状态取决于调用者。抛出ClassNotFoundException,InvalidClassException,StreamCorruptedException,OptionalDataException和IOExcepiton(更具体的可以查看api文档),那EOFExcepiton从哪里来的呢,找了下源码,readObject--》readObject0--》peekByte,顺便摘一下带代码:(这里说的是EOFException,不关心可以直接跳过)*/
byte peekByte() throws IOException {
int val = peek();
if (val < 0) {
throw new EOFException();
}
return (byte) val;
}
/*
程序到此抛出了到达文件末尾异常(EOFException),也就是说流已经达到末尾了,而你试图继续进行readObject操作。在本题中就是while(obj!=null),readObject方法的返回值是object,当并没有说明达到结尾时的返回值是null(也就是说不能以obj!=null来判断后续是否还有对象),那该怎么办呢?
最初,想到了本类中的available()方法,即用while(dis.available()>0)来作为条件,结果一样报EOFException,测试后才发现dis.available()方法的返回值始终为0,原来对于用ObjectOutputStream写入的文件就是如此,(available()方法中也有说明:Returns the number of bytes that can be read without blocking.注意要without blocking)。那怎么办?上网查了查了下资料,有三种方法可以解决这个问题:
1,使用容器类来存储对象,如List,StringBuffered等,一次写入和读取,添加修改对象通过容器类。
2,在文件中写入个额外的变量,如int length 用于记录存了多少个对象进入,通过while(length>0)进行判断,但是在对文件中的对象进行增删操作时要同时修改length。
3,通过捕获EOFExceptin来判断已经达到了文件的末尾(思路很巧妙)。
以下是你的代码,只有while()处有点改动,后面还添了个catch(EOFException e)块,其他都没变(类School和Student2是我自己根据你的代码添加了,可能和你的不一样)。运行结果:
Student2 [name=zhangsa, id=30]
Student2 [name=mnc, id=30]
已经达到文件末尾
*/
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.RandomAccessFile;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
class School{
private String name;
public List<Student2> list;
public School(String name) {
this.name = name;
}
public List<Student2> getAllStudents() {
if(list == null)
list = new ArrayList<Student2>();
return list;
}
}
class Student2 implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
private int id;
public Student2(String name, int id) {
this.name = name;
this.id = id;
}
@Override
public String toString() {
return "Student2 [name=" + name + ", id=" + id + "]";
}
}
public class Test01 {
public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
// RandomAccessFile rdf=new RandomAccessFile(f,"rw");
School sch = new School("西南大学");
Student2 s1=new Student2("zhangsa",30);
Student2 s2=new Student2("mnc",30);
sch.getAllStudents().add(s1);
sch.getAllStudents().add(s2);
Iterator<Student2> iter=sch.getAllStudents().iterator();
ObjectOutputStream oos= null ;
oos = new ObjectOutputStream(new FileOutputStream(f)) ;
while(iter.hasNext())
{
Student2 a5=iter.next();
oos.writeObject(a5) ;
}
Object obj = null ; // 接收读取的内容
ObjectInputStream ois =null;
try{
ois = new ObjectInputStream(new FileInputStream(f)) ; // 实例化对象输入流
while(true)//直接用while(true),让读取操作一直进行
{
obj = ois.readObject(); //循环下面的数据
System.out.println(obj);
}
}catch(EOFException e){ //此处捕获EOFException
System.out.println("已经达到文件末尾");
}catch(IOException e){
e.printStackTrace();
}
finally{
if(ois!=null)
{
ois.close() ; // 关闭
}
if(oos!=null)
oos.close();
}
}
}
展开全部
内部类BlockDataInputStream.的方法peekByte抛出的异常,意思就是到达了文件的末尾,程序却没有正常结束读取文件内容,你可以单步调试一下看看到达文件末尾之后程序为什么没有停下来
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询