Exception in thread "main" java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2681)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3156)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:862)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:358)
at grammar2.G10ObjectStream.main(G10ObjectStream.java:24)
今天写了如下一段代码,却产生了java.io.EOFException错误
解决方案就是在写出流flush()之后再new ObjectInputStream(),大概是因为new的时候文件虽然创建了,但是里面是空的
灵感来自https://coderanch.com/t/522094/java/java-io-EOFException-readObject
后来大致看了源码,new 的时候调用了readStreamHeader()方法
然后readStreamHeader()方法会去读取两个short,也就是所谓的标识符
最后,readShort()方法调用的readFull()方法读不到数据,count<0所以抛出了异常
package grammar2;
import java.io.*;
import java.util.Objects;
/**
* @Deacription TODO
* @Author BarryLee
* @Date 2019/10/20 20:34
*/
public class G10ObjectStream {
/**
* 测试对象流
* ObjectInputStream, ObjectOutputStream
* 方法:readObject, writeObject
* 注意:实现了Serializable接口的类才可以序列化
* 区分序列化和反序列化
* transient修饰的属性不可序列化
*
* Demo: 将对象写出到文件,然后读进来
*/
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("e:/test/testObjectStream.bl")));
ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(new FileInputStream("e:/test/testObjectStream.bl")));
out.writeObject(new G10Person(1001, "老干妈", "123123", 9090.99));
out.writeObject(new G10Person(1002, "小姨妈", "321321", 5090.99));
out.flush();
G10Person person1 = (G10Person) in.readObject();
G10Person person2 = (G10Person) in.readObject();
System.out.println(person1);
System.out.println(person2);
out.close();
in.close();
}
}
class G10Person implements Serializable {
private Integer id;
private String name;
private transient String password;
private Double salary;
public G10Person() {
}
public G10Person(Integer id, String name, String password, Double salary) {
this.id = id;
this.name = name;
this.password = password;
this.salary = salary;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "G10Person{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", salary=" + salary +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
G10Person g10Person = (G10Person) o;
return Objects.equals(id, g10Person.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}