java - 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: 但在我尝试运行我的应用程序后它显示“它不是副本”。我应该使用什么代码来检查它?
解决方案
根据定义,两个不同的物理文件不能是同一个文件,即使它们具有完全相同的内容。正如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());
推荐阅读
- docker - Traefik 实例无法解析 TLS 握手,如何从 v1.7.17 重新配置到 v2.0.2?
- c# - 如何通过 UIViewController 将表格置于后台?
- c# - 在C#中对每个数字求平方
- php - Google Analytics API 刷新令牌 API 致命错误
- rust - 检查 .rlib 文件的工具
- python - 在 NUKE 中设置常量节点的宽度和高度
- java - UiSelector().ResoureIdMatches 的 Appium Or(|) 条件给出 NoSuchElementException
- angular - 在 HttpErrorResponse 中显示从服务器抛出的 CustomError 消息和状态码
- python-3.x - 基于 if 语句写入或读取文件
- indexeddb - How to define and use database relationships in dexie js?