微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“模拟”外部程序读取/保持文件,防止 File#delete()

如何解决“模拟”外部程序读取/保持文件,防止 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?