这是比较 Java 中的两个文档的最佳方法,没有任何复杂性和精确结果
Which is the best way to Compare two documents in Java without any complexity and precise result
我有两个 word 文档,我想在 java 中比较它们。
我尝试使用
md5 哈希码
HashCode newFile = Files.asByteSource(newFileInput).hash(Hashing.md5());
HashCode oldFile = Files.asByteSource(oldFileInput).hash(Hashing.md5());
并且还在使用,
boolean isEqual = FileUtils.contentEquals(oldFile , newFile);
虽然内容一样,但是用在线工具对比了一下内容,无法比拟,
上述两种方法中的哈希码仍然是 MISMATCH。
有什么解决办法吗?或使用 Java 中的任何 API 比较任何文件类型的方法。
我需要对两个单词文件进行深入比较,如空格、字体、内容。等..
预期结果:两个文件应该匹配
在Java中,你可以用string1.equals(string2).
比较两个字符串
所以在你的情况下你需要行 newFile.equals(oldFile)
读取string中的文件然后使用比较字符串,可以使用stringbuilder或tostring方法转换string中的文件。
InputStream is = new FileInputStream("manifest.mf");
BufferedReader buf = new BufferedReader(new InputStreamReader(is));
String line = buf.readLine();
StringBuilder sb = new StringBuilder();
while(line != null){
sb.append(line).append("\n");
line = buf.readLine();
}
字符串文件AsString = sb.toString();
System.out.println("内容:" + fileAsString);
string one = "fdgfhdgkifgh";
string two = "fdgfhdgkifgh";
if(one.Equals(two) || one == two ){
//something
}else{
//not compared
}
即使您的两个文档看起来相同或包含相同格式的内容,像上次修改日期这样的细微变化也会导致比较失败。 JSON 文档更容易比较,但 Word 文档是二进制的。最小的更改可以完全改变文档。
所以只好硬着头皮了:找个图书馆自己看word文件的内容,具体查两个文件的内容。
我的问题有很多建议和答案,谢谢。 docx 文件不匹配的原因存在于元数据信息中,每次我们创建 doc/docx 文件时,时间戳都会发生变化。尽管我试图更改两个文件的时间戳(访问、修改和创建)以使其相同并进行比较,但没有成功。原因是除了这些时间戳之外,还有一个名为 Zip Modify Date 的元信息,当我们查看文件属性时,它是不可见的。我发现这个时间戳是哈希码不匹配的原因之一。此外,base64 编码的字符串因 zip 时间戳而不同。
因此,我必须进行比较的选项是:
1. converting the docx file to xml file
2. Zip the docx file, unzip it and iterate though all the xml files to find the hashcode and compare the hascodes.(suggeted as of the answers)
“2”很好,但需要多次迭代,解压缩会创建很多文件夹。
"1" 是直截了当的,因为我尝试使用外部 lib -> docx4j 将 docx 转换为 xml 然后我可以匹配哈希码,它起作用了。
将 DOCX 转换为 XML 文件
我不得不尝试不同的选择,因为我一直在寻找最简单而不是那么复杂的方法来比较 word 文档的内容和样式。
我有两个 word 文档,我想在 java 中比较它们。 我尝试使用
md5 哈希码
HashCode newFile = Files.asByteSource(newFileInput).hash(Hashing.md5());
HashCode oldFile = Files.asByteSource(oldFileInput).hash(Hashing.md5());
并且还在使用,
boolean isEqual = FileUtils.contentEquals(oldFile , newFile);
虽然内容一样,但是用在线工具对比了一下内容,无法比拟, 上述两种方法中的哈希码仍然是 MISMATCH。
有什么解决办法吗?或使用 Java 中的任何 API 比较任何文件类型的方法。 我需要对两个单词文件进行深入比较,如空格、字体、内容。等..
预期结果:两个文件应该匹配
在Java中,你可以用string1.equals(string2).
比较两个字符串所以在你的情况下你需要行 newFile.equals(oldFile)
读取string中的文件然后使用比较字符串,可以使用stringbuilder或tostring方法转换string中的文件。 InputStream is = new FileInputStream("manifest.mf"); BufferedReader buf = new BufferedReader(new InputStreamReader(is));
String line = buf.readLine();
StringBuilder sb = new StringBuilder();
while(line != null){
sb.append(line).append("\n");
line = buf.readLine();
}
字符串文件AsString = sb.toString(); System.out.println("内容:" + fileAsString);
string one = "fdgfhdgkifgh";
string two = "fdgfhdgkifgh";
if(one.Equals(two) || one == two ){
//something
}else{
//not compared
}
即使您的两个文档看起来相同或包含相同格式的内容,像上次修改日期这样的细微变化也会导致比较失败。 JSON 文档更容易比较,但 Word 文档是二进制的。最小的更改可以完全改变文档。
所以只好硬着头皮了:找个图书馆自己看word文件的内容,具体查两个文件的内容。
我的问题有很多建议和答案,谢谢。 docx 文件不匹配的原因存在于元数据信息中,每次我们创建 doc/docx 文件时,时间戳都会发生变化。尽管我试图更改两个文件的时间戳(访问、修改和创建)以使其相同并进行比较,但没有成功。原因是除了这些时间戳之外,还有一个名为 Zip Modify Date 的元信息,当我们查看文件属性时,它是不可见的。我发现这个时间戳是哈希码不匹配的原因之一。此外,base64 编码的字符串因 zip 时间戳而不同。
因此,我必须进行比较的选项是:
1. converting the docx file to xml file
2. Zip the docx file, unzip it and iterate though all the xml files to find the hashcode and compare the hascodes.(suggeted as of the answers)
“2”很好,但需要多次迭代,解压缩会创建很多文件夹。
"1" 是直截了当的,因为我尝试使用外部 lib -> docx4j 将 docx 转换为 xml 然后我可以匹配哈希码,它起作用了。
将 DOCX 转换为 XML 文件
我不得不尝试不同的选择,因为我一直在寻找最简单而不是那么复杂的方法来比较 word 文档的内容和样式。