Problema com leitura de arquivo[resolvido]

10 respostas
G

Boa tarde, estou com o seguinte problema leio de um arquivo txt e cada linha eh lida com uma virgula como split porem quando ha algum espaço antes dessa virgula o programa da pau, vou mostrar o meu metodo que eu adiciono a linha e o que eu leio a lista de contatos no caso.

Um metodo que eu pego tudo que eu leio e separo para cada atributo.
public static List<Contato> carregarDoArquivo() {
     File ArqTxt = new File("C://lista.txt");
     FileInputStream fi = null;
     List<Contato> lista = new ArrayList<Contato>();
      try {
                  fi = new FileInputStream(ArqTxt);
            } catch (FileNotFoundException e) {
                  e.printStackTrace();
            }
            String readLine = "";
            String conteudo = "";
            Scanner scan = new Scanner(fi);
            int cont=0;
        while (scan.hasNext()) {
            readLine = scan.next();
            cont++;
            String b[] = readLine.split(",");
            Contato c = new Contato(b[0], b[1], b[2]);
            
            lista.add(c);

o metodo que eu adiciono no txt

public void add(String nome,String email,String produto) throws IOException{
        File Arqtxt = new File("C://lista.txt");
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(Arqtxt);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
        }
        String readLine="";
        String conteudo="";
        Scanner scan = new Scanner(fis);
        while (scan.hasNext()) {
            readLine = scan.next();
            conteudo += readLine +"\r\n";
        }

        conteudo += nome+","+email+","+produto;

        FileOutputStream fo = null;
        try {
            fo = new FileOutputStream(Arqtxt, false);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            fo.write(conteudo.getBytes());
        } catch (IOException ex) {
            JOptionPane.showInputDialog(null,"Erro na hora de gravar");
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
        }
   }

Gostaria de saber como ignoro um espaço

10 Respostas

mgarcia

qual é o erro q acontece no programa?

G

O erro que ta dando eh esse

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1

T

Modifique seu código colocando o -1 no split, exemplo:

String b[] = readLine.split(",",-1);

Por padrão o paramento é “0” fazendo com que o java ignore os últimos valores vazios que vierem entre o separador. Com o “-1” ele vai trazer todos os campos, mesmo se os ultimo campos estiverem vazios.

G

terdeko:
Modifique seu código colocando o -1 no split, exemplo:

String b[] = readLine.split(",",-1);

Por padrão o paramento é “0” fazendo com que o java ignore os últimos valores vazios que vierem entre o separador. Com o “-1” ele vai trazer todos os campos, mesmo se os ultimo campos estiverem vazios.

Continua dando o mesmo erro =x vale lembrar que eu pego esses valores e os coloco em uma tabela.

T

Posta a linha do arquivo texto que está causando o problema.

G

Entao muito obrigado pela atençao achei o erro

tava dando readLine = scan.next();
sendo q na verdade tem q ser readLine = scan.nextLine();

G
guialeixo:
Boa tarde, estou com o seguinte problema leio de um arquivo txt e cada linha eh lida com uma virgula como split porem quando ha algum espaço antes dessa virgula o programa da pau, vou mostrar o meu metodo que eu adiciono a linha e o que eu leio a lista de contatos no caso. Um metodo que eu pego tudo que eu leio e separo para cada atributo.
public static List<Contato> carregarDoArquivo() {
     File ArqTxt = new File("C://lista.txt");
     FileInputStream fi = null;
     List<Contato> lista = new ArrayList<Contato>();
      try {
                  fi = new FileInputStream(ArqTxt);
            } catch (FileNotFoundException e) {
                  e.printStackTrace();
            }
            String readLine = "";
            String conteudo = "";
            Scanner scan = new Scanner(fi);
            int cont=0;
        while (scan.hasNext()) {
            readLine = scan.next();
            cont++;
            String b[] = readLine.split(",");
            Contato c = new Contato(b[0], b[1], b[2]);
            
            lista.add(c);

o metodo que eu adiciono no txt

public void add(String nome,String email,String produto) throws IOException{
        File Arqtxt = new File("C://lista.txt");
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(Arqtxt);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
        }
        String readLine="";
        String conteudo="";
        Scanner scan = new Scanner(fis);
        while (scan.hasNext()) {
            readLine = scan.next();
            conteudo += readLine +"\r\n";
        }

        conteudo += nome+","+email+","+produto;

        FileOutputStream fo = null;
        try {
            fo = new FileOutputStream(Arqtxt, false);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            fo.write(conteudo.getBytes());
        } catch (IOException ex) {
            JOptionPane.showInputDialog(null,"Erro na hora de gravar");
            Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
        }
   }

Gostaria de saber como ignoro um espaço

M

Você deve ler por linhas do arquivo, e não por palavras, como você está fazendo. Mude as linhas 14 e 15 para isso:

while (scan.hasNextLine()) {  
    readLine = scan.nextLine();
    // o resto continua

E na hora que você vai escrever no arquivo, você:

  1. Deveria usar orientação a objetos: ao invés de receber Strings, o método deveria receber um Contato.

  2. Não precisa ler todo o conteúdo, para depois escrevê-lo de novo no arquivo. Basta na linha 21 passar ‘true’ para o construtor de FileOutputStream, ao invés de ‘false’. Isso ativa o modo ‘append’ que adiciona conteúdo no final do arquivo ao invés de sobreescrevê-lo.

  3. Como não precisa mais ler, essa dica não se aplica agora: sempre que for ler Strings dentro de um laço, não use concatenação. Use um StringBuilder ou um StringWriter, por questões de performance.

G

marcobiscaro2112:
Você deve ler por linhas do arquivo, e não por palavras, como você está fazendo. Mude as linhas 14 e 15 para isso:

while (scan.hasNextLine()) {  
    readLine = scan.nextLine();
    // o resto continua

E na hora que você vai escrever no arquivo, você:

  1. Deveria usar orientação a objetos: ao invés de receber Strings, o método deveria receber um Contato.

  2. Não precisa ler todo o conteúdo, para depois escrevê-lo de novo no arquivo. Basta na linha 21 passar ‘true’ para o construtor de FileOutputStream, ao invés de ‘false’. Isso ativa o modo ‘append’ que adiciona conteúdo no final do arquivo ao invés de sobreescrevê-lo.

  3. Como não precisa mais ler, essa dica não se aplica agora: sempre que for ler Strings dentro de um laço, não use concatenação. Use um StringBuilder ou um StringWriter, por questões de performance.

cara muito obrigado pelas dicas foram muito uteis, fiz a parada do fileOutput mas eu acho q to passando um contato sim so q eu leio de um arquivo txt, nao sei,
mas muito obrigado pelas dicas

welitonjose

loko veio rs

Criado 4 de janeiro de 2010
Ultima resposta 6 de jan. de 2010
Respostas 10
Participantes 5