Java 文件等于
我不知道你们怎么想,但至少我预计下面的代码中 f1 将等于 f2,但显然情况并非如此!您对此有何看法?看来我必须写自己的 equals 方法来支持它,对吗?
import java.io.*;
public class FileEquals
{
public static void main(String[] args)
{
File f1 = new File("./hello.txt");
File f2 = new File("hello.txt");
System.out.println("f1: " + f1.getName());
System.out.println("f2: " + f2.getName());
System.out.println("f1.equals(f2) returns " + f1.equals(f2));
System.out.println("f1.compareTo(f2) returns " + f1.compareTo(f2));
}
}
I don't know about you guys but at least I expected that f1 would be equal to f2 in the below code but apparently that's not the case! What's your thoughts about this? It seems like I have to write my own equals method to support it, right?
import java.io.*;
public class FileEquals
{
public static void main(String[] args)
{
File f1 = new File("./hello.txt");
File f2 = new File("hello.txt");
System.out.println("f1: " + f1.getName());
System.out.println("f2: " + f2.getName());
System.out.println("f1.equals(f2) returns " + f1.equals(f2));
System.out.println("f1.compareTo(f2) returns " + f1.compareTo(f2));
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
不,事实并非如此。因为 equals 正在比较绝对路径的相等性(在上面的例子中,它类似于:
所以它们自然是不同的。
可能是的。但首先你要知道你要比较什么?只有路径名吗?如果是,请以这种方式比较其规范路径:
但是如果您想比较两个不同文件的内容,那么是,您应该编写自己的方法 - 或者只是从互联网上的某个地方复制。
Not, it's not the case. Because equals is comparing equality of absolute paths (in your case above it is something like:
So they are naturally different.
Probably yes. But first of all, you have to know what you want to compare? Only pathnames? If yes, compare its canonical path in this way:
But if you want compare content of two different files, then yes, you should write your own method - or simply just copy from somewhere on the internet.
要正确测试 equals,您必须调用 getCanonicalFile()。例如,
如果等于,则返回 true。请注意,getCanonicalFile 可能会抛出 IOException,因此我将其添加到方法签名中。
To properly test equals, you must call getCanonicalFile(). e.g.
Will return true for equals. Note that getCanonicalFile may throw an IOException so I added that to the method signature.
如果您只想比较每个文件的内容,您可以将内容读入字节数组,如下所示:
然后从那里准确比较您想要的内容。
请注意,此方法调用仅存在于 Java 7 中。对于旧版本,Guava 和 Apache 具有执行类似操作但名称和详细信息不同的方法。
编辑:或者更好的选择(特别是如果您正在比较大文件)可能是简单地逐字节比较,而不是将整个文件加载到内存中,如下所示:
然后从那里进行比较。
If you only want to compare the CONTENTS of each file, you could read the contents into a byte array like this:
And then compare exactly what you want from there.
Note that this method call only exists in Java 7. For older versions, Guava and Apache have methods to do similar but with different names and details.
Edit: OR a better option (especially if you're comparing large files) might be to simply compare byte by byte rather than loading the entire file into memory, like this:
And then compare from there.
我发现比较两个文件的更快方法如下。
这只是解决这个问题的建议。
不确定性能(如果每个文件都是 10 GB 怎么办?)
编辑
但是,unix 系统上的 diff 实用程序会更快、更冗长。
取决于你需要比较什么。
The quicker way I found to diff on two files is below.
That's just proposition to work it around.
Not sure about the performance (what if files are 10 GB each?)
EDIT
But still, diff utility on unix system would be much quicker and verbose.
Depends what you need to compare.
如果您只想根据路径检查文件是否相同,请使用
java.nio.file.Files#isSameFile
例如
If you just want to check if the files are the same based on their path use
java.nio.file.Files#isSameFile
E.g.
下面是这两种方法的实现:
Here is the implementation of both methods:
如果您使用的是Windows,请参阅类
Win32FileSystem
比较方法如下,因此您的文件对象不同是很正常的。
将这些行添加到您的代码中
,它将打印
因此它们不相等,因为使用 File 对象的路径属性进行比较
If you are using windows see class
Win32FileSystem
The comparison method is like below, so it is very normal that your file objects are different.
Add those lines to your code as well
and it will print
Hence they are not equal as the comparison is made using path proeprty of File object