Java 如何使用垃圾收集删除文件?

Java 如何使用垃圾收集删除文件?,java,temporary-files,garbage-collection,Java,Temporary Files,Garbage Collection,嗨,我在java中使用了很多临时文件,我的问题是它们不会被删除 在不必实施我自己的临时文件管理的情况下(我承认这并不难,但我很懒,如果我能省去重新发明轮子,那么我还有很多事情要做),有没有一种方法可以确保磁盘上的临时文件能够以相当规律的方式被删除 1-使用文件tmp=File.createTempFile(),我当然可以说tmp.deleteOnExit(),但如果该东西在服务中运行,它退出的唯一方式是崩溃(很少发生),或者系统崩溃(例如驱动器中完全充满临时文件并推翻群集…哎呀!) 理想情况下,

嗨,我在java中使用了很多临时文件,我的问题是它们不会被删除

在不必实施我自己的临时文件管理的情况下(我承认这并不难,但我很懒,如果我能省去重新发明轮子,那么我还有很多事情要做),有没有一种方法可以确保磁盘上的临时文件能够以相当规律的方式被删除

1-使用文件tmp=File.createTempFile(),我当然可以说tmp.deleteOnExit(),但如果该东西在服务中运行,它退出的唯一方式是崩溃(很少发生),或者系统崩溃(例如驱动器中完全充满临时文件并推翻群集…哎呀!)

理想情况下,垃圾收集器会在某个时候收集创建的实例,由于应用程序中存在大量空闲时间,因此如果GC能够完成清理,并在从内存中取消引用实例时实际删除磁盘上的文件,那就太好了

目前我看到的唯一方法是重载File类并添加一个最终确定的方法。。。如果我这样做的话,不妨使用我自己的临时文件管理器

长话短说,我可以使用垃圾收集器清理系统资源(ie文件)吗?


谢谢大家的回答。我接受了Christoffee,因为它是最简单的实现方法,也是我最终所做的


我想在这么多年的时间里被清理了,我忘记了基本的家务,我在C++的好日子里做的很辛苦。

< p>你可能想看:

幻象引用对象,在收集器确定其引用对象可能被回收后排队。幻象引用最常用于以比Java终结机制更灵活的方式安排死前清理操作


当你的类被销毁时,依靠一个事件来触发并不是万无一失的,而且可能会留下文件

我认为实现临时文件清理的最简单、最可靠的方法如下:

  • 为程序关闭时编写事件处理程序,以清理当前会话期间打开的所有文件
  • 编写一个程序,该程序将在程序启动时运行,删除此文件夹中任何超过24小时的临时文件

使用这种方法,您不必担心程序因某种原因崩溃并留下临时文件,也不必担心程序删除仍在使用的文件。

垃圾收集对于这种类型的信息处理是错误的命名空间

以下几点足以处理临时文件

  • 您应该尝试在不再使用该文件后直接删除该文件。finalize块可以处理这个问题

  • DeleteOnExit应该使用

  • 您可以在特殊的临时目录中创建临时文件。启动和关闭应用程序时可以删除此临时目录,以确保在关闭应用程序后不存在任何临时文件


  • 您可以为一个文件制作一个包装器,当对象被垃圾收集时,它使用一个来删除您的文件


    但是终结器不会以任何可预测的方式被调用,所以我真的不建议这样做。

    垃圾收集器不是一个释放这种资源的地方。请参阅下面两篇关于如何在Java中发布资源的文章 还有Java终结器的性能问题。他们可能会对如何使用它给出一些见解和理解。
    当然可以。问题是你是否真的想:)

    我在野外确实遇到过这个问题;正如您所注意到的,在运行服务而不是应用程序时,使用deleteOnExit()清理临时文件是无用的。我发现最稳定的解决方案是重新构造程序流,以便在每个任务的基础上创建临时文件,并在不再需要时显式删除


    如果以其他方式执行,即如果程序无法确定在执行过程中的任何时候是否应保留或丢弃临时文件,则可能存在设计问题。将文件包装在某些manager工具中只会推迟“真正的”解决方案;)

    垃圾收集器对于此类事情没有用处。它是为内存管理而设计的,可能有许多缺点

    • 文件不再使用后,可能会在很长时间内收集对象
    • 您的对象根本不能保证被收集
    这两种情况都会发生,尤其是当Java以大堆大小启动时——这在服务器端并不少见


    在程序中的某个时刻,您必须关闭该文件上的流(否则您将耗尽系统文件句柄,这将使系统无法使用,我已经这样做了)。在关闭流时,还可以删除关联的文件。这是最干净的方法。

    我想你把术语弄糊涂了。垃圾回收器用于内存,而不是文件。更不用说,如果您希望在应用程序退出时运行此程序,您必须在其中放入一些手动操作,因为垃圾回收不会在退出/崩溃时运行(此时内存由操作系统取消分配,而不是由框架取消分配)Java没有析构函数,因此不能将删除与收集的对象相关联。我知道垃圾收集器是什么,我想知道我是否可以扩展它的影响范围,并删除磁盘上的实际文件以及内存实例,毕竟它是一个临时文件…@lhahne:臭名昭著的“finalize()”不是Java中几乎等同于析构函数吗?1-finalize要有用,必须在GC声明的类上,因此在这种情况下,我必须重写