为何写入对象不能正确显示,运行时出 现Exception in thread "main" java.io.EOFException。程序如下

junzhangdemingzi 2009-05-19 04:24:11
import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


public class ass {
private record rd;
ObjectOutputStream output;
ObjectInputStream input;
/**
* @param args
* @throws IOException
* @throws FileNotFoundException
public ass()
* {
* }
*/
public ass()
{try{
rd=new record();
output=new ObjectOutputStream(new FileOutputStream("e:\\file.txt"));
input=new ObjectInputStream(new FileInputStream("e:\\file.txt"));}
catch(Exception er){}
}
public void setrecord()
{rd.setaccount(200);
rd.setname("nihao");
rd.setpayment(20);
rd.setprice(30);}
public void write(record rd)throws Exception
{output.writeObject(rd);output.close();
}
public record read()throws Exception
{record d=(record)input.readObject();
input.close();
return d;}

public static void main(String[] args) throws Exception
{ass d=new ass();
d.setrecord();
System.out.println(d.read());

}
private class record implements Serializable
{private int account;
private String name;
private float price;
private float payment;
public record()
{}
public record(int account,String name,float price,float payment)
{this.account=account;
this.name=name;
this.payment=payment;
this.price=price;

}
public void setaccount(int acc)
{account=acc;}
public int getaccount()
{return account;}

public void setname(String na)
{name=na;}
public String getname()
{return name;}

public void setprice(float pri)
{price=pri;}
public float getprice()
{return price;}

public void setpayment(float pay)
{payment=pay;}
public float getpayment()
{return payment;}

}
// 销售记录类结束


}
运行后抛出异常如下

Exception in thread "main" java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2502)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1267)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at ass.read(ass.java:38)
at ass.main(ass.java:44)

...全文
554 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
junzhangdemingzi 2009-05-19
  • 打赏
  • 举报
回复
谢谢,谢谢各位,真的可以了。真是:听君一席话,胜读十年书
铁匠梁老师 2009-05-19
  • 打赏
  • 举报
回复

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class ass{

private static record rd;
ObjectOutputStream output;
ObjectInputStream input;


public ass() {
}

//设置记录的属性值
public void setrecord() {
rd = new record();
rd.setaccount(200);
rd.setname("nihao");
rd.setpayment(20);
rd.setprice(30);
}

//写入文件
public void write(record rd) throws Exception {
output=new ObjectOutputStream(new FileOutputStream("e:\\file.txt"));
output.writeObject(rd);
output.flush();
output.close();
}

//从文件中读取出来
public record read() throws Exception {
input=new ObjectInputStream(new FileInputStream("e:\\file.txt"));
record d = (record) input.readObject();
input.close();
System.out.println(d.getname());
System.out.println(d.getprice());
System.out.println(d.getaccount());
System.out.println(d.getpayment());
return d;
}

public static void main(String[] args) throws Exception {
//流程先要理清:先生成文件,然后再去文件读取出来。
ass d = new ass();
d.setrecord();
d.write(rd);
d.read();
}
}

/**
*
* 对象实体不能是内部类
* @author foolishdault
*
*/
class record implements Serializable {

private static final long serialVersionUID = 3L;//序列化值,写文件或者网络传输都必须设置这个值

private int account;
private String name;
private float price;
private float payment;

public record() {
}

public record(int account, String name, float price, float payment) {
this.account = account;
this.name = name;
this.payment = payment;
this.price = price;

}

public void setaccount(int acc) {
account = acc;
}

public int getaccount() {
return account;
}

public void setname(String na) {
name = na;
}

public String getname() {
return name;
}

public void setprice(float pri) {
price = pri;
}

public float getprice() {
return price;
}

public void setpayment(float pay) {
payment = pay;
}

public float getpayment() {
return payment;
}
}
chosen0ne 2009-05-19
  • 打赏
  • 举报
回复
哦!下午时没仔细看。
1.你没有调用write()方法,所以没有写入文件,则调用read()时文件为空,所以返回EOFException。
2.将类序列化时,该类不能是内部类,所以需要把record放到ass类外面。

import java.io.*;
import java.io.Serializable;


public class ass {
private record rd;
ObjectOutputStream output;
ObjectInputStream input;

public ass()
{
try{
rd=new record();
output=new ObjectOutputStream(new FileOutputStream("e:\\file.txt"));
input=new ObjectInputStream(new FileInputStream("e:\\file.txt"));
}
catch(Exception er){
}
}
public void setrecord()
{
rd.setaccount(200);
rd.setname("nihao");
rd.setpayment(20);
rd.setprice(30);
write(rd);////调用write()
}
public void write(record rd)
{
try{
output.writeObject(rd);
output.flush();
output.close();
}
catch(Exception e){
e.printStackTrace();
}
}
public record read()
{
record d=null;
try{
d=(record)input.readObject();
input.close();
}
catch(Exception e){
e.printStackTrace();
}
return d;
}

public static void main(String[] args)
{
ass d=new ass();
d.setrecord();
System.out.println(d.read());

}


}

class record implements Serializable
{
private int account;
private String name;
private float price;
private float payment;
public record(){}
public record(int account,String name,float price,float payment)
{
this.account=account;
this.name=name;
this.payment=payment;
this.price=price;
}
public void setaccount(int acc)
{
account=acc;
}
public int getaccount()
{
return account;
}

public void setname(String na)
{
name=na;
}
public String getname()
{
return name;
}

public void setprice(float pri)
{
price=pri;
}
public float getprice()
{
return price;
}

public void setpayment(float pay)
{
payment=pay;
}
public float getpayment()
{
return payment;
}

}


junzhangdemingzi 2009-05-19
  • 打赏
  • 举报
回复
谢谢,但还是不行
chosen0ne 2009-05-19
  • 打赏
  • 举报
回复
ObjectOutputStream每次在写完对象时,需要flush()一下,因为只是将内容写到缓存中,flush之后写入文件。

public void write(record rd)throws Exception
{
output.writeObject(rd);
output.flush(); ///加上这句
output.close();
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧