我正在尝试创建一个系统,用户可以将一系列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() {}
}
我很欣赏有类似的问题,但由于我的知识有限,我很难理解所提供的答案。
如果有人对此提出了解决方案,或者某些指针值得高度赞赏。
答案 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)
您会看到FileOutputStream
构造函数有一个附加选项。