首页 > 解决方案 > Java 7 中的 Files.isSameFile

问题描述

我试图通过制作两个相同的文件并稍后使用 Files.isSameFile 检查其中一个文件是否被编辑来进行文件保护。这是我的代码不起作用。

                Path path = Paths.get("zapis.lnk");
                Path path2 = Paths.get("C:/zapis.lnk");

                if (Files.isSameFile(path, path2)){
                    System.out.println("It is a copy");
                } else {
                    System.out.println("It's not a copy");
                }

此时我已经使用 Windows 资源管理器将 zapis.lnk 复制到 C: 但在我尝试运行我的应用程序后它显示“它不是副本”。我应该使用什么代码来检查它?

标签: javafile

解决方案


根据定义,两个不同的物理文件不能是同一个文件,即使它们具有完全相同的内容。正如javadoc所述,Files.isSameFile()测试是否:

两个路径定位同一个文件。

Files.isSameFile()true仅当s 引用相同的文件时才返回Path,例如:

Path path = Paths.get("C:/folder/zapis.lnk");
Path path2 = Paths.get("C:/folder").resolve("zapis.lnk"); 
Files.isSameFile(path, path2); // return true

根据您的要求,您需要比较两个文件的字节,并且为了以优化的方式执行操作,您应该先比较文件长度,然后再比较它们的字节。
你可以使用一个健壮的第三个库来为你做这件事。

例如:FileUtils.contentEquals()指定为:

比较两个文件的内容以确定它们是否相等。此方法检查两个文件的长度是否不同,或者它们是否指向同一个文件,然后再对内容进行逐字节比较。

所以你可以这样做:

boolean isContentEqual = FileUtils.contentEquals(path.toFile(), path2.toFile());

推荐阅读