• ベストアンサー

ファイル内容を比較する方法

サーバ側とクライアント側の2つのファイル保存フォルダの中を比較して、クライアント側に不足しているファイルをサーバからダウンロードするというプログラムを作成しています。 現時点では、両方のフォルダのパスを指定して、FileクラスのlistFilesによってフォルダ内の一覧情報を取得し、それぞれのフォルダ内のファイル名を比較して一致しない場合はそれをダウンロードするという方法で不足しているファイルを取得することができています。 しかし、ファイル内容が異なっているのにファイル名が同じであるときにそれをダウンロードできないという問題がでてきて困っています。もしファイル内容まで一致しているかどうか比較できる方法があったら教えてほしいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1416)
回答No.2

中身の丸々の比較は時間もかかるので、サイズと更新日の比較では如何でしょう? File local; File server; if (( local.length() != server.length() ) || ( local.lastModified() != server.lastModified() )) {     違う } else {     同じ } 但し、ファイル管理情報をパッチして、タイムスタンプを偽装されたら判断できません。 しかし、通常業務範囲ではそこまで悪意のある事態を想定しなくても良いのでは?

number3-33
質問者

お礼

お返事どうもありがとうございます。 サイズと更新日の比較は全然思いつきませんでした。 とても手軽に比較できそうで参考になります。 試作なので偽装とかそこまでは考えなくても大丈夫です。 プログラム例まで載せていただきありがとうございました。 またよろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

メッセージダイジェスト(チェックサム)を取るのも ひとつの手よね

すると、全ての回答が全文表示されます。
回答No.1

java.io.FileInputStreamクラスのオブジェクトを生成し、 比較元と比較先のファイルの内容をそれぞれbyte[]配列に取り、 それをjava.util.Arrays.equalsメソッドで比較するという方法はいかがでしょうか。 byte列同士の比較になるので、内容が完全に一致していなければ異なるファイルであると判定できると思います。 <例> import java.io.*; import java.util.*; public class Sample { public static void main(String[] args) { try { File file1 = new File("比較元ファイルのpath"); File file2 = new File("比較先ファイルのpath"); byte[] b1 = new byte[(int)file1.length()]; byte[] b2 = new byte[(int)file2.length()]; new FileInputStream(file1).read(b1); new FileInputStream(file2).read(b2); System.out.println("Arrays.equals(b1, b2) => " + Arrays.equals(b1, b2)); }catch(FileNotFoundException e){ System.out.println(e); }catch(IOException e){ System.out.println(e); }catch(Exception e){ System.out.println(e); } } } ※ただし、この方法は一旦配列に取得するという関係上、2,147,483,647byteより大きいサイズのファイルが来た時、正しく動作しません。

number3-33
質問者

お礼

お返事ありがとうございます。 自分が求めていた方法でした。 プログラム例まで載せていただきとても参考に なります。 試作なのでファイルなどの軽いもので実行するので サイズは大丈夫だと思います。

すると、全ての回答が全文表示されます。

関連するQ&A