Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

marcelobbt

Abrie arquivo e ler linha por linha

Recommended Posts

Criei um menu e um dos itens é para abrir um arquivo com um jFileChooser.

Consigo fazer ele lr o arquivo completo e jogar num textarea por exemplo, mas o que eu realmente quero é ler o arquivo texto colocando cada linha num ponto de um vetor.

 

Abaixo o código que criei do menu:

private void menuAbrirActionPerformed(java.awt.event.ActionEvent evt) {                                          
        int returnVal = escolhaArquivo.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = escolhaArquivo.getSelectedFile();
            try {
                // indica o que fará com o arquivo
                //areaTexto.read( new FileReader( file.getAbsolutePath() ), null );
               ArquivoLeitura arquivo;
               arquivo = new ArquivoLeitura();
               arquivo.lerArq(file);

            } catch (IOException ex) {
                System.out.println("problema ao acessar "+file.getAbsolutePath());
            }
        } else {
            System.out.println("Acesso ao arquivo cancelado pelo usuário.");
        }
        
        
    }

E aqui a classe para ler o arquivo:

public class ArquivoLeitura {

    /**
     *
     * @param arquivo
     * @throws IOException
     */
    public void lerArq(File arquivo) throws IOException {
        
        String linha[] = null;
        int a;
        
        
        
        FileReader reader;
        reader = new FileReader(arquivo);
        BufferedReader leitor = new BufferedReader(reader);

        a = 0;
        linha[a] = leitor.readLine();
        while(linha[a] != null) {  
            //System.out.println(linha[a]);
            linha[a] = leitor.readLine();
            a = a + 1;
        }  

    }
}

A princípio o programa roda, mas quando tento abrir o arquivo, aparece o seguinte erro:

 

Informe o número desejado
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at controlefinanceiro.ArquivoLeitura.lerArq(ArquivoLeitura.java:38)

 

A linha 38 é esta aqui: linha[a] = leitor.readLine();

Compartilhar este post


Link para o post
Compartilhar em outros sites
public void lerArq(File arquivo) throws IOException {
  String linha;
  int a = 0;

  FileReader reader = new FileReader(arquivo);
  BufferedReader leitor = new BufferedReader(reader);

  while((linha = leitor.readLine()) != null)
     System.out.println(linha);

  leitor.close(); /* Tinha esquecido dessa linha */
}

Se for para ler arquivos pequenos:

public void readFile( File file ){
    try {
        List<String> lines = Files.readAllLines( file.toPath(), Charset.forName( "UTF-8") );
        for( String line : lines ){
            System.out.println( line );
        }

    } catch( IOException ex ){}
}

readAllLines(doc): this method is intended for simple cases where it is convenient to read all lines in a single operation. It is not intended for reading in large files.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A solução que você postou funciona para exibir na tela, mas o que quero é transformar cada linha do arquivo num ponto de um vetor para que eu possa utilizar apenas algumas linhas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mostrei como resolver o problema que estava tendo (NullPointerException).

 

Agora basta salvar o conteúdo da variável "linha" em um array.

Como sugestão, ficaria mais fácil utilizando ArrayList.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como faço esse ArrayList, sou iniciante e não entendi bem como farei para salvar o conteúdo de cada linha do arquivo num índice do array se ele imprime na tela tudo de uma vez?

 

 

Não sei se consegui ser claro. Vou tentar explicar o que quero fazer:

 

ARQUIVO

linha1

linha2

linha3

 

Ao ler as linahs do arquivo, passar para a variável vetor, conforme abaixo.

 

VETOR

String vetor[];

 

vetor[0] = linha1;

vetor[1] = linha2;

vetor[2] = linha3;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue:

public ArrayList<String> getLinhasArquivo( File file ) throws FileNotFoundException, IOException{
    ArrayList<String> linhas;
        
    try (BufferedReader leitor = new BufferedReader( new FileReader(file) )) {
       linhas = new ArrayList<>();
       String linha = "";
            
       while( (linha = leitor.readLine()) != null ){
          if( linha.length() > 0 )
              linhas.add(linha);
       }
    }
    return linhas;
}

Caso queira determinada linha:

ArrayList<String> linhasDoArquivo = getLinhasArquivo(new File("C:/meuarquivo.txt"));

String linha2 = linhasDoArquivo.get(2);
String linha4 = linhasDoArquivo.get(4);

Nesse caso não será inserido no arraylist as linhas que não tiverem lenght > 0. Então pode ser que ocorra casos do tipo:

 

arquivo.txt

1 - a

2 - b

3 - c

4 - d

 

retorno: [ a,b,c,d]

 

arquivo2.txt

1 - a

2 -

3 - c

4 - d

 

retorno: [a, c, d]

 

Nesse segundo, se tentar acessar a linha 2 ele mostrará o conteúdo de C (que corresponde a linha 3) justamente porque a linha 2 está vazia.

 

Se quiser que ele mostre as linhas vazias também, basta alterar o trecho dentro do while para:

while( (linha = leitor.readLine()) != null ){
   String s = linha == null || linha.isEmpty() ? " " : linha;
   linhas.add(s);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.