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)

解决方案 »

  1.   

    ObjectOutputStream每次在写完对象时,需要flush()一下,因为只是将内容写到缓存中,flush之后写入文件。public void write(record rd)throws Exception 
    {
        output.writeObject(rd);
        output.flush(); ///加上这句
        output.close(); 
      

  2.   

    哦!下午时没仔细看。
    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;
    } } 
      

  3.   


    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;
    }
    }