[英]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.