在文件中写入和读取对象

Posted

技术标签:

【中文标题】在文件中写入和读取对象【英文标题】:Write and read object to and from file 【发布时间】:2017-02-03 13:15:57 【问题描述】:

我想读取一个对象并将其写入文件。这是我的尝试:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

public class SaveOpen implements Serializable 

    private static String fileName;
    private ArrayList<Person> list = new ArrayList<Person>();

    public SaveOpen() 
        fileName = "file.txt";
    
    //Reader
    public static Object deserialize() throws IOException,
    ClassNotFoundException 
        FileInputStream fis = new FileInputStream(fileName);
        BufferedInputStream bis = new BufferedInputStream(fis);
        ObjectInputStream ois = new ObjectInputStream(bis);
        Object obj = ois.readObject();
        ois.close();
        return obj; 
    
    //Writer
    public static void serialize(Object obj)
            throws IOException 
        FileOutputStream fos = new FileOutputStream(fileName);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(obj);
        oos.close();
    
    public void setFileName(String fileName) 
        this.fileName = fileName;
    
    public ArrayList<Person> getListPersons() 
        return list;
    


但是,我不知道这是否是正确的方法,也不知道如何在类中实现它。该对象是Person,我想从文件中保存和读取该对象。是否应该对.txt 文件进行处理?有谁能把事情说清楚?谢谢!

【问题讨论】:

如果您使用流序列化对象,那么您写入的是二进制数据,而不是文本,因此您不应写入.txt 文件。 没有什么可以阻止您将其写入.txt 文件,但这表明内容是文本,但它们不是。 docs.oracle.com/javase/8/docs/technotes/guides/serialization 【参考方案1】:

如果您希望文件易于阅读,我建议将其保存为 xml。

例子:

对象类

import java.io.Serializable;

public class Person implements Serializable

     private String username;
     private int    id;

     public String UserName()  return username; 
     public void setUserName(String str)  username = str; 

     public int ID()  return id; 
     public void setID(int ID)  id = ID;     

-序列化器/反序列化器

import Settings.Person;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class XmlSerializer 

    //File path to serialize to and deserialize from
    private static final String SERIALIZED_FILE_NAME = "yourSavePath.xml";
    //Insert person object and save as xml file to chosen filepath
    public static void Serialize(Person person)
    
        try
        
            FileOutputStream    os = new FileOutputStream(SERIALIZED_FILE_NAME);
            XMLEncoder          encoder = new XMLEncoder(os);
                                encoder.writeObject(person);
                                encoder.close();
        
        catch(FileNotFoundException ex)
        
            System.out.println(ex.getMessage());
        
    
    //Deserialize xml file into person object
    public static Person Deserialize()
    
        try
        
            FileInputStream os = new FileInputStream(SERIALIZED_FILE_NAME);
            XMLDecoder decoder = new XMLDecoder(os);
            Person p = (Person)decoder.readObject();
            decoder.close();
            return p;
        
        catch(FileNotFoundException ex)
        
            System.out.println(ex.getMessage());
        
        return null;
    
  

【讨论】:

【参考方案2】:

你已经做对了。您可以在 txt 文件中保护对象,尽管这没有多大意义,我宁愿使用二进制文件。

要将多个对象存储在一个文件中,只需将它们打包到一个集合中,然后序列化该集合对象。

从文件中读取对象时,通过 instanceof 检查其类并将其强制转换为任何类型。

【讨论】:

以上是关于在文件中写入和读取对象的主要内容,如果未能解决你的问题,请参考以下文章

使用可序列化而不是向/从文件写入和读取对象

在文件中写入和读取对象

C语言复习之直接向文件中写入和读取时间Date对象

python读取写入文件方法SringIO,BytesIO

为什么数据没有在此文件中正确写入/读取?

在 C++ 中写入/读取文件