Java 文件等于

2022-09-01 22:03:35

我不知道你们的情况,但至少我预计在下面的代码中f1等于f2,但显然情况并非如此!您对此有何看法?似乎我必须编写自己的相等方法来支持它,对吧?

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));
    }
}

答案 1

不是,事实并非如此。因为 equals 是比较绝对路径的相等性(在上面的例子中,它是这样的:

some-project\.\hello.txt
some-project\hello.txt

所以他们自然是不同的。

似乎我必须编写自己的相等方法来支持它,对吧?

可能是的。但首先,你必须知道你想比较什么?只有路径名?如果是,请按以下方式比较其规范路径:

f1.getCanonicalPath().equals(f2.getCanonicalPath())

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


答案 2

要正确测试 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));
   }

对于等于,将返回 true。请注意,getCanonicalFile 可能会引发 IOException,因此我将其添加到方法签名中。