Java-使用Java.Scanner时,文件看起来是相同的,但不会被评估为“相等”

Java-使用Java.Scanner时,文件看起来是相同的,但不会被评估为“相等”,java,encoding,diff,filereader,Java,Encoding,Diff,Filereader,我已经建立了一个JUnit测试,它测试一个名为copyFile src的方法,File dest,它只将src文件的内容复制到dest文件。我使用一个扫描器同时在每个文件上迭代两个不同的扫描器,然后将每个扫描器与.equals进行比较 这个测试失败了,告诉我文件不相等。但这怎么可能呢?当我打印字符串时,字符串看起来是一样的,更不用说我在调用copy之后立即对文件进行了十六进制转储,这些字符串看起来也是一样的。然而,当我以字节为单位打印next的每个值时,我确实得到了不同的字节模式。我很困惑为什么

我已经建立了一个JUnit测试,它测试一个名为copyFile src的方法,File dest,它只将src文件的内容复制到dest文件。我使用一个扫描器同时在每个文件上迭代两个不同的扫描器,然后将每个扫描器与.equals进行比较

这个测试失败了,告诉我文件不相等。但这怎么可能呢?当我打印字符串时,字符串看起来是一样的,更不用说我在调用copy之后立即对文件进行了十六进制转储,这些字符串看起来也是一样的。然而,当我以字节为单位打印next的每个值时,我确实得到了不同的字节模式。我很困惑为什么会发生这种情况,以及我可以对代码进行哪些更改来解释这种情况

我的想法是,它与文件的编码有关,也许用于创建文件的编码方法与程序中其他地方复制所使用的编码方法不同?真的不太确定,谢谢你的帮助!以下是我为测试单元所做的工作:

// The @Rule and @Before blocks are used as set up helper methods for @Test.
    @Rule
    public TemporaryFolder tmp = new TemporaryFolder();

    private File f1, f2;

    @Before
    public void createTestData() throws IOException {
        f1 = tmp.newFile("src.txt");
        f2 = tmp.newFile("dest.txt");

        BufferedWriter out = new BufferedWriter(new FileWriter(f1));
        out.write("This should generate some " +
                "test data that will be used in " +
                "the following method.");
        out.close();
    }

    @Test
    public void copyFileTest() throws FileNotFoundException, 
    Exception {
        try {
            copyFile(f1, f2);
        } catch (IOException e) {
            e.getMessage();
            e.printStackTrace();
        }

        Scanner s1 = new Scanner(f1);
        Scanner s2 = new Scanner(f2);

        // FileReader is only used for debugging, to make sure the character
        // encoding is the same for both files.
        FileReader file1 = new FileReader(f1);
        FileReader file2 = new FileReader(f2);
        out.println("file 1 encoding: " +file1.getEncoding());
        out.println("file 2 encoding: " +file2.getEncoding());

        while (s1.hasNext() && s2.hasNext()) {
            String original = s1.next();
            String copy = s2.next();

            // These print out to be the same ...
            out.println("\ns1: " +original);
            out.println("s2: " +copy);

            // Nevertheless, this comparison fails!
            // These calls to getBytes() return different values.
            if (!(s1.equals(s2))) {
                out.println("\nComparison failed!! \ns1 in bytes: " +original.getBytes()+ 
                        "\ns2 in bytes: " +copy.getBytes());
                fail("The files are not equal.");
            }
        }
    }
这是我的输出:

file 1 encoding: UTF8
file 2 encoding: UTF8

s1: This
s2: This

Comparison failed!! 
s1 in bytes: [B@16f5b392
s2 in bytes: [B@5ce04204

Scanner不重写Object.equals,所以它在比较引用,在您的情况下,引用不相等,因为您有两个单独的Scanner对象。

Scanner不重写Object.equals,所以它在比较引用,在您的情况下,由于您有两个单独的扫描仪对象,因此它们不相等。

在比较失败的情况下,您能否提供println的输出?如果您确实打开了这些文件,它们是否相同?是新线还是空间问题?@Kelly我提供了输出@是的,我可以打开它们,它们看起来都一样。我只能在调试过程中打开它们,因为JUnit会在测试后删除它们。在比较失败的地方,你能提供println的输出吗?如果你真的打开了这些文件,它们是一样的吗?是新线还是空间问题?@Kelly我提供了输出@是的,我可以打开它们,它们看起来都一样。我只能在调试期间打开它们,因为JUnit会在测试后删除它们。谢谢GriffeyDog!哇,所以一直以来我都在通过实际的扫描仪,而不是扫描仪返回的代币。下一步呢?新手招式:@Houdini不会让它影响到你。我怀疑.equals,但有时你需要一个比单元测试更强大的工具:另一组眼睛;即使在编码超过10年后,这种情况也会发生在我们所有人身上。谢谢Kelly,是的,第二双眼睛总是受欢迎的。我的额头还在打那个,但是…继续说:谢谢格里菲多格!哇,所以一直以来我都在通过实际的扫描仪,而不是扫描仪返回的代币。下一步呢?新手招式:@Houdini不会让它影响到你。我怀疑.equals,但有时你需要一个比单元测试更强大的工具:另一组眼睛;即使在编码超过10年后,这种情况也会发生在我们所有人身上。谢谢Kelly,是的,第二双眼睛总是受欢迎的。我的额头还在打那个,但是…继续说: