Compare Two Different Files Line by Line in Java

In this article, we will compare two different text files which are saved in our system. We will check line by line of each text file, by comparing those we can identify the similarities and differences.

Let?s see how we can do it by using the Java programming language.

To Show You Some Instances

Instance-1

Below figure depict two different text files with same content and hence output will be two files with same content.

Instance-2

Below represents two files, say file1.txt and file2.txt with their content.

file1.txt

This is amazing.
Java Language.

file2.txt

This is amazing.
Python Language.

Here, we can notice both the files have different content at line-2. As file1, line-2 contains ?Java Language? and file2, line-2 contains ?Python Language?

Algorithm

  • Step 1 ? Create reader1 and reader2 as two BufferedReader objects and use them to read the two input text files line by line.

  • Step 2 ? Create two variables. First, create a boolean variable called "areEqual" and initialise it to true. Second, create an int variable called "lineNum" and initialise it to 1. areEqual is a flag variable that is initially set to true and is changed to false when the input files' contents differ. The number of lines will be held in lineNum.

  • Step 3 ? Read the contents of File 1 into Line 1 and File 2 into Line 2.

  • Step 4 ? Continue reading the lines from files file1 and file2 into line1 and line2, respectively, until both files have been read through. Set "areEqual" to false if either line1 or line2 is null.

  • Step 5 ? Declare that the content of both files is identical if areEqual is true. If the value of 'areEqual' is false, declare that the contents of the files are distinct.

  • Step 6 ? Close the resources.

Multiple Approaches

We have provided the solution in different approaches.

  • By Using BufferedReader Class

  • By Using Memory Mapped File

Let?s see the program along with its output one by one.

Approach-1: By Using BufferedReader Class

Example

In this approach you will create objects of BufferedReader class and by using inbuilt readLine() method you will read content of both files and compare.

<div class="code-mirror  language-java" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">BufferedReader</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">FileReader</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">IOException</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Main</span><span class="token punctuation">{</span>   
   <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span><span class="token punctuation">{</span>   

   <span class="token class-name">BufferedReader</span> reader1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BufferedReader</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">FileReader</span><span class="token punctuation">(</span><span class="token string">"E:\file1.txt"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  
   <span class="token class-name">BufferedReader</span> reader2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BufferedReader</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">FileReader</span><span class="token punctuation">(</span><span class="token string">"E:\file2.txt"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token class-name">String</span> line1 <span class="token operator">=</span> reader1<span class="token punctuation">.</span><span class="token function">readLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>    
      <span class="token class-name">String</span> line2 <span class="token operator">=</span> reader2<span class="token punctuation">.</span><span class="token function">readLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">int</span> lineNum <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>  
      <span class="token keyword">boolean</span> areEqual <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
      <span class="token keyword">while</span> <span class="token punctuation">(</span>line1 <span class="token operator">!=</span> <span class="token keyword">null</span> <span class="token operator">||</span> line2 <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
         <span class="token keyword">if</span><span class="token punctuation">(</span>line1 <span class="token operator">==</span> <span class="token keyword">null</span> <span class="token operator">||</span> line2 <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
            areEqual <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span> 
            <span class="token keyword">break</span><span class="token punctuation">;</span>
         <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span> line1<span class="token punctuation">.</span><span class="token function">equalsIgnoreCase</span><span class="token punctuation">(</span>line2<span class="token punctuation">)</span><span class="token punctuation">) </span><span class="token punctuation">{</span>
            areEqual <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span> 
            <span class="token keyword">break</span><span class="token punctuation">;</span>
         <span class="token punctuation">}</span>
         line1 <span class="token operator">=</span> reader1<span class="token punctuation">.</span><span class="token function">readLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>  
         line2 <span class="token operator">=</span> reader2<span class="token punctuation">.</span><span class="token function">readLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
         lineNum<span class="token operator">++</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
      <span class="token keyword">if</span><span class="token punctuation">(</span>areEqual<span class="token punctuation">)</span><span class="token punctuation">{</span>
         <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Both the files have same content"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}<font color="#000000"> </font></span><span class="token keyword">else </span><span class="token punctuation">{</span>
         <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Both the files have different content"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"In both files, there is a difference at line number: "</span><span class="token operator">+</span>lineNum<span class="token punctuation">)</span><span class="token punctuation">;</span> 
         <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"One file has "</span><span class="token operator">+</span>line1<span class="token operator">+</span><span class="token string">" and another file has "</span><span class="token operator">+</span>line2<span class="token operator">+</span><span class="token string">" at line "</span><span class="token operator">+</span>lineNum<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
      reader1<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      reader2<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</div>

Output

Both the files have different content
In both files, there is a difference at line number: 2
One file has Java Language. and another file has Python Language. at line 2

Note ? Here the input scenario was like instance-2 which is explained above.

Approach-2: By Using Memory Mapped Files

Example

In this approach, we will make use of the memory-mapped file concept which is a kernel object that maps bytes from a disk file to the system's memory address and by manipulating the contents of the memory-mapped files we can get to know whether the contents are same or different.

<div class="code-mirror  language-java" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">File</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>nio<span class="token punctuation">.</span>file<span class="token punctuation">.</span></span><span class="token class-name">Path</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>nio<span class="token punctuation">.</span>file<span class="token punctuation">.</span></span><span class="token class-name">Paths</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">IOException</span><span class="token punctuation">;</span>  
<span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">RandomAccessFile</span><span class="token punctuation">;</span> 
<span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>nio<span class="token punctuation">.</span></span><span class="token class-name">MappedByteBuffer</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token namespace">java<span class="token punctuation">.</span>nio<span class="token punctuation">.</span>channels<span class="token punctuation">.</span></span><span class="token class-name">FileChannel</span><span class="token punctuation">;</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Main</span> <span class="token punctuation">{</span>  
   <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token class-name">Path</span> path1 <span class="token operator">=</span> <span class="token class-name">Paths</span><span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"E://file1.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token class-name">Path</span> path2 <span class="token operator">=</span> <span class="token class-name">Paths</span><span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"E://file2.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token function">compare</span><span class="token punctuation">(</span>path1<span class="token punctuation">,</span>path2<span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token punctuation">}</span>
   <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">compare</span><span class="token punctuation">(</span><span class="token class-name">Path</span> path1<span class="token punctuation">,</span> <span class="token class-name">Path</span> path2<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">try</span> <span class="token punctuation">{</span>
         <span class="token class-name">RandomAccessFile</span> randomAccessFile1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">RandomAccessFile</span><span class="token punctuation">(</span>path1<span class="token punctuation">.</span><span class="token function">toFile</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"r"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 
         <span class="token class-name">RandomAccessFile</span> randomAccessFile2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">RandomAccessFile</span><span class="token punctuation">(</span>path2<span class="token punctuation">.</span><span class="token function">toFile</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"r"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token class-name">FileChannel</span> ch1 <span class="token operator">=</span> randomAccessFile1<span class="token punctuation">.</span><span class="token function">getChannel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token class-name">FileChannel</span> ch2 <span class="token operator">=</span> randomAccessFile2<span class="token punctuation">.</span><span class="token function">getChannel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token keyword">if</span> <span class="token punctuation">(</span>ch1<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> ch2<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Both files have different content"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token punctuation">}</span>
         <span class="token keyword">long</span> size <span class="token operator">=</span> ch1<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token class-name">MappedByteBuffer</span> m1 <span class="token operator">=</span> ch1<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token class-name">FileChannel<span class="token punctuation">.</span>MapMode</span><span class="token punctuation">.</span>READ_ONLY<span class="token punctuation">,</span> <span class="token number">0L</span><span class="token punctuation">,</span> size<span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token class-name">MappedByteBuffer</span> m2 <span class="token operator">=</span> ch2<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token class-name">FileChannel<span class="token punctuation">.</span>MapMode</span><span class="token punctuation">.</span>READ_ONLY<span class="token punctuation">,</span> <span class="token number">0L</span><span class="token punctuation">,</span> size<span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token keyword">if</span> <span class="token punctuation">(</span>m1<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>m2<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Both files have same content"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
         <span class="token punctuation">}</span>
      <span class="token punctuation">}</span>
      <span class="token keyword">catch</span><span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span><span class="token punctuation">{</span>
         <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
   <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</div>

Output

Both files have same content

Note ? Here both the files which we have considered, they are having the same content.

In this article, we explored how to compare content of two different text files line by line in Java.

Updated on: 2023-01-11T11:28:39+05:30

5K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements