Как заставить ObjectInputStream читать все объекты из файла в java? - PullRequest
0 голосов
/ 13 июля 2020

У меня есть файл, в котором хранятся объекты, и метод *getAll(), который должен возвращать List<Secretary>. Но я вижу только один объект, который печатается в консоли. Я искал проблему и попробовал 3 способа , но это не сработало.

Метод вставки для вставки объекта в файл:

@Override
    public Secretary insert(Secretary t) {
        try { 
            System.out.println("insert called");
        FileOutputStream file = new FileOutputStream 
                                           (filename,true); 
        
            ObjectOutputStream out = new ObjectOutputStream 
                                           (file); 
  
             Method for serialization of object 
            out.writeObject(t); 
  
            out.close(); 
            file.close(); 
  
            return t;       
        } 
  
       catch (IOException ex) { 
            ex.printStackTrace();
        } 
  
        return null;
    }

Я объявил добавление в этом режиме мой файл заменялся новым объектом при сохранении.

Итак, мне нужно получить весь объект из файла и назначить его в список. Я пробовал:

public class SecretaryDaoImpl implements SecretaryDAO{

    private  String filename = "secretary.txt";
    private Secretary sec=null;
    @Override
        public List<Secretary> getAll() {
    //Method 1  
            
     try { 
     
                Reading the object from a file 
               FileInputStream file = new FileInputStream 
                                            (filename); 
               ObjectInputStream in = new ObjectInputStream 
                                            (file); 
                List<Secretary> secList=new ArrayList<>();
                 Method for deserialization of object 
               secList.add((Secretary)in.readObject()); 
      
               in.close(); 
                file.close(); 
              System.out.println("Object has been deserialized\n"
                                    + "Data after Deserialization."); 
                 
           System.out.println("secList is" +secList);
              return secList;
               
            } 
     
            catch (IOException ex) { 
                System.out.println("Secreatary file not found");
                return null;
            } 
      
            catch (ClassNotFoundException ex) { 
               System.out.println("ClassNotFoundException" + 
                                    " is caught"); 
           } 
             return null;
    
    //Method 2  
              List<Secretary> secList=new ArrayList<>();
            ObjectInputStream objectinputstream = null;
            try {
        FileInputStream streamIn = new FileInputStream(filename);
        objectinputstream = new ObjectInputStream(streamIn);
        List<Secretary> readCase = (List<Secretary>) objectinputstream.readObject();
        for(Secretary s:readCase){
            secList.add(s);
        }
        System.out.println("seclist is" + secList);
        return secList;
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if(objectinputstream != null){
            try {
                objectinputstream.close();
            } catch (IOException ex) {
                Logger.getLogger(SecretaryDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
            }
        } 
    }
    //Method 3
            try{
             File file = new File(filename);
            List<Secretary> list = new ArrayList<>();
            if (file.exists()) {
                try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
                    list.add((Secretary) ois.readObject());
                }
            }
                System.out.println("getall is"+list);
            }
            catch(Exception e){
                
            }
            return null;
        }
}

Я закомментировал свой код, но здесь, при публикации в stackoverflow, я раскомментировал все коды. Мой секретарь. java это:

package com.npsc.entity;

import java.io.Serializable;

/**
 *
 * @author Ashwin
 */
public class Secretary implements Serializable {
     
    private static final long serialVersionUID = 6529685098267757690L;
    private int id;
    private String userName;
    private String password;
    private Branch branch;

    public String getUserName() {
        return userName;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    
    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Secretary(String userName, String password) {
        this.userName = userName;
        this.password = password;
        
    }

    public Branch getBranch() {
        return branch;
    }

    public void setBranch(Branch branch) {
        this.branch = branch;
    }

    @Override
    public String toString() {
        return "Secretary{" + "id=" + id + ", userName=" + userName + ", password=" + password + ", branch=" + branch + '}';
    }
    
    
    
}

При выполнении операции вставки мои объекты сохранения txt-файла: введите описание изображения здесь

Но я не могу прочитать все объекты и добавить их в список. Где я столкнулся с проблемой?

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вам нужно будет сохранить в файле количество объектов-секретарей для чтения. Затем вы можете определить, сколько объектов читать, и, таким образом, повторно заполнить свой список.

Что-то вроде:

List<Secretary> list;
private void persistList(ObjectOutputStream out) {
   out.writeInt(list.size());
   for (Secretary sec : list) {
      out.writeObject(sec);
   }
}

А затем прочитать:

private List<Secretary> readFromStream(ObjectInputStream in) {
   int numObjects = in.readInt();
   List<Secretary> result = new ArrayList<>(numObjects);
   for (int i = 0; i < numObjects; i++) {
      result.add((Secretary)in.readObject());
   }
   return result;
}

Это просто набросок техники (и игнорирует обработку ошибок, открытие / закрытие потока и т. д. c.); главное, интегрировать идею записи размера списка, а затем чтения такого количества секретарей в ваш существующий код.

0 голосов
/ 13 июля 2020

Запишите List<Secretary> в файл и прочтите то же самое, тогда у вас будет все.

write (Secretary s) {
 read List<Secretary> currentList ;
 currentList.add(s)
 write List<Secretary> 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...