package com.fsenablers.io; import java.io.*; import java.util.regex.*; public class MultilineReader { private BufferedReader bufferedReader; private String preReadLine; private Pattern lineRegExPattern; public MultilineReader( BufferedReader reader, String lineRegExStr ) { bufferedReader = reader; lineRegExPattern = Pattern.compile( lineRegExStr ); } public String readLine() throws IOException { String line = null; boolean done = false; StringBuffer lineOfText = new StringBuffer(); // use any previously read line part if( preReadLine != null ) { lineOfText.append( preReadLine ); preReadLine = null; } do { String currentLine = bufferedReader.readLine(); if( currentLine == null ) { if( lineOfText.length() > 0 ) { line = lineOfText.toString(); } done = true; } else { if( lineRegExPattern.matcher( currentLine ).matches() ) { // matches the pattern for a new line if( lineOfText.length() > 0 ) { // current line ended preReadLine = currentLine; line = lineOfText.toString(); done = true; } else { // start of new line lineOfText.append( currentLine ); } } else { // append to existing line if( lineOfText.length() > 0 ) { lineOfText.append( "\r\n" ); } lineOfText.append( currentLine ); } } } while( !done ); return line; } public void close() throws IOException { bufferedReader.close(); } public static void main( String[] args ) throws Exception{ String filePath = "X:\\_devteam\\chris\\US_20140627131944.txt"; // BufferedReader reader = new BufferedReader( new FileReader( "X:\\_devteam\\chris\\US_20140627131944.txt" )); if( 1 == 2 ) { String encoding = null; // In order to read files with non-default encoding, specify an encoding in the FileInputStream constructor. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath))); char buffer[] = new char[3]; int length = bufferedReader.read(buffer); if (length >= 2) { if ((buffer[0] == (char) 0xff && buffer[1] == (char) 0xfe) /* UTF-16, little endian */ || (buffer[0] == (char) 0xfe && buffer[1] == (char) 0xff) /* UTF-16, big endian */) { encoding = "UTF16"; } } if (length >= 3) { if (buffer[0] == (char) 0xef && buffer[1] == (char) 0xbb && buffer[2] == (char) 0xbf) /* UTF-8 */ { encoding = "UTF8"; } } bufferedReader.close(); System.out.println( "Encoding = " + encoding ); BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( filePath ), encoding )); } BufferedReader reader = new BufferedReader( new FileReader( "X:\\_devteam\\chris\\US_20140627131944.txt" )); char buffer[] = new char[3]; int length = reader.read(buffer); String rx1 = "^CANADA.*|^US.*"; String rx2 = ".*"; MultilineReader mlr = new MultilineReader( reader, rx1 ); String line = mlr.readLine(); int lineCount = 0; while( line != null) { System.out.println( "START"); System.out.println( line ); System.out.println( "END" ); System.out.println(); line = mlr.readLine(); lineCount++; if( lineCount == 3 ) { break; } } mlr.close(); } }