Объект ввода и вывода в Java - PullRequest
0 голосов
/ 26 мая 2020

Я хочу сохранить мой объект Full LibraryDatabase в «DB.bin». Когда я добавляю новую запись в свой объект, она добавляется успешно, но когда я выхожу из нее. Затем перезапустите программу, и она не может найти никаких записей. Хотя эти классы уже сериализованы, но я не могу понять, почему это не работает. В коде что-то не так? Как это исправить?

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

}

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

    }

}

Демо. 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);
          }
      } 
   }            
}

1 Ответ

1 голос
/ 26 мая 2020

Ваши поля в объекте LibraryDatabase имеют статус c. stati c вещи существуют отдельно от класса (рассматривайте их на том же уровне, что и сами классы. Они должны быть в классе, но только потому, что в java классы также являются пространствами имен). Таким образом, ваш объект LibraryDatabase не имеет фактических полей в отношении сериализации.

Сделать их нестандартными c, устранит вашу проблему. С этим кодом еще много чего не так, но именно поэтому вы видите то, что видите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...