BufferedReader não lê o arquivo inteiro

Olá pessoal, estou precisando ler um arquivo de texto contendo informações sobre empresas
como cadastro de cnpj e outros, o arquivo possui uma sequencia, sendo possivel separar cada consulta e jogar em uma variavel diferente , não sei porque mas o BufferedReader não esta lendo todo o arquivo quando chega a + ou - 40% do mesmo o método readLine retorna o valor nulo, sinal de que chegou o fim do arquivo .
Alguem pode me ajudar ?
O Código esta ai :

[code] File Arquivotxt=null;
String linha;
StringBuffer Buffer;
boolean flagexit=false,flag=false;
java.util.ArrayList Arquivos = new java.util.ArrayList();

     File Diretorio = new File("/mnt/");
    jFileChooser1.setMultiSelectionEnabled(true);
    jFileChooser1.setFileSelectionMode(JFileChooser.FILES_ONLY);
    jFileChooser1.setCurrentDirectory(Diretorio);
    int counter=0;
    int retorno = jFileChooser1.showOpenDialog(null);
    
    if(retorno==JFileChooser.APPROVE_OPTION) {
        Arquivotxt = jFileChooser1.getSelectedFile();
    
    
    
    
   
    try{
    FileInputStream teste = new FileInputStream(Arquivotxt);       
    BufferedReader in = new BufferedReader(new FileReader(Arquivotxt));

    
    
    while(((linha = in.readLine())!=null)){
        
        Buffer = new StringBuffer();
        flag=true;
        flagexit=true;
          
        while(flagexit){
            linha = in.readLine();
            if(linha!=null){  
                if((linha.indexOf("RELATORIO ANALITICO"))!=-1) //TRECHO INICIAL DE 
                flagexit=false;                                                            //CADA REGISTRO
            } else flagexit=false;
        }
        
        if(linha!=null){
        
        if((linha.indexOf("RELATORIO ANALITICO"))!=-1){
            Buffer.append(linha+"\n");
            linha = in.readLine();
            if((linha.indexOf("RELATORIO ANALITICO"))==-1){
            Buffer.append(linha+"\n");
            
            
            while(flag){
                
                linha=in.readLine();
                if(linha.indexOf("+")==-1)//TRECHO FINAL DE CADA REGISTRO
                    Buffer.append(linha+"\n");
                else {
                    Buffer.append(linha+"\n");
                    flag=false;
                }
            }
            }
        }
        System.out.println(Buffer.substring(0));
        Arquivos.add(Buffer.substring(0));   
        
        counter++;
        
        }           
    }
    in.close();    
    System.out.println("Numeros de registros "+(Arquivos.size()-1)+" contador ="+counter);
    
    
    
    }catch(FileNotFoundException e){
        e.printStackTrace();
        System.out.println("Arquivo não encontrado");
    }catch(IOException ex){
        ex.printStackTrace();
        System.out.println("Erro de entrada e saida");
    }
    
   VisuArqtxt visualiza = new VisuArqtxt(Arquivos,jTextAreaSCPC); //Classe que visualiza o ArrayList e mostra para o usuario os registros do arquivo
   visualiza.show();
    
    }[/code]

Acho que você está lendo o valor da linha em 4 lugares diferentes do seu loop.
Leia a linha apenas uma vez (no topo do seu loop), que você deve estar se perdendo em algum lugar.
Use uma máquina de estados para determinar em que passo da leitura você está (se na leitura de relatórios, ou sei lá o que que você está querendo ler).

Segue exemplo para uma comparação:

File arq = new File("c:\\teste.txt");
BufferedReader leitor = new BufferedReader(new FileReader(arq));

String line = null;
while ((line = leitor.readLine()) != null) {
     System.out.println(line);
}

leitor.close();