这是我的第一个档案
public class ObjectStream
{
public static void main(String args[]) throws FileNotFoundException, IOException
{
java.io.File f=new java.io.File("D:Employee.outt") ;
Employee e=new Employee("John");
Employee e1=new Employee("Mary");
Employee e2=new Employee("Christian");
OutputStream os=new java.io.FileOutputStream(f);
java.io.ObjectOutputStream oos= new ObjectOutputStream(os);
oos.writeObject(e);
oos.writeObject(e1);
oos.writeObject(e2);
}
}
这是我的第二个档案
public class Employee implements java.io.Serializable
{
private static int count=100;
private int eid;
private String ename;
public Employee()
{
count++;
this.eid=count;
}
public Employee(String ename)
{
this();
this.ename=ename;
}
public static int getCount() {
return count;
}
public static void setCount(int count) {
Employee.count = count;
}
public int getEid() {
return eid;
}
public void setEid(int eid) {
this.eid = eid;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
}
这是我的第三个档案
public class MainClass
{
public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException
{
File f=new File("D:Employee.outt");
byte data[]=new byte[(int)f.length()];
InputStream is=new java.io.FileInputStream(f);
java.io.ObjectInputStream ois=new java.io.ObjectInputStream(is);
Object o=ois.readObject();
while(o!=null)
{
Employee e=(Employee)o;
System.out.println(e.getEid());
System.out.println(e.getEname());
o=ois.readObject();
}
ois.close();
is.close();
}
}
我试图通过这个第三个文件读取存储在Employee.outt中的对象,但它正在读取所有对象,但最后抛出
线程“main”中的异常java.io.EOFException。
我不知道如何解决它。
答案 0 :(得分:2)
while(o!=null)
这不是读取ObjectInputStream.
的有效方法。readObject()
方法只有在写入null时才返回null。在流结束时,它抛出,猜测是什么,EOFException,
所以读取流的正确方法是循环调用`readObject()直到捕获该异常,然后断开并关闭流。
在文件末尾它给出了EOF异常
这正是EOFException
的含义。
答案 1 :(得分:1)
您应该在ObjectOutputStream
课程中关闭ObjectStream
。
oos.writeObject(e);
oos.writeObject(e1);
oos.writeObject(e2);
oos.close();
在 MainClass 中,您可以使用 try-finally 块来关闭输入流。
try
{
InputStream is=new java.io.FileInputStream(f);
java.io.ObjectInputStream ois=new java.io.ObjectInputStream(is);
// READ logic here
}
finally
{
ois.close();
is.close();
}
答案 2 :(得分:1)
您真的应该在“第一个文件”中刷新并关闭对象输出流。
您只需关闭“第三档”中的“ois”即可。另一个流会自动关闭。
如果您知道要编写多少个对象,请先更改“第一个文件”以写入后面的对象数,然后更改“第三个文件”以读取该数字并仅读取该对象。这样,你永远不会得到EOF异常,因为当你读完最后一个对象时你会停止阅读。
正如EJP指出的那样,你仍然需要捕获EOFException,因为你正在阅读的文件可能已经损坏。
在第一个文件中:
...
oos.writeInt(3);
oos.writeObject(e);
...
在第三档:
...
try {
int numObjects = ois.readInt();
for( int a = 0; a < numObjects; ++a ) {
...
}
} catch( EOFException e ) {
...
}