[RESOLVIDO] Ler arquivo .txt e mostrar no jTxtArea

20 respostas Resolvido
java
G

Olá comunidade, sou novo em programação java. Estou tentando fazer uma aplicação que leia um arquivo .txt e ao abrir esse arquivo ele mostra no jTxtArea.

No Print, pelo compilador, mostra todo o conteudo do arquivo, mas ao tentar jogar no txtArea pega só a última linha, ajudem ai :slight_smile:

Segue o código:

public void buscar(){

FileNameExtensionFilter fileNameExtensionFilter = new FileNameExtensionFilter(

txt, txt);

JFileChooser fc = new JFileChooser();

fc.setFileFilter(fileNameExtensionFilter);

fc.setDialogTitle(Escolha o arquivo);

int resposta = fc.showOpenDialog(null);
if(resposta == JFileChooser.APPROVE_OPTION){
    File file = new File(fc.getSelectedFile().getAbsolutePath());
    FileReader fis;
   try {
   fis = new FileReader(file);
    BufferedReader bis = new BufferedReader(fis);
    
        while(bis.ready()){
            //System.out.println(bis.readLine()+"\n");
            jTextArea1.setText(bis.readLine()+"\n");
        }
        bis.close();
        fis.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e){
        e.printStackTrace();
    }
    
}

}

20 Respostas

M

A cada iteração, você esta esta sobrescrevendo o valor do textArea ao invés de armazenar o valor por completo.

Você tem que armazenar o valor da linha em uma variável e então quando o while acabar, você passa o valor pro textArea.

G

Tentei assim:

String texto;

coloquei dentro do while

while(bis.ready()){

texto=bis.readLine()+"\n";

}

jTextArea1.setText(texto);

mas mesmo assim pega a ultima

R
public void lerTXT() {

    String nome = (pasta);
    //System.out.printf("Conteúdo do arquivo texto:\n");
    try {
        FileReader arq = new FileReader(nome);
        BufferedReader lerArq = new BufferedReader(arq);
        String linha = lerArq.readLine();
        // lê a primeira linha
        // a variável "linha" recebe o valor "null" quando o processo
        // de repetição atingir o final do arquivo texto
        while (linha != null) {
            //System.out.printf("%s\n", linha);
            linha = lerArq.readLine(); // lê da segunda até a última linha
        }
        arq.close();
    } catch (IOException e) {
        System.err.printf("Erro na abertura do arquivo: %s.\n", e.getMessage());
    }
    System.out.println();
}
R

Aqui vc coloca sua jTextArea: jTextArea.setText(linha);

E aqui vc coloca o jTextArea.append(linha);

M

Você quase acertou
Você não esta concatenando o valor da variavel, esta sempre atribuindo um novo

O certo seria:
texto = texto + bis.readLine()+"\n";
Ou seja, o texto vai ter o VALOR ANTERIOR mais o NOVO VALOR

G

Obrigado @rodriguesabner e @Mike deu certo, coloquei a variável valendo texto=""; dai executou sem o null.

G

Tenho mais uma dúvida. Eu estou lendo um arquivo .txt com as seguintes informações:

0000003043011220150615013848293314
0000003043011220160615013848293314
0000003043011220170615013848293314
0000003043011220180615013848293314
0000003043011220180615013848293314

Onde está em negrito no .txt seria correspondente ao ano. Tenho um jtxtField onde passarei o ano para o usuario digitar. Gostaria de criar um Botão “Atualizar” por exemplo, que ao clicar limpasse as linhas anteriores, ou criasse um novo texto dentro do jTextArea. Alguma ideia? rsrs

M

Só usar setText, para setar o texto

Não entendeu muito bem ainda né?

seuTextArea.setText("");//Limpa o conteúdo do textArea
seuTextArea.setText(“Novo texto”);//O textArea vai ter o valor: Novo Texto

G

Sim, até ai entendi, mas percorrer o arquivo e pegar só as linhas que possuem o ano de 2018 na linha… e jogar no jtxtArea que ta o problema

G

Resumindo o que estou querendo fazer.
Em um arquivo texto.txt por exemplo tenho os dados:

0000003043011220150615013848293314
0000003043011220160615013848293314
0000003043011220170615013848293314
0000003043011220180615013848293314
0000003043011220180615013848293314

No caso queria pegar de um arquivo .txt os dados da linha que o usuario entrar, por exemplo, ao digitar 2018 mostrar a linha apenas que contenham o 2018. Ou ao digitar 4 ele mostrar todas as linhas pra frente a partir da linha 4, entenderam? rs

Achei um método de ler as linhas porém lê uma por vez…

public void limpar()

{

try{

RandomAccessFile leitura = new RandomAccessFile(texto.txt,r);

leitura.seek(4); // numero da linha a ser exibida

String linha = leitura.readLine();

System.out.println(linha);

jTextArea1.setText(linha);

}

catch(IOException e)

{

e.printStackTrace();

}

}
G

No caso eu teria que fazer um contador dentro do leitura.seek(4); certo?

for(i=0;i<10;i++){

linha = leitura.readLine();

leitura.seek(i);

System.out.print(linha+"\n");

}
M

Você pode adicionar cada linha do arquivo em um array de String.

Depois de ler todo o arquivo, você ve qual o ano que vai querer.

Para verificar qual elemento do array tem o ano desejado, você terá que iterar e então usar o método contains da classe String para verificar se aquele elemento possui a palavra (no caso o ano) que você quer, se tiver, você adiciona esse elemento do array ao texto do textArea

G

Entendi, seria algo assim?

public void limpar(){

String nome[] = new String [1];

for(int i=0;i<1;i++){

nome[i]=jTextArea1.getText();

if(nome[i].contains(2018)){

System.out.println(nome[i]);

}

}

}

assim ele está mostrando todos os resultados ainda.
Pelo que percebi a variavel nome está pegando tudo que está no txtArea e atribuindo a ela, não está pegando linha por linha…

M

Ainda não.

Leia o arquivo e adicione cada linha a um novo elemento do array ou ArrayList.

Depois de ter adicionado todas as linhas, itere sobre esse array ou ArrayList.

Isso esta razoalvelmente certo, posteriormente altere o “2018” por uma váriavel :+1:

Nó código que você postou, você adicionou o conteudo todo do textArea em um elemento do array, e isso é diferente do que eu sugeri

G

@Mike consegui fazer ler as linhas de 2018, porém só pelo System.out… Quando jogo no txtArea ele pega o ultimo valor

public void limpar(){
    List<String> texto = new ArrayList();
    String arquivoT = "texto.txt";
    File arquivo = new File(arquivoT);
            try {
                BufferedReader in = new BufferedReader(new FileReader(arquivo));
                String dados=null;
                while (in.ready()) {
                    dados = in.readLine(); // aqui eu pego linha a linha do txt
                    texto.add(dados); // aqui eu armazeno a linha do txt em um List
                    if(dados.contains("2018")){
                    System.out.println("2018 = "+dados);// aqui mostra todos
                    jTextArea1.setText(dados);// aqui mostra o ultimo valor
                }
                }
                in.close();
            }catch (IOException e){
                System.out.println(e);
            }    
}
M

Claro que só mostra o último, vc ta inserindo um novo valor. (Isso já foi comentado anteriormente).

Se você quer mostrar todas as ocorrências que possuem 2018, você deve concatenar o valor em uma variável e então dar o setText, ou no setText vc. usa o método getText e concatena com a variável dados.

R

Conseguiu resolver Gabriel?

G

Ainda não @rodriguesabner

R
Solucao aceita

no TextArea vc tem que jogar o jTextArea.append(oqvcquiser);

G

Beleza, deu certo! :slight_smile:

Criado 16 de julho de 2018
Ultima resposta 18 de jul. de 2018
Respostas 20
Participantes 3