我基本上创建了一个日记应用,每个日记条目都需要保留,我希望将所有条目保存在一个文件中。
我已经看过很多关于序列化单个对象的教程,所以我提出了这个解决方案,(它不起作用)但即使我设法修复它,这感觉就像一个草率的解决方案。
(这里我试图序列化一个arraylist,每次我保存一个条目,我都会对列表进行反序列化,并在再次序列化之前将新条目添加到列表中)
为了澄清,我的问题是:这是多次将对象保存到同一文件的好方法吗?
或者是否有人有关于我应该尝试的其他内容的一些提示,也欢迎关于此的视频或文档的链接。
public class Serializer
{
//Calls readFile and adds the returned entries to an ArrayList
//Add the target object to the list and write to the file
public static void writeToFile(Object target)
{
ArrayList entries = new ArrayList();
entries = readFile();
entries.add(target);
String filename = "entries.bin";
FileOutputStream fileOut = null;
ObjectOutputStream objOut = null;
try
{
fileOut = new FileOutputStream(filename);
objOut = new ObjectOutputStream(fileOut);
objOut.writeObject(entries);
objOut.close();
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
//Reads the file and returns all entries in a list
public static ArrayList readFile ()
{
ArrayList persistedEntries = new ArrayList<>();
String filename = "entries.bin";
FileInputStream fileIn = null;
ObjectInputStream objIn= null;
try
{
fileIn = new FileInputStream(filename);
objIn = new ObjectInputStream(fileIn);
persistedEntries = (ArrayList) objIn.readObject();
objIn.close();
}
catch(IOException ex)
{
ex.printStackTrace();
}
catch(ClassNotFoundException ex)
{
ex.printStackTrace();
}
return persistedEntries;
}
}
答案 0 :(得分:0)
这是多次将对象保存到同一文件的好方法吗?
我会争辩不。这是因为您的方法writeToFile
或更准确appendToFile
会在边缘情况下引入奇怪的行为(例如entries.bin
具有意外对象)。我会争辩这个:
使用writeToFile(ArrayList<Object> target)
覆盖指定数组的文件。然后添加一个方法appendToFile(Object target)
,用于处理从磁盘读取entries.bin
的过程,附加target
,然后将数组写入磁盘。这样做的好处是可以将与新对象target
“合并”的任何逻辑与磁盘上的文件以及写入entries.bin
文件的实际逻辑分开。
如果只是一次学习练习,我会选择以上内容。潜在resource
添加重新格式化的版本:
public class Serializer
{
private String filename;
// pass in "entries.bin"
public Serializer(String filename) {
this.filename = filename;
}
public void append(Object target) {
// readfile will return at least empty arraylist
ArrayList entries = readFile();
entries.add(target);
serialize(entries);
}
public void serialize(ArrayList entries)
{
FileOutputStream fileOut = null;
ObjectOutputStream objOut = null;
try
{
fileOut = new FileOutputStream(filename);
objOut = new ObjectOutputStream(fileOut);
objOut.writeObject(entries);
objOut.close();
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
//Reads the file and returns all entries in a list
public ArrayList deserialize ()
{
ArrayList persistedEntries = new ArrayList<>();
FileInputStream fileIn = null;
ObjectInputStream objIn = null;
try
{
fileIn = new FileInputStream(filename);
objIn = new ObjectInputStream(fileIn);
Object result = objIn.readObject();
if (!(result instanceof ArrayList)) {
// read object is not an arraylist
}
persistedEntries = (ArrayList) objIn.readObject();
objIn.close();
}
catch(IOException ex)
{
ex.printStackTrace();
}
catch(ClassNotFoundException ex)
{
ex.printStackTrace();
}
return persistedEntries;
}
}