Ler um TXT com delimitadores

4 respostas
JP1

Estou encontrando problemas para ler um TXT onde contenha delimitadores.

Gravar foi beleza, agora ler ta dificil.

Alguém pode me ajudar?

import java.awt.FileDialog;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.StringTokenizer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Agendinha extends JFrame implements ActionListener {
    private JLabel lNome = new JLabel("Nome");
    private JLabel lTele = new JLabel("Telefone");
    private JLabel lEnde = new JLabel("Endereço");
    private JButton b1 = new JButton("Grava");
    private JButton b2 = new JButton("Abre");
    private JTextField t1 = new JTextField("");
    private JTextField t2 = new JTextField("");
    private JTextField t3 = new JTextField("");
    private String nome, endereco, telefone, nome_arquivo;
    private JPanel P1;
    private FileDialog Fabrir, Fsalvar;

    public static void main(String[] args) {
        JFrame Tela = new Agendinha();
        Tela.setVisible(true);
        WindowListener x = new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        };
        Tela.addWindowListener(x);
    }

    Agendinha() {
        t1.setColumns(25);
        t2.setColumns(25);
        t3.setColumns(25);

        b1.addActionListener(this);
        b2.addActionListener(this);

        setTitle("Agenda Simples");
        setResizable(false);
        setSize(300, 220);
        setLocationRelativeTo(null);
        setAlwaysOnTop(true);
        getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER));
        Fabrir = new FileDialog(this, "Abrir arquivo", FileDialog.LOAD);
        Fsalvar = new FileDialog(this, "Salvar arquivo", FileDialog.SAVE);
        P1 = new JPanel();
        P1.setLayout(new FlowLayout(FlowLayout.CENTER));
        P1.add(b1);
        P1.add(b2);
        getContentPane().add(lNome);
        getContentPane().add(t1);
        getContentPane().add(lTele);
        getContentPane().add(t2);
        getContentPane().add(lEnde);
        getContentPane().add(t3);
        getContentPane().add(P1);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == b1) {
            try {
                nome = t1.getText();
                telefone = t2.getText();
                endereco = t3.getText();

                Fsalvar.setVisible(true);
                if (Fsalvar.getFile() == null)
                    return;
                nome_arquivo = Fsalvar.getDirectory() + Fsalvar.getFile();
                FileWriter out = new FileWriter(nome_arquivo);
                out.write(nome + ";" + telefone + ";" + endereco);
//                out.write(telefone);
//                out.write(endereco);
                out.close();
                t1.setText("");
                t2.setText("");
                t3.setText("");
            } catch (Exception exc) {
                JOptionPane.showMessageDialog(null, "Ocorreu um Erro de Gravação", 
                        "Operação Não Realizada", JOptionPane.ERROR_MESSAGE);
            }
        }
        if (e.getSource() == b2) {
            try {
                Fabrir.setVisible(true);
                if (Fabrir.getFile() == null)
                    return;
                nome_arquivo = Fabrir.getDirectory() + Fabrir.getFile();
                FileReader in = new FileReader(nome_arquivo);
                String T = "";
                int i = in.read();
                while (i != -1)
                {
                    T = T + (char)i;
                    i = in.read();
                }
//                t1.setText(T);
                StringTokenizer st = new StringTokenizer(T, ";");
                while (st.hasMoreTokens())
    				System.out.println("Cada registro em separadao>> " + 
                            st.nextToken());
                t1.setText(T);
            } catch (Exception exc2) {
                JOptionPane.showMessageDialog(null, "Ocorreu um Erro ao Tentar Abrir", 
                        "Operação Não Realizada", JOptionPane.ERROR_MESSAGE);
            }
        }
    }
}

O meu problema ta neste trecho

if (e.getSource() == b2) {
            try {
                Fabrir.setVisible(true);
                if (Fabrir.getFile() == null)
                    return;
                nome_arquivo = Fabrir.getDirectory() + Fabrir.getFile();
                FileReader in = new FileReader(nome_arquivo);
                String T = "";
                int i = in.read();
                while (i != -1)
                {
                    T = T + (char)i;
                    i = in.read();
                }
//                t1.setText(T);
                StringTokenizer st = new StringTokenizer(T, ";");
                while (st.hasMoreTokens())
    				System.out.println("Cada registro em separadao>> " + 
                            st.nextToken());
                t1.setText(T);

Fico no aguardo da ajuda de vocês.

4 Respostas

Rafael_Steil

Beleza, o seu problema esta “nesse trecho”… mas qual eh o problema mais exatamente?

Rafael

JP1

Rafael…

Cara desculpa minha falha.

a dúvida persiste no seguite.

no 1° try, eh gravado um txt, com os seguintes dados:
nome, telefone, enredeço.

Nesta ordem, com um delimitador separando cada dado, no caso usei “;”.

Agora eu queria fazer com que se fosse aberto o txt, ele jogasse essa informações devolta nos campos.

aqui segue a telinha.

Rafael_Steil

Bom, primeiro, para ler um arquivo texto, BufferedReaders sao melhores que simples FileReaders. Portanto, um codigo como o a seguir eh mais bem rapido:

BufferedReader reader = new BufferedReader(new FileReader("arquivo.txt"));

StringBuffer sb = new StringBuffer();

int c = -1;
char[] ch = new char[4096];

while ((c = reader.read(ch)) != -1) {
    sb.append(new String(ch, 0, c));
}

reader.close();

Porem, no seu caso, vou assumr que existe 1 registro por linha. Nesse caso, um reader.readLine() torna a tua vida BEM mais facil. O while() fica assim:

String line = null;

while ((line = reader.readLine()) != null) {
    // trabalhe com a linha atual
}

entao, tendo a linha, vc pode dar um split() (ou, caso prefira, usar um StringTokenizer) e jogar aonde quiser. Algo como

// trabalhe com a linha atual
String[] partes = linha.split(";");

// Agora vc tem o array com os dados.. jogue onde quiser

Rafael

JP1

Rafael…

muito obrigado mesmo.

Explicação fantastica.

muito obrigado mesmo.

um abraço.

boa semana.

:smiley: :smiley: :smiley: :smiley: :smiley:

Criado 12 de junho de 2005
Ultima resposta 12 de jun. de 2005
Respostas 4
Participantes 2