aan*_*ers 21 java compare file equals
我不知道你们,但至少我预计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));
}
}
Run Code Online (Sandbox Code Playgroud)
G. *_*cki 32
不是,事实并非如此.因为equals是比较绝对路径的相等性(在你的情况下,它是这样的:
some-project\.\hello.txt
some-project\hello.txt
Run Code Online (Sandbox Code Playgroud)
所以他们自然不同.
看来我必须编写自己的equals方法来支持它,对吗?
可能是.但首先,你必须知道你想要比较什么?只有路径名?如果是,请以这种方式比较其规范路径:
f1.getCanonicalPath().equals(f2.getCanonicalPath())
Run Code Online (Sandbox Code Playgroud)
但是如果你想比较两个不同文件的内容,那么是的,你应该编写自己的方法 - 或者只是从互联网上的某个地方复制.
要正确测试equals,必须调用getCanonicalFile().例如
public static void main(String[] args) throws IOException
{
File f1 = new File("./hello.txt").getCanonicalFile();
File f2 = new File("hello.txt").getCanonicalFile();
System.out.println("f1: " + f1.getAbsolutePath());
System.out.println("f2: " + f2.getAbsolutePath());
System.out.println("f1.equals(f2) returns " + f1.equals(f2));
System.out.println("f1.compareTo(f2) returns " + f1.compareTo(f2));
}
Run Code Online (Sandbox Code Playgroud)
对于平等,将返回true.请注意,getCanonicalFile可能会抛出IOException,因此我将其添加到方法签名中.
如果您只想比较每个文件的内容,您可以将内容读入一个字节数组,如下所示:
byte[] f1 = Files.readAllBytes(file1);
byte[] f2 = Files.readAllBytes(file2);
Run Code Online (Sandbox Code Playgroud)
然后从那里准确地比较你想要的东西。
请注意,此方法调用仅存在于 Java 7 中。对于旧版本,Guava 和 Apache 具有执行类似操作但名称和细节不同的方法。
编辑:或者更好的选择(尤其是在比较大文件时)可能是简单地逐字节比较,而不是将整个文件加载到内存中,如下所示:
FileInputStream f1 = new FileInputStream(file1);
DataInputStream d1 = new DataInputStream(f1);
FileInputStream f2 = new FileInputStream(file2);
DataInputStream d2 = new DataInputStream(f2);
byte b1 = d1.readByte();
byte b2 = d2.readByte();
Run Code Online (Sandbox Code Playgroud)
然后从那里比较。
| 归档时间: |
|
| 查看次数: |
23201 次 |
| 最近记录: |