Java'da iki belgeyi karşılaştırın

Oct 16 2020

Java ile karşılaştırmaya çalıştığım iki kelimelik belgelerim var. Kullanmayı denedim

md5 hashcode

HashCode newFile = Files.asByteSource(newFileInput).hash(Hashing.md5());
HashCode oldFile = Files.asByteSource(oldFileInput).hash(Hashing.md5());

ve ayrıca

boolean isEqual = FileUtils.contentEquals (eskiFile, yeniFile);

İçerikler aynı olsa da, çevrimiçi araçları kullanarak içerikle kıyaslandığında ve karşılaştırmanın ötesinde, yine de yukarıdaki her iki yöntemdeki karma kod MISMATCH olarak gelir.

herhangi bir çözüm? veya herhangi bir dosya türünü Java'daki herhangi bir API kullanarak karşılaştırmanın yolu. boşluklar, yazı tipleri, içerik gibi iki kelime dosyası arasında derinlemesine karşılaştırma yapmam gerekiyor. vb..

Beklenen Sonuç: Her iki dosya da eşleşmelidir

Yanıtlar

2 Milgo Oct 16 2020 at 12:41

Her iki belgeniz de aynı görünse veya her ikisi de aynı biçimlendirilmiş içeriği içerse bile, son değiştirilme tarihi gibi küçük bir değişiklik, başarısız bir karşılaştırmaya neden olacaktır. JSON belgelerini karşılaştırmak daha kolaydır, ancak Word belgeleri ikilidir. En küçük değişiklik belgeyi tamamen değiştirebilir.

Yani bunu zor yoldan yapmalısınız: Word dosyalarının içeriğini kendi başınıza okumak için bir kitaplık bulun ve her iki dosyanın içeriğini özel olarak kontrol edin.

backToStack Oct 21 2020 at 16:38

Sorum için çok sayıda öneri ve cevap vardı. Docx dosyasındaki uyuşmazlığın nedenleri meta veri bilgilerinde bulunur, her doc / docx dosyası oluşturduğumuzda zaman damgası değişir. Her iki dosyanın zaman damgasını (erişilen, değiştirilen ve oluşturulan) aynı yapmak ve karşılaştırmak için değiştirmeye çalışsam da, bu işe yaramadı. Nedeni, bu zaman damgalarından ayrı olarak, Dosya özelliklerini gördüğümüzde görünmeyen Zip Değiştirme Tarihi adlı bir meta bilgi var. hashcode'da uyumsuzluğun nedenlerinden biri olarak bulduğum bu zaman damgası. Ayrıca, base64 kodlu dizeler, zip zaman damgası nedeniyle farklıydı.

Dolayısıyla, karşılaştırmayı yapmam gereken seçenekler şunlardı:

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" iyiydi, ancak çok sayıda yineleme gerektiriyordu ve sıkıştırmanın açılması birçok klasör oluşturacaktı.

"1" düz fwd idi, çünkü onu harici lib -> docx4j kullanarak denedim, bu docx'i xml'ye dönüştürdü ve sonra karma kodu eşleştirebildim, işe yaradı.

DOCX'i XML dosyasına dönüştürün

Word belgesinin içeriğini ve stillerini karşılaştırmak için en basit ve çok karmaşık olmayan bir yol aradığım için farklı seçenekleri denemek zorunda kaldım.