java - File.delete() 返回 false

标签 java logging file-io log4j apache-commons-logging

我已经通过我的 java 编程创建了一个文件,并且正在使用 Apache Commons Logging API 记录一些数据,特别是 Log4j 实现。

完成日志记录后,我将对 Log 类的引用设置为 null。当我现在尝试删除我一直在记录的文件时,File.delete() 返回 false。

在调试期间(在调用 File.delete() 之前)从 Windows 资源管理器中删除文件,我收到通知“无法删除:正在被另一个程序使用”。

我的代码中没有打开文件的依赖项(所有流都已关闭)。唯一可以访问该文件的对象是 Log 对象,我在调用 File.delete() 之前将其设置为 null

无论如何我可以看到哪个特定对象持有对文件资源的引用? 除了将其设置为 null 之外,还有其他方法可以强制 Log 对象释放资源吗? 我可以强制删除文件吗?

最佳答案

仅仅将变量设置为 null 不会强制对象被垃圾回收。此外,它有可能在某种静态 map 中注册 - 您必须检查实现以确定。 (我认为某些版本使用弱引用,但其他版本不使用。)

您有什么理由必须立即删除该文件吗?您可能想尝试 File.deleteOnExit(),这可能有更好的机会删除文件 - 虽然这取决于具体的时间安排。 (此外,如果您重复调用 deleteOnExit,请注意 possible memory leak。)

您能否在应用程序完成后或可能在下次启动时删除该文件?

或者,您能否使用日志实现来滚动文件 - 尝试强制滚动,然后删除旧文件?

关于java - File.delete() 返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5401773/

相关文章:

java - 如何通过 MuleClient.send() 发送文件

java - 保存上传图像的最佳实践

java - 如何配置 Guice,使其注入(inject)到我想要的绑定(bind)类中?

logging - Kibana - 无法输出到日志文件

java - 如何将 sysout 和 syserr 重定向到 java 中的自定义记录器?

Java读取格式化文本文件并将其分割

java - 计算机代数系统的 GUI

Java/Spring : How to find what error opened the Resilence4J circuit breaker?

android - 读取文本文件并将其存储在数组中(Android 开发)

c++ - 将文本插入文件仅有效一次