2017-02-03 47 views
1

我想讀取和寫入一個文件的對象。這是我的嘗試:在文件中寫入和讀取對象

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文件?任何人可以清理的東西?謝謝!

+1

如果你使用流序列化一個對象,那麼你正在編寫二進制數據,而不是文本,所以你不應該寫入'.txt'文件。 – khelwood

+0

沒有什麼能夠阻止你將它寫入'.txt'文件,但是這表明內容是文本,而不是。 – Kayaman

+0

https://docs.oracle.com/javase/8/docs/technotes/guides/serialization/ <=有一些可用的例子。 – Fildor

回答

0

如果你想要文件是人類可讀的,我會建議把它保存爲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; }  
    } 
    

-Serializer /解串器

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; 
    } 
    } 
0

你這樣做是正確的了。你可以在txt文件中安全地使用對象,儘管它沒有多大意義,但我寧願使用二進制文件。

要將多個對象存儲在單個文件中,只需將它們打包到一個集合中,然後序列化該集合對象。

從文件中讀取對象時,通過instanceof檢查其類,並將其轉換爲任何內容。