Ler um arquivo texto pelo JFileChooser

4 respostas
R

Caros estou desenvolvendo uma interface gráfica para uma software desenvolvido em fortran, estou fazendo isso atráves de leitura e escrita de arquivos texto, já que ele já é o seu principio de funcionamento.
Mais estou tento problemas na hora de ler esses arquivo.
Tipo estou usando o BufferedReader para percorrer esse arquivo, o problema está que se eu crio o arquivo com

public ArrayList pontosArray() throws IOException {
        BufferedReader in = new BufferedReader(new FileReader("/home/raphael/Develop/Java/IOGraf/Dados.txt"));

Funciona perfeitamente mais se eu uso

public ArrayList pontosArray(String filename) throws IOException { BufferedReader in = new BufferedReader(new FileReader(filename));

me apresenta os seguintes erros

[color=red]Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException[/color]



at java.util.StringTokenizer.(StringTokenizer.java:182)

at java.util.StringTokenizer.(StringTokenizer.java:204)

at iograf.leArquivo.pontosArray(leArquivo.java:138)

at iograf.NewApplication.jButton1ActionPerformed(NewApplication.java:151)

at iograf.NewApplication.access$000(NewApplication.java:18)

at iograf.NewApplication$1.actionPerformed(NewApplication.java:64)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)

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

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

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

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

Segue a baixo codigo total dessa minha classe

import java.io.*;
import java.util.*;
import javax.swing.*;

public class leArquivo extends JFrame {
    
    /** Creates a new instance of learquivo */
    private ObjectInputStream input;
    private File filename;
    public leArquivo() {
        
    }
    
        /**
     *[b] TESTE[/b]
     *Le um arquivo de separa as colunas separadas
     *por TAB cria os Objetos PONTO
     *Poem num ArrayList e envia
     */
    public ArrayList pontosArray() throws IOException {
        BufferedReader in = new BufferedReader(new FileReader("/home/raphael/Develop/Java/IOGraf/Dados.txt"));
        String linha;
        StringTokenizer st=null;
        Ponto p;
        ArrayList lista= new ArrayList();
        
        while ((linha=in.readLine())!= null) {
            //Separa a String em Tokens pelo argumento passado
            st=new StringTokenizer(linha,"\t");
            p = new Ponto(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
            lista.add(p);
            
        }
        in.close();
        return lista;
    }
    /**
     *
     *Le um arquivo indicado no parametro de separa as colunas separadas
     *por TAB cria os Objetos PONTO
     *Poem num ArrayList e envia
     */
    
    public ArrayList pontosArray(String filename) throws IOException {
        BufferedReader in = new BufferedReader(new FileReader(filename));
        String linha;
        StringTokenizer st=null;
        Ponto p;
        ArrayList lista= new ArrayList();
        
        while ((linha=in.readLine())!= null) {
            linha=in.readLine();
            //Separa a String em Tokens pelo argumento passado
            st=new StringTokenizer(linha,"\t");
            p = new Ponto(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
            lista.add(p);            
        }
        in.close();
        return lista;
    }
    public ArrayList pontosArray(File filename) throws IOException {
        BufferedReader in = new BufferedReader(new FileReader(filename),1*1024);
        String linha;
        StringTokenizer st=null;
        Ponto p;
        ArrayList lista= new ArrayList();
        
        while ((linha=in.readLine())!= null) {
            linha=in.readLine();
            //Separa a String em Tokens pelo argumento passado
            st=new StringTokenizer(linha,"\t");
            p = new Ponto(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
            lista.add(p);
            
        }
        in.close();
        return lista;
    }
}

4 Respostas

T

Quando você tem um problema, é melhor resolvê-lo dividindo em partes. Talvez você tenha lido uma linha em branco, e nesse caso st.nextToken() vai retornar null - nesse caso Integer.parseInt vai vomitar essa mensagem de erro.
Cheque sempre se as linhas estão no formato correto.
Em vez disto, que supõe que todas as linhas estão no formato correto,

st=new StringTokenizer(linha,"\t");
             p = new Ponto(Integer.parseInt(st.nextToken()), 
Integer.parseInt(st.nextToken()));
             lista.add(p);

tente algo parecido com isto (já registrando meu protesto por você estar usando StringTokenizer, que está “deprecated” e não deve ser usado em código novo: )

st=new StringTokenizer(linha,"\t");
             int x, y;
             if (!st.hasMoreTokens()) 
                 continue;
             try { x = Integer.parseInt (st.nextToken())} catch (NumberFormatException ex) { continue; }
             if (!st.hasMoreTokens()) 
                 continue;
             try { y = Integer.parseInt (st.nextToken())} catch (NumberFormatException ex) { continue; }
             p = new Ponto(x, y);
R

Obrigado pela dica
Mais infelismente ela não meu resultado :frowning:
O mais estranho desse erro é que é o MESMO arquivo que eu estou testando,
a única diferença é o modo que eu passo ele.

E o que eu posso utilizar no lugar do StringTokenizer

Obrigado

Raphael

T
while ((linha=in.readLine())!= null) {          
             linha=in.readLine();

Não tinha visto que você lia duas linhas de cada vez :stuck_out_tongue:

Seu código deve ficar assim:

while ((linha=in.readLine())!= null) {          
//             linha=in.readLine();
R

Valeu mesmo!!!:slight_smile:
Agora deu certo
Leitura viciada é fogo!!!

Criado 18 de maio de 2006
Ultima resposta 18 de mai. de 2006
Respostas 4
Participantes 2