[RESOLVIDO] Leitura de arquivo texto

Srs, muito boa noite.

Estou fazendo um programa em java, que lê um arquivo texto como mostrado abaixo.

"trecho de uma música baixado no cifra club e transformado em um arquivo .txt

C G/B Am7 Am7/G
Ao único que é digno de receber
F C/E
A honra e a glória
Dm7 G4 G
A força e o poder.

É um programa pessoal, que lê cifras para aprender teclado musical. O programa lê somente a linha com as cifras (C G/B Am7 Am7/G), conforme o programa vai lendo cada cifra, ele teria que mostrar ao lado, numa label (lblnota), a imagem da posição do teclado musical em JPG.

O programa hoje, faz a leitura das linhas com as cifras, mas na hora que mando colocar uma cifra dentro de um JTextField e a imagem do teclado daquela cifra em uma Label, ele só mostra a ultima cifra, tanto na JTextField (txtposicao) quanto a imagem no Label (lblnota). Seria o caso de mandar o programa executar cada linha dentro do For ???

Alguém saberia me dizer porque o programa só mostra na txtposicao e na lblnota a ultima cifra que ele Lê do texto ??? Abaixo segue uma parte do programa.

import static Formularios.FrmVisMusicas.txtpmusica;
import java.awt.Image;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import javax.swing.ImageIcon;

public class FrmMusicaPlay extends javax.swing.JInternalFrame {
    public static void main (String [] args){
   }
    private Object reader;
    private void BtnsairActionPerformed(java.awt.event.ActionEvent evt) {                                        
        this.dispose();
    }                                       
    private void btniniciarActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // Quando clico no botão iniciar
       File arquivo = new File("C:\\MUSIC PLAY\\Musicas\\"+txtpmusica.getText()+".txt");
       
       try{
       BufferedReader ler = new BufferedReader(new FileReader(arquivo));
        String lin = ler.readLine();   
        while (lin !=null) {
           String[ ] notas = lin.split("\\s");
           for (String nota : notas) {
             if (!nota.equals("")) {
                txtposicao.setText (nota);
                System.out.println(nota);
                ImageIcon imageIcon = new ImageIcon(new ImageIcon("c:/MUSIC 
                PLAY/Notas/"+txtposicao.getText()+ 
                 ".jpg").getImage().getScaledInstance(599,243,Image.SCALE_DEFAULT)); 
                  lblnota.setIcon(imageIcon);
                   Thread.sleep(3000);  //coloco este comando para dar um tempo mostrando a cifra no 
                                                        label e no JTestField
          }
          }  //Fim do for
              lin = ler.readLine();        // faço o lin = ler.readLine(); duas vezes, para ele pular 2 linhas. 
              lin = ler.readLine();       // Isso fará ele ler somente a linha com as cifras
         } //Fim while   
       
           }catch (Exception ex){
                  
    }                                          
                
        } //Fim do private void btniniciarActionPerformed  

    // Variables declaration - do not modify                     
    private javax.swing.JButton Btnsair;
    private javax.swing.JButton btniniciar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JLabel lblnota;
    private javax.swing.JTextArea txtareamus;
    private javax.swing.JTextField txtposicao;
    // End of variables declaration                   

     } // Fim do Public Class

Agradeço desde já a ajuda, pois não tenho mais ninguém para me ajudar.

Muito obrigado e fiquem todos com Deus.

Armando Barbosa Junior

Boa noite, você pode colocar tudo em um ArrayList e depois ir setando o que está no array

BufferedReader br = new BufferedReader(new FileReader("seu-arquivo.txt"));
String linha = br.readLine();
ArrayList<String> lista = new ArrayList<>();
lista.add(linha); //primeira linha

while(linha != null){
   linha = br.readLine();
   listOfString.add(linha); //segunda linha em diante.
}

Aí vc faz um for pra pegar as linhas e mostrar tudo,

for(int i = 0; 0 < lista.size(); i++){
   lista.get(i);
}

Vc tbm pode pegar os dados de forma manual

 lista.get(1);
 ......

Amigo, boa tarde, eu quase não dormi esta noite, pensei que fosse por causa do for, no Java ele só mostra a nota depois de terminar o loop, por isso mostra a última nota, vou fazer como vc mandou, muito obrigado mesmo , tomara que funcione e fique com Deus.

Amigo, eu só não posso pegar os dados manualmente, porque eu não sei a quantidade de dados que irei ler, tenho que fazer automaticamente mesmo. Na linha lida pode conter 3, 4, 5, 6 … cifras para serem lidas, mas a sua rotina creio que irar funcionar bem, já me esclareceu muito, abç ,muito obrigado e fique com Deus.

Armando Barbosa Junior

Olha esse método, mais simples, testei aqui e funcionou tranquilo:

    File file = new File("arquivo.txt");
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader(file));
        String texto = null;
        String texto_a = null;

        while ((texto = br.readLine()) != null) {
            texto_a += "\n" + texto;
        }
        jTextArea1.setText(texto_a);
    } catch (Exception e) {
        e.printStackTrace();
    }

Amigo, fiz a rotina conforme vc me mandou, ela lê todas as linhas e armazena cada linha em lista, mas quando vou pega-las, com o comando txtposição.setText(lista.get(i)); ou também com o comando System.out.println(lista.get(i)); não aparece nada. Inclusive eu troquei esta linha listOfString.add(linha); que estava dando erro, por lista.add (linha); //segunda linha em diante. O que pode estar dando erro ? Desde já , muito obrigado.

Oi amigo, vamos lá, fiz a sua segunda rotina, mas limpa e rápida, funcionou até certo ponto ;

Primeiro:
Quando dou o comando txtposicao.setText(texto_a); e faço o debug linha a linha, não aparece nada no txtposicao, somente no final da leitura das linhas aparece as 3 ultimas cifras que corresponde a ultima linha lida.

Segundo :
Quando dou o comando System.out.println(texto_a); e faço o debug linha a linha, aparece todas as linhas, mesmo eu querendo somente as linhas com as cifras, mas isso é facil resolver, eu acho.

obs : coloquei o jTextArea1.setText(texto_a); quando no debug linha a linha, não aparece nada, mas quando o programa lê a ultima linha, ele mostra todas as linhas no jTextArea1.

OBS : Mas não é isso que eu quero, eu quero que a rotina, mostre somente as cifras de cada linha e conforme o programa for lendo (inclusive coloquei um Thread.sleep(4000); para dar tempo de ver a cifra), as coloque na txtposicao (uma cifra de cada vez) mesmo tempo, irei colocar a imagem de cada cifra numa label com a imagem JPG.

Pelo que vejo, o java só mostra as linhas ou as cifras, quando termina o While, e eu gostaria que ele mostrasse dentro do While cada cifra por vez, fiz este teste e percebi que ele não mostra.

RESUMINDO : A rotina tem que ler somente as linhas com as cifras(EX: C C# F Gm7), as linhas com a letra da musica , não. Durante o While que neste momento mostra a linha toda, deverá mostrar somente cada cifra e coloca no txtposicao, uma a uma, é possível ?

Será que desta vez fui mais claro ?

Me desculpa esta te dando tanto trabalho , mas talvez a minha má explicação, pode estar atrapalhando. Mesmo assim agradeço muito pela sua ajuda

Vamos lá, no Java nós chamamos a rotina de método, rotina é algo relacionado ao banco de dados.

Isso acontece porquê o programa parou pra fazer algo, e só vai liberar o acesso quando finalizar o processo. Você pode contornar isso utilizando o Thread, pra rodar essa sua tarefa em segundo plano. Exemplo de Thread.

new Thread(){
   @Override
    public void run(){
    //metodo aqui dentro
    }
}

Você pode usar um regex, ou um contains, o contains é bem mais fácil, o próprio nome é sugestivo, você pode usar ele com uma condição. Exemplo:

String nome = "abner";
if(nome.contains("abner"){
   System.out.println("Este sou eu");
}

Saída

Este sou eu

já o Regex, mais complexo, porém, mais eficiente no seu caso, ficaria assim:

public static void main(String[] args) {
        List<String> nomes = Arrays.asList("Abner Rodrigues", "Armando Barbosa Junior", "Ronaldinho Gaúcho", "José", "Marcela");

        Pattern p = Pattern.compile("^Abner");

        for (String word : nomes) {
            Matcher m = p.matcher(word);
            if (m.find()) {
                System.out.printf("%s corresponde%n", word);
            } else {
                System.out.printf("%s não corresponde%n", word);
            }
        }
    }

Saída:

Abner Rodrigues corresponde
Armando Barbosa Junior não corresponde
Ronaldinho Gaúcho não corresponde
José não corresponde
Marcela não corresponde

Pra mais informações sobre o Regex (em inglês):
http://zetcode.com/java/regex/

Eu vou te passar algo básico, pra vc tentar alguma coisa depois, mas seria algo assim:

      new Thread() {
            @Override
            public void run() {
                String texto = null, texto_antigo = null;
                File file = new File("C:\\Imperium\\teste.txt");
                BufferedReader br = null;
                try {
                    br = new BufferedReader(new FileReader(file));
                    while ((texto = br.readLine()) != null) {
                        texto_antigo += "\n" + texto;
                        jTextField1.setText(texto);
                        Thread.sleep(1000);

                        if (texto != null) {
                            if (texto.contains("alguma_coisa")) {
                                System.out.println("Dado Encontrado.");
                            }
                        } else {
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();

FUNCIONOU !!! Cara vc e mais dos amigos do grupo, são 10 !!! To muito feliz, passei 2 semanas para resolver esse problema, o programa esta terminado, valeu mesmo, vc não imagina como me deixou feliz,
FUNCIONOU !!! 10,10, show, muito show, agora vou estudar Java, gostei da linguagem, fácil de trabalhar, eficiente e com bastante recurso, valeu meu novo amigo, valeu mesmo, Fique com Deus e que ele o abençoe, só peço que continue ajudando as pessoas que precisam, quando eu souber, farei o mesmo, é muito bom fazer uma pessoa feliz, isso que o nosso senhor quer de mim e de todos nós. Amém amigo.

1 curtida

Boa amigo!!