[RESOLVIDO] Demorando para carregar um arquivo .txt no jTextArea

Olá, recentemente fiz um post para tirar dúvidas sobre ler arquivos de .txt dentro do jTextArea.
Está funcionando normalmente, abre o arquivo completo e tudo mais… Porém o txt que estou tentando abrir é pesado chega ser por volta dos 4MB o arquivo de texto e demora uns 5 min para abrir o arquivo no jTxtArea.

Arquivo .txt para fazerem teste: https://drive.google.com/open?id=1y-NYklDUrILaYaRwz2I3_MHqVYqvIrad

A questão é, ele demora um pouco mesmo para carregar o arquivo ou estou fazendo isso errado? Vou postar o código rsrs

public void buscar(){
    String texto="";
    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);
       caminho=file.toString();
       jTextField1.setText(file.toString());
       jTextField1.setEditable(false);
        BufferedReader bis = new BufferedReader(fis);

            while(bis.ready()){
                //System.out.println(bis.readLine()+"\n");
                texto=texto+bis.readLine()+"\n";
            }
            jTextArea1.setText(texto);
            bis.close();
            fis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e){
            e.printStackTrace();
        }
        
    }
}

Faz uma Thread

@rodriguesabner Olá Abner, a Thread vai permitir que o usuário continue mexendo sem travar a aplicação, porém o tempo para abrir o conteúdo no txtArea ainda é o mesmo

Achei que o textaArea ia sendo preenchido conforme era lido…

Sim, mas não diminui o tempo que demora para ser lido o arquivo, o problema está ai rsrs se tem alguma coisa que pode ser feita para melhorar o tempo de ler o arquivo, os arquivo são pesados 4MB por ai…

Isso é devido à excessiva alocação e desalocação de String na linha abaixo:

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

Faça assim:

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());
        try {
            caminho = file.getAbsolutePath();
            jTextField1.setText(file.toString());
            jTextField1.setEditable(false);
            BufferedReader reader = new BufferedReader(new FileReader(file));
            StringBuilder texto = new StringBuilder();
            String linha = null;
            while ((linha = reader.readLine()) != null) {
                texto.append(linha).append("\n");
            }
            jTextArea1.setText(texto.toString());
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Se dessa forma continuar lento para a sua aplicação, então utilize esta forma:

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());
        try {
            caminho = file.getAbsolutePath();
            jTextField1.setText(file.toString());
            jTextField1.setEditable(false);
            byte[] buffer = new byte[8192];
            InputStream in = new FileInputStream(file);
            ByteArrayOutputStream out = new ByteArrayOutputStream((int) file.length());
            for (int lidos = -1; (lidos = in.read(buffer)) != -1; out.write(buffer, 0, lidos)) {} // for vazio mesmo :)
            jTextArea1.setText(new String(out.toByteArray()));
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
3 curtidas

Show de bola! O primeiro procedimento funcionou beleza. Obrigado @staroski!!!

2 curtidas