Java - 比较两个相同文件的InputStream

时间:2016-12-18 20:35:03

标签: java inputstream

我正在创建一个JUnitTest测试,用于比较使用基准文件创建的文件,该文件存在于Eclipse中src文件夹的resources文件夹中。

代码

public class CompareFileTest
{
    private static final String TEST_FILENAME = "/resources/CompareFile_Test_Output.xls";

@Test
public void testCompare()
{
    InputStream outputFileInputStream = null;
    BufferedInputStream bufferedInputStream = null;

    File excelOne = new File(StandingsCreationHelper.directoryPath + "CompareFile_Test_Input1.xls");
    File excelTwo = new File(StandingsCreationHelper.directoryPath + "CompareFile_Test_Input1.xls");
    File excelThree = new File(StandingsCreationHelper.directoryPath + "CompareFile_Test_Output.xls");

    CompareFile compareFile = new CompareFile(excelOne, excelTwo, excelThree);

    // The result of the comparison is stored in the excelThree file
    compareFile.compare();

    try
    {
        outputFileInputStream = new FileInputStream(excelThree);
        bufferedInputStream = new BufferedInputStream(outputFileInputStream);

        assertTrue(IOUtils.contentEquals(CompareFileTest.class.getResourceAsStream(TEST_FILENAME), bufferedInputStream));
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
}

但是,我收到一条Assertion Error消息,没有任何细节。由于我刚从比较文件操作创建基准文件,因此两个文件应该完全相同。

提前致谢!

编辑:在评论之后,我使用了文件差异工具,发现两个文件都不同,但由于它们是副本,我不确定是怎么回事。也许有时间戳或什么?

2 个答案:

答案 0 :(得分:2)

IOUtils.contentEquals()并未声称提供的信息比布尔“匹配或不匹配”更多,因此您无法从中获取额外信息。

如果你的目的只是为了弄清楚这两个文件不同的原因,你可以放弃Java并使用其他工具来比较文件。例如https://superuser.com/questions/125376/how-do-i-compare-binary-files-in-linux

如果您的目标是让jUnit测试在文件不匹配时为您提供更多信息(例如,例外情况可能是Expected files to match, but byte 5678 differs [0xAE] vs [0xAF]),则需要使用IOUtils.contentEquals()之外的其他内容 - 通过滚动自己,或在Comparing text files w/ Junit

中寻找合适的东西

答案 1 :(得分:0)

我有一个类似的问题。

我使用的是JUNIT断言库断言,并且得到了要比较的内存地址,而不是实际的文件。

我没有将InputStream对象进行比较,而是将它们转换为字节数组并进行了比较。这不是绝对的特价,但我敢宣称,如果字节数组相同,则基础InputStream及其文件具有相等的很大机会。

像这样:

 Assertions.assertEquals(
            this.getClass().getResourceAsStream("some_image_or_other_file.ext").readAllBytes(),
            someObject.getSomeObjectInputStream().readAllBytes());

不确定对于较大的文件,此比例是否可以缩放。对于复杂的差异当然不是很好,但是它确实可以断言。