The code is a mess, but I close the last opened stream at line44, before the mess starts. Validator says The file input streams (FileReader) must be closed.
Mentor message: Be sure that the file input stream for the file is closed.
package com.codegym.task.task19.task1916;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/*
Tracking changes
*/
public class Solution {
public static List<LineItem> lines = new ArrayList<>();
public static void main(String[] args) throws Exception {
BufferedReader brOriginal = new BufferedReader(new InputStreamReader(System.in));
String fileName1 = "F:/original.txt";//brOriginal.readLine();
String fileName2 = "F:/updated.txt";// brOriginal.readLine();
brOriginal.close();
FileReader fileOriginal = new FileReader(fileName1);
brOriginal = new BufferedReader(fileOriginal);
FileReader fileUpdated = new FileReader(fileName2);
BufferedReader brUpdated = new BufferedReader(fileUpdated);
boolean jumpUpdated = false, jumpOriginal = false;
String lineOriginal = new String(), lineUpdated = new String(),
innerOriginalReader = new String(), innerUpdatedReader = new String();
boolean nearEnd = false, realEnd = false;
while(!realEnd){
if(!jumpOriginal) {
lineOriginal = brOriginal.readLine();
if(lineOriginal == null) nearEnd = true;
}
if(!jumpUpdated){
lineUpdated = brUpdated.readLine();
if(lineUpdated == null) nearEnd = true;
}
if(nearEnd || lineUpdated.equals(lineOriginal)){
if(!nearEnd) {
lines.add(new LineItem(Type.SAME,lineOriginal));
if (lineOriginal.equals(innerOriginalReader)) jumpOriginal = false;
else lineOriginal = innerOriginalReader;
if (lineUpdated.equals(innerUpdatedReader)) jumpUpdated = false;
else lineUpdated = innerUpdatedReader;
} else realEnd = true;
}
if(nearEnd || !lineUpdated.equals(lineOriginal)) {
innerOriginalReader = brOriginal.readLine();
System.out.println(lineUpdated + " -- " + innerOriginalReader);
innerUpdatedReader = brUpdated.readLine();
nearEnd = innerOriginalReader == null || innerUpdatedReader == null;
if(lineUpdated.equals(innerOriginalReader)){
lines.add(new LineItem(Type.REMOVED,lineOriginal));
lineOriginal = innerOriginalReader;
jumpOriginal = true;
jumpUpdated = true;
}
else {
lines.add(new LineItem(Type.ADDED,lineUpdated));
lineUpdated = innerUpdatedReader;
jumpUpdated = true;
jumpOriginal = true;
}
}
}
fileOriginal.close();
fileUpdated.close();
brOriginal.close();
brUpdated.close();
System.out.println("JumpOriginal : " + jumpOriginal);
System.out.println("JumpUpdated: " + jumpUpdated);
System.out.println("lineOriginal: " + lineOriginal);
System.out.println("lineUpdated: " + lineUpdated);
System.out.println("innerOriginalReader: " + innerOriginalReader);
System.out.println("innerUpdatedReader: " + innerUpdatedReader);
doMergeFile();
}
public static enum Type {
ADDED, // New line added
REMOVED, // Line deleted
SAME // No change
}
public static class LineItem {
public Type type;
public String line;
public LineItem(Type type, String line) {
this.type = type;
this.line = line;
}
}
public static String typeWrite(Type a){
if(a == Type.ADDED) return "ADDED ";
if(a == Type.REMOVED) return "REMOVED ";
else return "SAME ";
}
public static void doMergeFile() throws IOException {
FileWriter fw = new FileWriter("F:/merged.txt");
for(LineItem a : lines){
String s = typeWrite(a.type) + a.line;
fw.write(s + "\r\n");
}
fw.close();
}
public static boolean bothValid(String a,String b){
return (a!=null && b!=null);
}
}