首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使ObjectInputStream从java文件中读取所有对象?

如何使ObjectInputStream从java文件中读取所有对象?
EN

Stack Overflow用户
提问于 2020-07-13 12:45:06
回答 2查看 326关注 0票数 0

我有一个存储对象的文件,还有一个*getAll()方法,它需要返回List<Secretary>。但是,我只看到控制台中打印单个对象。我搜索了这个问题,并尝试了3种方法--,但是它没有工作。

在文件中插入对象的插入方法是:

代码语言:javascript
复制
@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;
    }

我已经声明追加模式为真,因为我的文件在保存时被新对象所替换。

因此,我需要从文件中获取所有对象,并将其分配给一个列表。

代码语言:javascript
复制
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;
        }
}

我已经注释掉了我的代码,但是在这里,当我在堆栈溢出中发布时,我取消了对所有代码的注释。我的Secretary.java是:

代码语言:javascript
复制
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文件保存对象是:

但是,我无法读取所有的对象并添加我所面临的问题的list.Where?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-13 13:12:30

您将需要存储在文件中,将秘书对象的数量读取回去。然后,您可以确定要读取多少个实体,从而重新填充列表。

类似于:

代码语言:javascript
复制
List<Secretary> list;
private void persistList(ObjectOutputStream out) {
   out.writeInt(list.size());
   for (Secretary sec : list) {
      out.writeObject(sec);
   }
}

然后读到:

代码语言:javascript
复制
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;
}

这只是技术的一个草图(忽略错误处理、流打开/关闭等);主要是集成记录列表大小的概念,然后将许多秘书读入到您现有的代码中。

票数 1
EN

Stack Overflow用户

发布于 2020-07-13 12:54:42

编写一个List<Secretary>文件并读取相同的文件,然后您将拥有所有。

代码语言:javascript
复制
write (Secretary s) {
 read List<Secretary> currentList ;
 currentList.add(s)
 write List<Secretary> 
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62876146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档