我有一个简单的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
命令,则完全相同。现在,
我的teem-mate代码与 Windows 笔记本电脑,当他运行测试时,它已经破坏了!然后我们开始调试
从视觉上看,两个文件都是一样的;我的意思是在人类修订版中,您无法实现任何差异。但是如果在Cwin终端我们执行了:
diff expected.csv got.csv
和Windows认为每一行都不同
测试结果。
问题是,操作系统是什么?如果是这样,有没有办法比较文件内容不依赖于操作系统
答案 0 :(得分:1)
我的猜测是,这很可能是由于\ n值,在unix中就像软件一样\ r \ n。
无论如何,查看两个文件是否具有相同内容的正确方法是散列它们(即通过sha1)并检查散列是否匹配!
答案 1 :(得分:0)
此行为可归因于两个操作系统上的Line Feed不同。 如果您希望它与平台无关,则应使用
从运行时中获取值System.getProperty("line.separator");
另外,您可能需要查看两个文件的char编码
答案 2 :(得分:0)
这个答案可以帮到你:Java Apache FileUtils readFileToString and writeStringToFile problems。该问题的作者正在谈论PDF文件,但这个答案对您的问题有意义。