如何解决“模拟”外部程序读取/保持文件,防止 File#delete()
我在 currently looking into an issue with Logback 中,如果我在日志文件阅读器 glogg 中打开某个文件,Compressor 类将无法删除该文件。这种情况只发生在那个程序中,如果我在 Notepad.exe 中打开文件不会出现问题,所以它在某种程度上与锁定文件或类似的东西有关(linked repo 中存在完整的复制步骤)。>
现在,我需要手动打开 glogg 程序来重现该问题,但理想情况下,我只想使用 Java 演示程序重现此问题。到目前为止,我一直很不成功。所以我想知道如何实现以下目标:
- 启动线程 A 和线程 B
- 线程 A 应该写入文件 X
- 当线程 A 在 X 上执行
File#delete()
时,它应该返回false
(意味着不成功) - 线程 B 应该是这个原因,因为它以某种方式保持文件,阻止删除成功
我尝试过的东西
public void run() {
while (true) {
logDumper.debug(bigString);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printstacktrace();
}
}
}
public static void main(String[] s) {
final Runnable runnable = () -> {
try {
var fileInputStream = new FileInputStream("./test.log");
var file = new File("./test.log");
fileInputStream.readAllBytes();
System.out.println("Size: " + file.length());
final var fc = fileInputStream.getChannel();
// this entire locking thing does not seem to have any effect
final var shared = true; // required to avoid throwing when opening a file as read-only
try (FileLock lock = fc.tryLock(0,file.length(),shared)) {
} catch (NonReadableChannelException| NonWritableChannelException e) {
logger.error("Something happened",e);
fc.close();
}
} catch (IOException e) {
logger.error("Crashed on locking",e);
e.printstacktrace();
}
};
new Thread(runnable).start();
new Main().run();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。