Java:在写入之前检查对象文件中是否存在对象

时间:2017-09-30 10:37:17

标签: java file object serialization

我有一个名为" objects.txt"的文件。其中包含一些可序列化的对象。

我想在文件中写一些对象。

有没有办法在写入之前检查我想写入文件的对象是否已存在于文件中?即使对象已经存在于文件中也不会检查是否更好?

以下是将对象写入文件的示例:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

import javax.swing.JFrame;

public class WriteObjectsDemo {

    public static void main(String[] args)
    {
        try(FileOutputStream f = new FileOutputStream("objects.txt"))
        {
            ObjectOutputStream o = new ObjectOutputStream(f);
            // Write objects to file
            JFrame j = new JFrame();
            o.writeObject(j);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

    }

}

2 个答案:

答案 0 :(得分:2)

我会说答案是也许。它可能会推动序列化机制超出其舒适区域,但如果它能够起作用,它将会是这样的:

首先,使用FileInputStream中包含的ObjectInputStream读取文件一次,以确定文件是否已包含您的对象。完成后关闭流。

然后,如果您决定要编写对象,请打开文件以附加new FileOutputStream(file, true),将该流包装在ObjectOutputStream中并写下来。

P.S。:我建议您重新考虑文件名的.txt扩展名。序列化的对象数据绝对是文本。

答案 1 :(得分:0)

  

有没有办法在写入之前检查我想写入文件的对象是否已存在于文件中?

读取整个文件,对其中的每个对象进行反序列化,然后查看您要编写的对象是否已经存在。

效率不高,是吗?

所以有一个更好的方法:

  1. 当您的流程开始时,请将文件中的所有对象读入Set<>
  2. 在您进行处理时,请将对象添加到Set<>。由于Set<>仅允许任何对象的单个实例,因此将删除重复的对象。
  3. 当您完成处理后,从Set<>重写整个文件,将其中的每个对象序列化到文件中。
  4. 请注意,要实现此功能,您的对象需要正确覆盖equals()方法和hashCode()方法,以便等效对象与equals进行比较。请参阅Compare two objects with .equals() and == operator开始 - 并阅读接受的答案 - 所有。然后阅读链接。然后仔细思考equals()对你的对象意味着什么。然后在您的Java代码中实现工作equals()hashCode()方法。