Java tryLock函数不适用于.txt文件

Java tryLock函数不适用于.txt文件,java,file,nio,Java,File,Nio,若我手动打开.txt文件,然后执行代码检查文件是否打开。它总是说文件没有打开。但对于任何MS Office(.doc、.xls、.ppt)来说,相同的代码都可以正常工作 以下是代码片段: File file = new File("F:\\abc.txt"); FileChannel channel = null; FileLock lock = null; try { channel = new Ran

若我手动打开.txt文件,然后执行代码检查文件是否打开。它总是说文件没有打开。但对于任何MS Office(.doc、.xls、.ppt)来说,相同的代码都可以正常工作

以下是代码片段:

        File file = new File("F:\\abc.txt");
        FileChannel channel = null;
        FileLock lock = null;

        try {

            channel = new RandomAccessFile(file, "rw").getChannel();
            // Get an exclusive lock on the whole file
            try {
                lock = channel.tryLock();
                if (lock != null) {
                    System.out.println("Lock acquired on file: " + file.getAbsolutePath());
                    lock.release();
                    System.out.println("Lock released from closed file.");
                    System.out.println("Closing the channel of closed file.");
                }

                channel.close();
            }
            catch (OverlappingFileLockException | IOException e) {
                // File is open by someone else
            }
        }
        catch (FileNotFoundException e1) {
            // File is open by someone else
        }
每次,.txt文件都会获得锁,即使打开了相同的文件(这与MS Office文件的行为不同)


有没有其他方法来测试文件是否被其他进程打开/使用?

问题是,windows中的大多数程序都不会锁定文本文件。例如,如果使用记事本打开文本文件,则可以将其删除。这意味着,记事本不会获取锁,因此您可以在java程序中获取锁


在你的测试中,你必须使用一个程序来锁定一个文本文件,或者重写你的程序,它会锁定一个文件,直到你关闭程序。然后你可以启动两次程序。

你用什么打开文件?两种方式都不起作用:要么手动打开,双击它,要么通过code
Desktop.getDesktop()。打开(文件)
你说的“打开”是什么意思?例如,记事本不锁定文本文件。我尝试使用记事本、记事本++甚至MS Office Word打开它。如果您使用的程序不锁定文件,则在java中获得锁定是合法的。例如,如果我在记事本中打开一个文本文件,我可以删除该文件,windows不会抱怨。您必须在一个程序中打开该文件,该程序实际上会锁定该文件。谢谢您的建议。我试图添加独占锁,但用户将无法编辑此文件。除了添加锁定以查找目标文件外,他们还有其他方法打开吗?锁定的要点是用户无法编辑该文件。如果您想知道文件是否不是用常规方法打开的。但如果您的问题是:如何检测文件的修改?我建议看看新的文件io api,我认为实现了一个whatcher类。