HOWTO · Java

Java で 2つのファイルの内容を比較する

このチュートリアルでは、Java で 2つのファイルの内容を比較する方法を示します。

このページの内容

2つのファイルの内容を比較するには、いくつかの方法があります。 このチュートリアルでは、Java で 2つのファイルを比較するさまざまな方法を示します。

Java での 2つのファイルのバイトごとの比較

BufferedInputStream は、ファイルを読み取り、1つのファイルの各バイトを他のファイルと比較するために使用されます。 BufferedReader の read() メソッドを使用して、各バイトを読み取り、比較します。

内容が異なる 2つの同様のテキスト ファイル、delftstack1 と delftstack2 を異なる名前で作成しました。

Hello This is delftstack.com
The best online platform for learning different programming languages.

両方のファイルをバイトごとに比較する例を試してみましょう。

package delftstack;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;

public class File_Compare {
  private static boolean CompareFilesbyByte(Path File_One, Path File_Two) {
    try {
      long file_size = Files.size(File_One);
      if (file_size != Files.size(File_Two)) {
        return false;
      }

      if (file_size < 2048) {
        return Arrays.equals(Files.readAllBytes(File_One), Files.readAllBytes(File_Two));
      }

      // Compare byte-by-byte
      try (BufferedReader Content1 = Files.newBufferedReader(File_One);
           BufferedReader Content2 = Files.newBufferedReader(File_Two)) {
        int byt;
        while ((byt = Content1.read()) != -1) {
          if (byt != Content2.read()) {
            return false;
          }
        }
      }

      return true;
    } catch (IOException e) {
      e.printStackTrace();
    }
    return false;
  }

  public static void main(String[] args) {
    File File_One = new File("delftstack1.txt"); // Path to file one
    File File_Two = new File("delftstack2.txt"); // Path to file two

    boolean Comparison = CompareFilesbyByte(File_One.toPath(), File_Two.toPath());
    if (Comparison) {
      System.out.println("The Input files are equal.");
    } else {
      System.out.println("The Input files are not equal");
    }
  }
}

このコードは、ファイルをバイト単位で比較します。 出力は次のとおりです。

The Input files are equal.

Java での 2つのファイルの行ごとの比較

同様に、BufferedInputStream は、ファイルを読み取り、1つのファイルの各行を他のファイルの各行と比較するためにも使用されます。 BufferedReader の readline() メソッドを使用して、各行を読み取り、比較します。

例を見てみましょう。

package delftstack;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;

public class File_Compare {
  private static boolean CompareFilesbyByte(Path File_One, Path File_Two) {
    try {
      long file_size = Files.size(File_One);
      if (file_size != Files.size(File_Two)) {
        return false;
      }

      if (file_size < 2048) {
        return Arrays.equals(Files.readAllBytes(File_One), Files.readAllBytes(File_Two));
      }

      // Compare byte-by-byte
      try (BufferedReader Content1 = Files.newBufferedReader(File_One);
           BufferedReader Content2 = Files.newBufferedReader(File_Two)) {
        String line;
        while ((line = Content1.readLine()) != null) {
          if (line != Content2.readLine()) {
            return false;
          }
        }
      }

      return true;
    } catch (IOException e) {
      e.printStackTrace();
    }
    return false;
  }

  public static void main(String[] args) {
    File File_One = new File("delftstack1.txt"); // Path to file one
    File File_Two = new File("delftstack2.txt"); // Path to file two

    boolean Comparison = CompareFilesbyByte(File_One.toPath(), File_Two.toPath());
    if (Comparison) {
      System.out.println("The Input files are equal.");
    } else {
      System.out.println("The Input files are not equal");
    }
  }
}

上記のコードは、2つのファイルを 1 行ずつ比較します。 ファイルの内容が等しいため、出力は次のようになります。

The Input files are equal.

Java で Files.mismatch() を使用して 2つのファイルを比較する

最近、Java 12 は java.nio.file.Files クラスに Files.mismatch メソッドを追加して、2つのファイルを比較しました。

このメソッドは、ファイルを入力として受け取り、指定されたファイルの内容を比較します。 2つのファイルが等しい場合は -1 を返し、そうでない場合は最初の不一致バイトの位置を返します。

別のコンテンツで 3 番目のファイルを作成しました。 異なるファイルを比較する例を試してみましょう。

package delftstack;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class File_Compare {
  public static void main(String[] args) throws IOException {
    File File_One = new File("delftstack1.txt");
    File File_Two = new File("delftstack2.txt");
    File File_Three = new File("delftstack3.txt");

    long Compare1 = Files.mismatch(File_One.toPath(), File_Two.toPath());
    System.out.println(Compare1);
    long Compare2 = Files.mismatch(File_Two.toPath(), File_Three.toPath());
    System.out.println(Compare2);
  }
}

上記のコードは、最初に-1を返す必要がある2つの類似ファイルを比較し、次に最初の不一致バイトの位置を返す必要がある2つの異なるファイルを比較します。 出力を参照してください:

-1
34

Java で Apache Commons IO を使用して 2つのファイルを比較する

Apache Commons IO の FileUtils クラスは、ファイルの操作に使用されます。 contentEquals() メソッドを使用して 2つのファイルを比較し、2つのファイルの内容が等しい場合、または両方のファイルが存在しない場合に true を返します。

例を試してみましょう。

package delftstack;

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;

public class File_Compare {
  public static void main(String[] args) throws IOException {
    File File_One = new File("delftstack1.txt");
    File File_Two = new File("delftstack2.txt");

    boolean Comapre_Result = FileUtils.contentEquals(File_One, File_Two);
    if (Comapre_Result) {
      System.out.println("The input files are equal.");
    } else {
      System.out.println("The input files are not equal.");
    }
  }
}

このコードは 2つのファイルを比較し、それらが等しいかどうかを Apache の FileUtils クラスを使用してチェックします。 出力を参照してください:

The input files are equal.

Java で Arrays.equals() を使用して 2つのファイルを比較する

ファイル全体をバイト配列に読み取り、これらの配列が等しいかどうかを比較できます。 Files.readAllBytes() を使用してファイルをバイト配列に読み込み、Arrays.equals() を使用してそれらが等しいかどうかを確認できます。

この方法は、大きなファイルにはお勧めできません。 例を参照してください:

package delftstack;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;

public class File_Compare {
  private static boolean CompareFileArrays(Path File_One, Path File_Two) {
    try {
      if (Files.size(File_One) != Files.size(File_Two)) {
        return false;
      }

      byte[] First_File = Files.readAllBytes(File_One);
      byte[] Second_File = Files.readAllBytes(File_Two);
      return Arrays.equals(First_File, Second_File);
    } catch (IOException e) {
      e.printStackTrace();
    }
    return false;
  }

  public static void main(String[] args) {
    File File_One = new File("delftstack1.txt");
    File File_Two = new File("delftstack2.txt");

    boolean Compare_Result = CompareFileArrays(File_One.toPath(), File_Two.toPath());
    if (Compare_Result) {
      System.out.println("The Input files are equal.");
    } else {
      System.out.println("The Input files are not equal.");
    }
  }
}

上記のコードは、ファイルをバイト配列に読み取り、それらの配列を比較します。 出力を参照してください:

The Input files are equal.