Java - 使用 java.Scanner 时文件看起来相同,但未评估为 "equal"

标签 java encoding diff filereader

我已经设置了一个 JUnit 测试,该测试正在测试名为 copy(File src, File dest) 的方法,该方法只需将 src 文件的内容复制到 目标文件。我使用扫描仪同时迭代每个文件(当然是两个不同的扫描仪),然后将每个扫描仪 next().equals() 进行比较。

该测试失败,告诉我文件不相等。但这怎么可能呢?当我打印它们时,这些字符串看起来是相同的,更不用说我在调用 copy() 之后立即对文件进行了 hex dump ,而且它们看起来也相同。但是,当我以字节为单位打印 next() 的每个值时,我确实得到了不同的字节模式。我很困惑为什么会发生这种情况,以及我可以对代码进行哪些更改来解决此问题?

我的想法是,这与文件的编码有关,也许用于创建文件的编码方法与程序中其他地方的 copy() 使用的编码方法不同?真的不太确定,非常感谢任何帮助!这是我正在使用的测试单元:

// 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 对象。

关于Java - 使用 java.Scanner 时文件看起来相同,但未评估为 "equal",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12306526/

相关文章:

svn - 如何对整个目录树进行 "diff"处理?有可用的软件吗?

xml - 是否有免费的 Xml Diff/Merge 工具可用?

linux - 创建显示较少删除行的补丁

java - 在本地 maven 存储库中安装多个 jar 文件

java - 使用 Talend Routine 处理 DB null

java - 如何为java jtable创建鼠标双监听器

MySQL - 如何插入英文和编码字符?

delphi - coding.getstring 不返回字符串

快速解码 [字符串 : Any]

java - Jmeter 上传录音报错