Java文件等于

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)

但是如果你想比较两个不同文件的内容,那么是的,你应该编写自己的方法 - 或者只是从互联网上的某个地方复制.


use*_*300 8

要正确测试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,因此我将其添加到方法签名中.


Bri*_*now 5

如果您只想比较每个文件的内容,您可以将内容读入一个字节数组,如下所示:

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)

然后从那里比较。

  • 比较这样的文件是一个非常糟糕的主意 (6认同)