Leitura arquivo.txt

16 respostas
D

Olá pessoal, no meu pequeno projeto estou imprimindo os cadastros em arquivo.txt dessa forma:

List<String> listaAtor = new ArrayList<String>();
        Filme f = new Filme(0, "", "", listaAtor);
        boolean teste = verificaCampos();
        if (teste == true) {
            f.setCodigo(Integer.parseInt(tfCodigo.getText()));
            f.setGenero((String) comboGenero.getSelectedItem());
            f.setTitulo(tfTitulo.getText());
            listaAtor.add(tfAtores1.getText());
            listaAtor.add(tfAtores2.getText());
            f.setAtores(listaAtor);
            limparCampos();
            lista.add(f);

            try {
                FileWriter fout = new FileWriter("c:\\filmes.txt", true);
                PrintWriter pout = new PrintWriter(fout);
                pout.println(f);

            } catch (Exception ex) {
                Logger.getLogger(TelaFilmes.class.getName()).log(Level.SEVERE, null, ex);
            }


        } else {
            JOptionPane.showMessageDialog(null, "Preencha todos os campos");
        }
    }

Esta imprimindo utilizando o toString() da minha classe, ok, só que preciso fazer a leitura dessas linhas e uma a uma transformar em um objeto
Filme para inserir certinho na minha jTable…problema que ao ler essas linhas lógicamente vem como Objeto String assim:

FileReader fin = new FileReader("c:\\filmes.txt");
            BufferedReader buf = new BufferedReader(fin);
            String linha = buf.readLine();//while para ler todas as linhas do txt

Como farei para “montar” um objeto para cada linha?
Estava pensando em usar os métodos da classe string para separar cada parte da linha e ir alocando no objeto…alguém pode me ajudar?
desde já agradeço

16 Respostas

nel

Você pensou da forma correta.
Tem de haver um modo de separar as informações e depois usar um Split, por exemplo, para alocar cada informação no seu devido lugar.

Vamos supor assim:

1,5&Aventuras na Selva&livre

Seria o tempo de duração do filme, título e classificação.
Só exemplo, claro.

diego.sas

E ae, DukeFriend.
Você esta colocando algum separador na hora de salvar o arquivo?

D

Então, tem um espaço entre cada item…

obrigado

diego.sas

Conforme o nel mencionou você utiliza o split.

FileReader fin = new FileReader("c:\\filmes.txt"); BufferedReader buf = new BufferedReader(fin); String linha = buf.readLine();//while para ler todas as linhas do txt String array[] = linha.split(" ");

Vc tera cada campo do seu arquivo dentro de uma posição do array.
So fazer as validações e popular seu bean.
Abraço

D

Ok, vou tentar…
Valeu nel, valeu Diego…

D

Analisando o seu código você está instanciando um objeto do tipo Filme e depois o adiciona a uma ArrayList. Você pode simplemeste salvar a própria lista em um arquivo com extensão (.ser)

private FileOutputStream output;
private ObjectOutputStream objectOutput;

public void salvar(List<Filme> filmes ) throws IOException {
		try {
			output = new FileOutputStream("/seuArquivo.ser");
			objectOutput = new ObjectOutputStream(output);
			objectOutput.writeObject(filmes);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			objectOutput.close();
		}
	}

E para ler este arquivo a mesma lógica

private FileInputStream input;
private ObjectInputStream objectInput;

public List<Filme> ler() throws IOException, ClassNotFoundException {
		List<Filme> filmes = new ArrayList<Filme>();
		if (new File("/seuArquivo.ser").exists()) {
			try {
				input = new FileInputStream("/seuArquivo.ser");
				objectInput = new ObjectInputStream(input);
				filmes = (List<Filme>) objectInput.readObject(); // lendo a lista serializada
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
			finally {
				objectInput.close();
			}
		}
		return filmes;
	}

Pronto! Agora você tem salva a lista e não mais Strings

D
Tentei fazer a serialização, mas na leitura da erro, método de gravação:
private FileOutputStream output;
    private ObjectOutputStream objectOutput;

    public void salvar(List<Filme> filmes) throws IOException {
        try {
            output = new FileOutputStream("c:\\filmes.ser");
            objectOutput = new ObjectOutputStream(output);
            objectOutput.writeObject(filmes);
        } catch (Exception e) {
        } finally {
            objectOutput.close();
        }
    }
Chamada do método de leitura:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        List<Filme> fr = new ArrayList<Filme>();

        try {
            fr = ler();
            for (Filme filme : fr) {
                System.out.println(filme.getCodigo() + filme.getTitulo());
            }
        } catch (IOException ex) {
            Logger.getLogger(TelaFilmes.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(TelaFilmes.class.getName()).log(Level.SEVERE, null, ex);
        }
método de leitura
public List<Filme> ler() throws IOException, ClassNotFoundException {
        List<Filme> filmes = new ArrayList<Filme>();
        ObjectInputStream objectInput = null;
        if (new File("c:\\filmes.ser").exists()) {
            try {
                FileInputStream input = new FileInputStream("c:\\filmes.ser");
                objectInput = new ObjectInputStream(input);
                filmes = (List<Filme>) objectInput.readObject(); // lendo a lista serializada
                objectInput.close();
            } catch (FileNotFoundException e) {
            }
            finally {
                objectInput.close();
            }
        }
        return filmes;
    }
Erro

RAVE: null
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: br.com.Filmes.Filme
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1332)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at java.util.ArrayList.readObject(ArrayList.java:593)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at br.com.Filmes.TelaFilmes.ler(TelaFilmes.java:391)
at br.com.Filmes.TelaFilmes.jButton1ActionPerformed(TelaFilmes.java:407)
at br.com.Filmes.TelaFilmes.access$200(TelaFilmes.java:39)
at br.com.Filmes.TelaFilmes$4.actionPerformed(TelaFilmes.java:181)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6267)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6032)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Caused by: java.io.NotSerializableException: br.com.Filmes.Filme
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at java.util.ArrayList.writeObject(ArrayList.java:570)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at br.com.Filmes.TelaFilmes.salvar(TelaFilmes.java:346)
at br.com.Filmes.TelaFilmes.executa(TelaFilmes.java:329)
at br.com.Filmes.TelaFilmes.access$700(TelaFilmes.java:39)
at br.com.Filmes.TelaFilmes$9.keyPressed(TelaFilmes.java:310)
at java.awt.Component.processKeyEvent(Component.java:6225)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2801)
at java.awt.Component.processEvent(Component.java:6044)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
at java.awt.Component.dispatchEventImpl(Component.java:4502)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
... 9 more

D

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: br.com.Filmes.Filme

Ok, você precisa implementar a interface Serializabe na classe Filme.

exemplo

public class Filme implements Serializable{...}
D

Fiz a mudança mas o erro continua…

Filme implements Serializable{

obrigado

D

Alterei para a classe Filme para

Filme implements Serializable{

mas o erro permanece
obrigado

Leonardo_Loures

Se você tiver criando o arquivo você pode criar um layout definindo posições fixas - Exemplo:

De 0 até 30 - Nome
De 31 até 45 - Endereço
De 46 até 55 - Telefone

Sendo assim na hora de ler o arquivo você joga a linha dentro de uma String e utiliza o substring para ler as posições.

String nome = null;

String endereco = null;

String Telefone = null;
nome = linha.substring(0,30);

endereco = linha.substring(31,45);

telefone = linha.substring(46,55);

Sou novo no Forum, se eu não me fiz entender me de um toque para que eu possa me expressar melhor.

D

Duke, poste o erro que ocorreu após você colocar Serializable na classe Filme.
Poste a classe Filme também. E qual SO está usando?

D

é o mesmo erro anterior, igualzinho
classe filme:

public class Filme implements Serializable{
 private int codigo;
 private String genero;
 private String titulo;
 private List <String> atores;

    public Filme(int codigo, String genero, String titulo, List<String> atores) {
        this.codigo = codigo;
        this.genero = genero;
        this.titulo = titulo;
        this.atores = atores;
    }

    public List<String> getAtores() {
        return atores;
    }

    public void setAtores(List<String> atores) {
        this.atores = atores;
    }

    public int getCodigo() {
        return codigo;
    }

    @Override
    public String toString() {
        return codigo+" "+ genero +" "+   titulo +" "+  atores ;
    }

    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public String getGenero() {
        return genero;
    }

    public void setGenero(String genero) {
        this.genero = genero;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

}

Windows 7 ultimate

D

Poste a classe onde você está gravando e lendo o arquivo.

É exatamente o mesmo erro? NotSerializableException?

D
public List<Filme> ler() throws IOException, ClassNotFoundException {
        List<Filme> filmes = new ArrayList<Filme>();
        ObjectInputStream objectInput = null;
        if (new File("c:\\filmes.ser").exists()) {
            try {
                FileInputStream input = new FileInputStream("c:\\filmes.ser");
                objectInput = new ObjectInputStream(input);
                filmes = (List<Filme>) objectInput.readObject(); // lendo a lista serializada
                objectInput.close();
            } catch (FileNotFoundException e) {
            }
            finally {
                objectInput.close();
            }
        }
        return filmes;
    }
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        List<Filme> fr = new ArrayList<Filme>();

        try {
            fr = ler();
            for (Filme filme : fr) {
                System.out.println(filme.getCodigo() + filme.getTitulo());
            }
        } catch (IOException ex) {
            Logger.getLogger(TelaFilmes.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(TelaFilmes.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
GRAVE: null

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: br.com.Filmes.Filme

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1332)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)

at java.util.ArrayList.readObject(ArrayList.java:593)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)

at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)

at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)

at br.com.Filmes.TelaFilmes.ler(TelaFilmes.java:391)

at br.com.Filmes.TelaFilmes.jButton1ActionPerformed(TelaFilmes.java:407)

at br.com.Filmes.TelaFilmes.access$200(TelaFilmes.java:39)

at br.com.Filmes.TelaFilmes$4.actionPerformed(TelaFilmes.java:181)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)

at java.awt.Component.processMouseEvent(Component.java:6267)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)

at java.awt.Component.processEvent(Component.java:6032)

at java.awt.Container.processEvent(Container.java:2041)

at java.awt.Component.dispatchEventImpl(Component.java:4630)

at java.awt.Container.dispatchEventImpl(Container.java:2099)

at java.awt.Component.dispatchEvent(Component.java:4460)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)

at java.awt.Container.dispatchEventImpl(Container.java:2085)

at java.awt.Window.dispatchEventImpl(Window.java:2478)

at java.awt.Component.dispatchEvent(Component.java:4460)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Caused by: java.io.NotSerializableException: br.com.Filmes.Filme

at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)

at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)

at java.util.ArrayList.writeObject(ArrayList.java:570)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)

at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)

at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)

at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)

at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)

at br.com.Filmes.TelaFilmes.salvar(TelaFilmes.java:346)

at br.com.Filmes.TelaFilmes.executa(TelaFilmes.java:329)

at br.com.Filmes.TelaFilmes.access$700(TelaFilmes.java:39)

at br.com.Filmes.TelaFilmes$9.keyPressed(TelaFilmes.java:310)

at java.awt.Component.processKeyEvent(Component.java:6225)

at javax.swing.JComponent.processKeyEvent(JComponent.java:2801)

at java.awt.Component.processEvent(Component.java:6044)

at java.awt.Container.processEvent(Container.java:2041)

at java.awt.Component.dispatchEventImpl(Component.java:4630)

at java.awt.Container.dispatchEventImpl(Container.java:2099)

at java.awt.Component.dispatchEvent(Component.java:4460)

at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)

at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)

at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)

at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)

at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)

at java.awt.Component.dispatchEventImpl(Component.java:4502)

at java.awt.Container.dispatchEventImpl(Container.java:2099)

 9 more
D

Poste a classe inteira

Criado 22 de novembro de 2011
Ultima resposta 23 de nov. de 2011
Respostas 16
Participantes 5