MyPerf4J
MyPerf4J copied to clipboard
File.renameTo及File.setReadOnly的问题
Bug 描述
请清晰和简洁的描述你遇见的 bug,方便快速的定位和解决问题
运行环境
- MyPerf4J 版本号,最新
- JDK 版本号,JDK8
- 运行容器和框架,Tomcat 8.5
- 操作系统,Windows
https://github.com/LinShunKang/MyPerf4J/blob/4c0a98d8f0f93733b0fddbb2b4b3dd4edd32470d/MyPerf4J-Core/src/main/java/cn/myperf4j/core/MethodMetricsHistogram.java#L83-L84
renameTo 在 window 上一直都是返回 false ,所以一直只创建了 tmp 文件,没生成最终的文件
并且假如第一次生成了最终的文件的话,并且给设置成了 readonly , 那下一轮生成的时候会报错的吧
感谢指出,MyPerf4J 的开发与使用基本在 MacOS 和 Linux 上,所以对 Windows 系统的测试不够充分; 欢迎提交 PR,我周末会抽时间统一处理:)
不过,每一次更新文件都是生成临时文件然后覆盖旧文件,设置 readonly 不会有问题才对
定位到原因了,是 fileWriter 还没关闭呢,就要重命名,所以一直导致 renameTo 返回 false
但是重命名和设置只读属性的逻辑挪到 try-with-resource
外面来,只有第一次能 renameTo 成功,后续就一直失败了,看下这个方法的 doc
我换成了 Files.move(tempPath, destFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
这个 api 底层我看了下有一步删除的操作 , 就会报错
欢迎提交 PR : )
windows 下 Files.move 这个 api 在 juint 里能重命名只读文件,在 tomcat 就会报错。。。
我手动去掉只读,它就又好了😑
还有个小问题一起在这个 PR 里修了
这俩处打印了 ConfigKey 对象的的内存地址了,没显示对应的 key,重写下 toString 就好了