如何删除Java中的序列化对象?

如何删除Java中的序列化对象?,java,file,oop,serialization,stream,Java,File,Oop,Serialization,Stream,为什么我在实现oos.close()方法时它能工作(我的意思是它会删除文件),否则就不行了 File newFile = new File("D:\\1.ser"); try { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(newFile)); oos.writeObject(new A());

为什么我在实现oos.close()方法时它能工作(我的意思是它会删除文件),否则就不行了

       File newFile = new File("D:\\1.ser");
        try {
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(newFile));
            oos.writeObject(new A());
            oos.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        if(newFile.delete()){
            System.out.println(newFile.getName() + " is deleted!");
        }else{
            System.out.println("Delete operation is failed.");
        }
无论何时创建资源,都必须关闭它。不这样做意味着各种各样的坏事发生:无法删除文件只是其中之一;另一个应用程序是,由于虚拟机的文件句柄用完,最终会硬崩溃

为此,请使用try with resources构造。所以,不要做你写的。相反:

File newFile = new File("D:\\1.ser");
try (FileOutputStream fos = new FileOutputStream(newFile);
     ObjectOutputStream oos = new ObjectOutputStream(fos)) {

    oos.writeObject(new A());
}
// oos and fos are neccessarily closed here...
// even if exceptions occurred. That's nice!
// thus.. delete will work here.

close()
释放文件句柄。文档是您的朋友您可以通过删除存储在其中的字节(文件、字节数组等)来删除序列化对象。似乎您已经知道答案:您必须关闭输出流。使用try with resources可以更好地做到这一点;关闭ObjectOutputStream将关闭其基础流。。。当然,除非OOS在施工期间死亡。诚然,这是非常罕见的,但把整个链放在试块中是更好的方式。您可以使用
var
来减少一些噪音。这种语法的存在是有原因的。