Dunque, ho provato a risolvere con il seguente codice...(dove P01 è il famoso codice di interruzione)

codice:
public class LetturaFile 
{
	private BufferedReader reader;
	private String riga;
	private String percorsoFile;
	private ArrayList<String> lettera;
	private boolean primaLettera =true;	
	
	
	public LetturaFile(String percorsoFile)
	{
		this.percorsoFile=percorsoFile;
		this.reader = RecuperoValori.ottieniBufferedReader(percorsoFile);
	}
	public  String leggi()
	{		
		try
		{
			riga= reader.readLine();
		}
		catch(IOException e)
		{
			System.out.println(e.getMessage());
		}
		return riga;
	}
	
	ArrayList<String> ottieniLettera()
	{
		if(primaLettera)
		{
		        riga =leggi();
		}		
		while(riga!=null)
		{
			if(IsCodiceInterruzione())
			{				
				lettera= new ArrayList<String>();
				lettera.add(riga);
				try {
					riga=reader.readLine();
				} catch (IOException e) {
					System.out.println(e.getMessage());
				}
				aggiungiRighe();				
				return lettera;
			}
			else
				riga=leggi();
		}
		return null;
	}
	
	ArrayList<String> aggiungiRighe()
	{
		
		while(!riga.substring(0,3).matches("P01"))
		try 
		{
			lettera.add(riga);
			riga= reader.readLine();
			if(riga==null)
			{
				break;
			}
		} 
		catch (IOException e) 
		{
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
		primaLettera=false;
		
		return lettera;
		
	}
	
	boolean IsCodiceInterruzione()
	{
		if(riga.length()>2 && riga.substring(0,3).matches("P01"))
			return true;
		else return false;
	}
}


che mi da il seguente errore:

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3209)
at java.lang.String.<init>(String.java:215)
at java.io.BufferedReader.readLine(BufferedReader.jav a:331)
at java.io.BufferedReader.readLine(BufferedReader.jav a:362)
at oggetti.LetturaFile.aggiungiRighe(LetturaFile.java :80)
at oggetti.LetturaFile.ottieniLettera(LetturaFile.jav a:64)
at oggetti.LetturaFile.ottieniRisultatoFiltrato(Lettu raFile.java:114)

(non ho postato il codice di ottieniRisultatoFiltrato perchè sarebbe poco comprensibile...)

La cosa che non riesco a capire è perchè se lo faccio partire senza interfaccia grafica funziona tranquillamente mentre se "monto" la funzione su interfaccia grafica va spedito fino alla lettera numero 6700~ dopodichè inizia a rallentare e dopo un altro centinaio di lettere va in eccezione...
(PS qualsiasi suggerimento per migliorare il codice è sempre ben gradito ...)