【问题标题】:Comparing Files dependent on operative system. JUnit比较依赖于操作系统的文件。 JUnit
【发布时间】:2015-05-04 20:17:56
【问题描述】:

我有一个简单的 JUnit 测试,它检查两个文件是否具有相同的内容。它在我的 Unix 笔记本电脑上运行良好。

这里是测试:

    boolean response = false;
    try {
      File got = File.createTempFile("got-", ".csv");
      String outputPath = got.getAbsolutePath();
      testedObject.createCsvFile(outputPath);
      got = new File(outputPath);
      String expectedFilePath = getClass().getClassLoader().getResource("expected.csv").getFile();
      File expected = new File(expectedFilePath);
      response = FileUtils.contentEquals(got, expected); // Here it is the key
    } catch (IOException e) {
      // Nothing to do Yay!
    }
    Assert.assertTrue(response);

它之所以有效,是因为如果我手动比较两个文件,例如通过diff 命令,它们是完全相同的。现在。
我的队友用 Windows 笔记本电脑编写代码,但当他运行测试时,它就坏了!我们开始调试。

在视觉上,两个文件是相同的;我的意思是在 human 版本中,您无法意识到任何区别。但是如果在 Cwin 终端中我们执行: diff expected.csv got.csv windows 认为每一行都不一样
并且测试失败了。

有什么问题,是操作系统吗?如果这是真的,有没有办法比较文件内容不依赖于操作系统

【问题讨论】:

    标签: java csv junit operating-system


    【解决方案1】:

    我的猜测是,这很可能是由于 \n 值,在类 unix 软件中是 \r\n。

    无论如何,查看两个文件是否具有相同内容的正确方法是对它们进行散列(即通过 sha1)并检查散列是否匹配!

    【讨论】:

    • 非常喜欢你的回答。你能解释一下如何比较两个文件的哈希值吗?
    • 我不是 java 专家 =) 但显然这个答案就是你想要的 stackoverflow.com/questions/6293713/… 然后只需比较两个哈希值
    • "正确的方法 [...] 检查哈希是否匹配" 不!您唯一可以通过此类检查断言的是两个文件是否不相等。如果散列值相等,您也无法确定文件是否相等(尽管它们很可能确实如此)。这不是正确的方法。
    • 哈希冲突是真实存在的,但使用相当强大的哈希算法就足够了
    【解决方案2】:

    此行为可归因于两个操作系统上的 Line Feed 不同。 如果您希望它独立于平台,您应该使用

    从运行时获取值
    System.getProperty("line.separator");
    

    您可能还想看看这两个文件的字符编码

    【讨论】:

      【解决方案3】:

      这个答案可以帮助你:Java Apache FileUtils readFileToString and writeStringToFile problems。该问题的作者正在谈论 PDF 文件,但这个答案对您的问题很有意义。

      【讨论】:

        猜你喜欢
        • 2017-03-09
        • 2017-12-25
        • 2013-09-01
        • 1970-01-01
        • 2021-12-31
        • 2021-01-14
        • 2017-01-16
        • 2011-10-15
        • 2017-11-06
        相关资源
        最近更新 更多