将对象附加到现有文件

时间:2014-05-16 01:19:35

标签: java serialization

我正在尝试创建一个系统,用户可以将一系列Message对象保存到.txt文件中,然后可以对消息的接收者进行反序列化和读取。但是每次我尝试写入文件时,我只是覆盖之前的对象。

我目前的代码如下:

public class Comms{
    Message msg;
    public void sendMessage(Message myMessage){
        msg = myMessage;

        //Generate Message ID       
        String msgID = "MSG" + genMsgID();
        myMessage.setMessageID(msgID);

        //********************************************************
        try
        {
            FileOutputStream logFile = new FileOutputStream("logFile.txt");
            NoHeaderObjectOutputStream out = new NoHeaderObjectOutputStream(logFile);
            out.writeObject(myMessage);
            out.close();
            logFile.close();
        }catch(IOException i)
        {
        }
    }
}

class NoHeaderObjectOutputStream extends ObjectOutputStream {
    public NoHeaderObjectOutputStream(OutputStream os) throws IOException {
        super(os);
    }
    protected void writeStreamHeader() {}
}

我很欣赏有类似的问题,但由于我的知识有限,我很难理解所提供的答案。

如果有人对此提出了解决方案,或者某些指针值得高度赞赏。

2 个答案:

答案 0 :(得分:1)

您可以将对象存储在可序列化的集合类型中。像许多List实现之一,如ArrayList。然后序列化集合。将集合反序列化为List,并根据需要添加和删除。

或者,您可以将每个对象存储在自己的文件中。

这是一个简单的例子:

package arg;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

public class Serialization {
    private static final String FILE_NAME = "test.dat";
    private static ArrayList<Name> names;

    public static void main(String[] args) {
        Serialization s = new Serialization();
        s.start();
    }

    private void start() {
        loadFile();
        promptForName();
    }


    private void promptForName() {
        String input = "";
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            while (!input.equals("Exit")) {
                System.out.println("Press 1 to enter new name.\r\nPress 2 to save.\r\nPress 3 to display.\r\nType Exit to exit.");
                input = br.readLine();
                if (input.equals("1")) {
                    System.out.println("Enter a name");
                    input = br.readLine();
                    Name n = new Name();                    
                    n.name = input;
                    names.add(n);
                }
                else if (input.equals("2")){
                    saveFile();
                }
                else if (input.equals("3")){
                    for (Name n : names) {
                        System.out.println(n.name);
                    }
                }               
            }
        } catch (IOException e) {
            e.printStackTrace();
        }       
    }

    private void saveFile() {
        File f = new File(FILE_NAME);
        f.delete();
        try {
            f.createNewFile();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f))){
            oos.writeObject(names);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @SuppressWarnings("unchecked")
    private void loadFile() {
        File f = new File(FILE_NAME);
        if (f.exists()) {
            try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f)))
            {
                names = (ArrayList<Name>) ois.readObject();
            } catch (IOException e) {
                f.delete();
                e.printStackTrace();
            } catch (ClassNotFoundException e) {                
                e.printStackTrace();
                f.delete();
            }
        }
        else
        {
            names = new ArrayList<Name>();
        }
    }

    private static class Name implements Serializable {
        public String name;
    }

}

编辑 - 您的代码排序在答案之后。如果这是用于记录目的,则应使用log4j或类似的现成日志记录API。

答案 1 :(得分:1)

查看http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html#FileOutputStream(java.lang.String,布尔值)

您会看到FileOutputStream构造函数有一个附加选项。