Java-файлы кажутся одинаковыми при использовании java.Сканера, но не оцениваются как " равные"
Я настроил тест JUnit, который тестирует метод под названием copy(File src, File dest)
, который просто копирует содержимое файла src
в файл dest
. Я использую сканер, чтобы перебирать каждый файл одновременно (два разных сканера, конечно), а затем сравнивать каждый сканер next()
с .equals()
.
Этот тест проваливается, говоря мне, что файлы не равны. Но как это может быть? Строки выглядят одинаково, когда я их печатаю, не говоря уже о том, что я сделал hex dump
файлов сразу после вызова copy()
и они тоже выглядят одинаково. Однако, когда я печатаю каждое значение 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