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

问题描述:

我有一个名为“objects.txt”的文件,其中包含一些可序列化的对象。Java:在写入对象文件之前检查对象是否存在对象

我想写一些对象到文件。

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

下面是例子写对象的文件:

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(); 
     } 

    } 

} 
+0

序列化数据不是文本,不应保存在名为.txt的文件中。你也不应该连续化Swing对象:请参阅Javadoc。你只是在这里序列化一个对象,所以很难看到你的问题的重点。 – EJP

我想说的答案是也许。它可能会推动序列化机器超出其舒适区域,但如果它完全可以工作,它会像这样:

首先,使用包装在ObjectInputStream中的FileInputStream通过文件读一次,以确定无论该文件是否已经包含您的对象。完成后关闭流。

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

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

+0

“我想说的答案是*可能*,它可能会推动序列化机器超出其舒适区域”关于它没有“可能” - 这将工作得很好 - 尽管对于许多对象而言相当缓慢。最好不要推动序列化机器 - 这正是机器设计*所要做的。通过去除二进制文件的系统传输对象可能需要一个文本文件。为此,你可以''base64encode'序列化的流。 –

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

是的。

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

效率不是很高,是吗?

所以一个更好的办法:

  1. 当你的进程启动,读取文件中的所有对象为Set<>
  2. 在您处理时,将对象添加到该Set<>。由于Set<>只允许任何对象的单个实例,所以重复的对象将被丢弃。
  3. 完成处理后,重写整个文件Set<>,将其中的每个对象都序列化到文件中。

注意,要实现这一点,你的对象需要正确重写equals()方法和hashCode()方法,因此相当于比较对象,平等相待。请参阅Compare two objects with .equals() and == operator开始 - 和读取接受的答案 - 所有它。然后阅读链接。然后认真思考equals()对于您的物体意味着什么。然后在您的Java代码中执行equals()hashCode()方法工作