I/O 初級

ファイルをメモリに読み込まずに効率的に比較する。

✕ Java 8
// Compare two files byte by byte
byte[] f1 = Files.readAllBytes(path1);
byte[] f2 = Files.readAllBytes(path2);
boolean equal = Arrays.equals(f1, f2);
// loads both files entirely into memory
✓ Java 12+
long pos = Files.mismatch(path1, path2);
// -1 if identical
// otherwise: position of first difference
このコードに問題がありますか? お知らせください。

メモリ効率的

ファイル全体をバイト配列に読み込みません。

🎯

差分を特定

最初の不一致の正確なバイト位置を返します。

📏

1回の呼び出し

手動のバイト配列比較ロジックが不要です。

旧来のアプローチ
手動バイト比較
モダンなアプローチ
Files.mismatch()
JDKバージョン
12
難易度
初級
Files.mismatch()
利用可能

JDK 12(2019年3月)以降、広く利用可能

Files.mismatch()は最初に異なるバイトの位置を返し、ファイルが同一の場合は-1を返します。遅延読み取りを行い、最初の違いで処理を短絡します。

共有 𝕏 🦋 in