Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java File.delete()返回false_Java_Logging_File Io_Log4j_Apache Commons Logging - Fatal编程技术网

Java File.delete()返回false

Java File.delete()返回false,java,logging,file-io,log4j,apache-commons-logging,Java,Logging,File Io,Log4j,Apache Commons Logging,我已经从java编程中创建了一个文件,并且正在使用ApacheCommonsLoggingAPI记录一些数据,特别是Log4j实现 日志记录完成后,我将对日志类的引用设置为null。当我现在尝试删除已记录的文件时,file.delete()返回false 在调试期间(在调用file.delete()之前)从windows资源管理器中删除文件时,我收到通知“无法删除:正在被其他程序使用” 我的代码中的文件没有打开的依赖项(所有流都已关闭)。唯一可以访问该文件的对象是Log对象,我在调用file.d

我已经从java编程中创建了一个文件,并且正在使用ApacheCommonsLoggingAPI记录一些数据,特别是Log4j实现

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

在调试期间(在调用file.delete()之前)从windows资源管理器中删除文件时,我收到通知“无法删除:正在被其他程序使用”

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

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

在您的情况下,记录器正在将其写入文件中 -该文件已被另一个进程锁定


更新:

问题是log4js的appender在您的文件上有一个写锁。因此,当appender未关闭时,您无法删除该文件。解决方案是生成较小的文件,或者将append标志设置为false,这样当您重新启动服务器时,旧的日志文件会自动删除

试用

org.apache.log4j.LogManager.shutdown();
关闭确保所有正在使用日志文件的进程都已终止,并通过这种方式解决了问题


确保调用我们自己的Appender实现(AppenderSkleton的子类)的
close()
方法,以便它正确地从getAllAppenders()关闭Appender。

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

你有什么理由要马上删除这个文件吗?您可能希望尝试
File.deleteOnExit()
,这可能有更好的机会删除文件,尽管这取决于具体的时间安排。(另外,如果您反复调用
deleteOnExit
,请注意错误。)

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


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

我正在编写一个将在代码存储库上自动执行的测试。我无法更改正在测试的代码的实现,因此无法从Log4j移动。我怎样才能强制对设置为null的对象进行垃圾收集?@Shailesh:重要的是,你要明白不能将对象设置为null,只能将变量设置为null。如果该变量是引用该对象的唯一对象,那么它将符合垃圾收集的条件——但我怀疑您会发现在log4j中隐藏了其他引用。如果这是一个测试,您可能希望尝试配置log4j,使其完全不使用文件进行日志记录-登录到StringBuilder或类似的工具会更好。谢谢,我没有考虑log4j设置对对象的多个引用。登录到StringBuilder将是我最好的解决方法。