繁体   English   中英

Object 输入和 output 在 Java

[英]Object Input and output in Java

我想将我的完整 LibraryDatabase object 保存在“DB.bin”中。 当我在 object 中添加新记录时,它添加成功,但是当我退出时。 然后重新启动程序然后它找不到任何记录。 虽然这些类已经序列化,但我不明白为什么它不起作用。 代码有什么问题吗? 如何解决?

数据.java:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */


import java.io.Serializable;

/**
 *
 * @author sohan
 */
public class Data implements Serializable{
/**
     * 
     */
    private static final long serialVersionUID = 1L;
String stu_name,stu_id, stu_cont,book_name,writter_name;

    public Data(String stu_name, String stu_id, String stu_cont, String book_name, String writter_name) {
        this.stu_name = stu_name;
        this.stu_id = stu_id;
        this.stu_cont = stu_cont;
        this.book_name = book_name;
        this.writter_name = writter_name;
    }

    public String getStu_name() {
        return stu_name;
    }

    public void setStu_name(String stu_name) {
        this.stu_name = stu_name;
    }

    public String getStu_id() {
        return stu_id;
    }

    public void setStu_id(String stu_id) {
        this.stu_id = stu_id;
    }

    public String getStu_cont() {
        return stu_cont;
    }

    public void setStu_cont(String stu_cont) {
        this.stu_cont = stu_cont;
    }

    public String getBook_name() {
        return book_name;
    }

    public void setBook_name(String book_name) {
        this.book_name = book_name;
    }

    public String getWritter_name() {
        return writter_name;
    }

    public void setWritter_name(String writter_name) {
        this.writter_name = writter_name;
    }

    @Override
    public String toString() {
        return "Student Name: " + stu_name + ", Student Id: " + stu_id + ", Student Contact: " + stu_cont + ", Book Name: " + book_name + ", Writter Name: " + writter_name;
    }

}

图书馆数据库.java:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

import java.io.Serializable;
import java.util.*;
/**
 *
 * @author sohan
 */
public class LibraryDatabase implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public static Data[] data_=new Data[100];
    /**
     * @param args the command line arguments
     */ 
    public static int lastindex()
    {
        for(int i=0;i<data_.length;i++)
        {
            if (data_[i]==null)
            {
                return i;
            }
        }
        return 0;
    }


    public static void AddData(String s_name,String s_id,String s_phone, String b_name, String w_name)
    {
        Data new_data= new Data(s_name,s_id,s_phone,b_name,w_name);
        data_[lastindex()]=new_data;

    }

    public static void view_data()
    {
        for (int i = 0; i < data_.length; i++) 
        {
            if(data_[i]!=null)
            System.out.println(data_[i].toString());
            else {
                break;
            }
        }

    }

}

Demo.java:(主要方法在这里)

import java.io.*;
import java.util.*;


public class Demo {

   public static void main(String [] args) {
       FileInputStream fileIn=null;;
       ObjectInputStream in = null;
       Scanner scan = new Scanner(System.in);
      LibraryDatabase  e = null;
      try {
         fileIn = new FileInputStream("DB.bin");
         in = new ObjectInputStream(fileIn);
         e = (LibraryDatabase) in.readObject();
         in.close();
         fileIn.close();
        } catch (Exception en) {
          System.out.println("Not Found");
          e=new LibraryDatabase();
        }

      while (true)
      {
          int n;
          System.out.println("1.Add Data");
          System.out.println("2.View Data");
          System.out.println("3.Exit");
          n=scan.nextInt();
          if(n==1)
          {
              String stu_name,stu_id, stu_cont,book_name,writter_name;
              stu_name=scan.next();
              stu_id=scan.next();
              stu_cont= scan.next();
              book_name=scan.next();
              writter_name=scan.next();
              e.AddData(stu_name,stu_id, stu_cont,book_name,writter_name);
          }
          if(n==2)
          {
              e.view_data();
          }
          if(n==3)
          {
              try {
                     FileOutputStream fileOut =
                     new FileOutputStream("DB.bin");
                     ObjectOutputStream out = new ObjectOutputStream(fileOut);
                     out.writeObject(e);
                     out.flush();
                     out.close();
                     fileOut.close();
                     System.out.printf("Serialized data is saved in DB.bin");
                  } catch (IOException i) {
                     i.printStackTrace();
                  }
              System.exit(0);
          }
      } 
   }            
}

您在 LibraryDatabase object 中的字段是 static。 static things exist separate from the class (consider them at the same level as classes themselves. They have to be in a class, but only because in java classes are also namespaces). 因此,就序列化而言,您的 LibraryDatabase object 没有实际字段。

使 em 非静态,将解决您的问题。 这段代码还有很多其他问题,但这就是为什么你会看到你所看到的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM