Classe para ler arquivo só lê uma vez!

Boa Tarde Moçada…olha eu aqui de novo!
hehe

eu tenho uma classe aqui que lê arquivos .conf, .txt ou sei lá que mais!
eu fiz brincando mesmo…
ai o arquivo server.conf é assim:

$IP=127.0.0.1
$Porta=65003

a classe:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package midgardcliente;

import java.io.*;

/**
 *
 * @author Eric
 */
public class OpenFile {
    
    //Declarando todas as variáveis usadas.
    private     String                          dirProj         =       System.getProperty("user.dir");
    private     String                          linha           =       null;
    private     FileReader                      reader          =       null;
    private     BufferedReader                  leitor          =       null;
    private     static          OpenFile        internalOpen    =       null;
    private     String                          pedido          =       null;

    //Criando a Classe
    public OpenFile() {

        //O Try serve para tentar fazer a ação
        try {
            //Abrindo o arquivo do diretório do projeto
            reader = new FileReader(new File(dirProj + "/server.conf"));

            //fazendo o buffer
            leitor = new BufferedReader(reader,1*1024*1024);

        } catch(FileNotFoundException e) {
            System.out.println("Arquivo não encontrado! (File not found!)");
        } catch(IOException e) {
            System.out.println("Problema com o Arquivo! (File's Problem!)");
        }
    }

    //Essa classe serve para não declarar toda hora o OpenFile
    private static OpenFile getOpenInterno() {
        if(internalOpen == null) 
            internalOpen = new OpenFile();
        return internalOpen;
    }

    //Fazer a leitura do Arquivo e Retornar a variável desejada!
    private String LerArquivoInterno(String VarPedida) {

        //Tratando o While
        try {
        
            //Tratando e mostrando os valores do BUF!
            while((linha = leitor.readLine()) != null) {

                //Pegando a variável pedida
                if(linha.trim().contains("$"+VarPedida+"=")) {
                    String[] linhas = linha.split("=");
                
                    pedido = linhas[1];
                }

            }

            return pedido;
            
        } catch(IOException e) {
            System.out.println("Problema com a leitura do arquivo! (Problem with the file's read!)");
            return null;
        }
    }

    //Chamando a leitura
    public static String LerArquivo(String VarPedida) {
        return getOpenInterno().LerArquivoInterno(VarPedida);
    }

    //Destrutor da classe - Coloque aqui tudo que você quer que a classe faça quando for destruida.
    @Override
    protected void finalize() throws Throwable {
        try {
            leitor.close();
            reader.close();
        } catch(IOException e) {
            System.out.println("Problema ao fechar o Arquivo! (Problem to close the file!)");
        }
        super.finalize();
    }
}[/code]

eu chamei ela:
[code]String       server             =   OpenFile.LerArquivo("IP");

se eu chamar ela novamente para pegar a porta ela repete o ip!!
porque??

String       portaSTR           =   OpenFile.LerArquivo("Porta");

ela repete 127.0.0.1

eu pensei q era por falta de fechar o arqiuvo…mas ai eu fechei ele e deu erro de leitura!

alguém me salva ai??
hehe

Obrigado desde já!

esperimenta tirar o static desta linha
private static OpenFile internalOpen = null;

Instancie o BufferedReader toda a vez que vc for ler o arquivo… Deve resolver seu problema…

Na segunda vez que vc executa o método lerArquivoIntero (Utilize a primeira letra do método minuscúla, é convenção) O Buffered Reader já está no final do arquivo… e não vai voltar a ler o arquivo desde o ínicio.

O seu código tem alguns pontos que podem serem melhorados… !!! O problema no código atual, é que ambas as chamadas utilizam o mesmo objeto que le o arquivo.

Ou seja, na segunda chamada ao metodo LerArquivo, você está utilizando o mesmo objeto veja

//Essa classe serve para não declarar toda hora o OpenFile private static OpenFile getOpenInterno() { if(internalOpen == null) internalOpen = new OpenFile(); return internalOpen; }

Até ai tudo bem, porém na primeira chamada, o while vai ate o final do arquivo, e quando você chama a segunda chamada, não tem mais nada para ler no arquivo… retornando o primeiro elemento, porque você nao limpou a variavel “pedido”

Para resolver o problema, basta sair do método assim que você achou uma configuração… conforme abaixo

[code]
//Fazer a leitura do Arquivo e Retornar a variável desejada!
private String LerArquivoInterno(String VarPedida) {

    //Tratando o While   
    try {   
        pedido = "";  <<<<<<<<<<<<<< LIMPANDO VARIAVEL PARA CASO NÃO TER NADA, NÃO IR LIXO
        //Tratando e mostrando os valores do BUF!  
        while((linha = leitor.readLine()) != null) {   

            //Pegando a variável pedida   
            if(linha.trim().contains("$"+VarPedida+"=")) {   
                String[] linhas = linha.split("=");   
               
                pedido = linhas[1];  
                break;   <<<<<<<<<<<<< SAI DO LOOP, POIS JÁ ENCONTROU A CONFIGURAÇÃO
            }   

        }   

        return pedido;   
           
    } catch(IOException e) {   
        System.out.println("Problema com a leitura do arquivo! (Problem with the file's read!)");   
        return null;   
    }   
}[/code]

Porem está solução existe falha, pois se você pesquisar em ordem invertida… primeiro a porta, depois o ip, vai apresentar problemas tbm.

Sugiro que você modele novamente sua classe, e para facilitar poderia utilizar a class Properties do java, que tem muitos métodos para facilitar isto para você… na verdade isto que você quer já está pronto…rsss

Espero que fui claro, qualquer coisa so perguntar novamente…

Se eu fosse voce eu lia o arquivo uma vez e guardava em um objeto os dados dai eu usaria esse objeto apra pegar os valores…

mais ou menos assim:

class Valores{
//guardo os valores em HashMap por exemplo
public String getValue(String key){
//retorno o valor (depois do igual) de acordo com a  chave(valor antes do igual)
}
}

E a classe OpenFile retornaria um objeto desse
E usuaria assim

Valores arquivoServer = OpenFile.lerArquivo("server.conf");
String porta = arquivoServer.getValue("porta");
String ip = arquivoServer.getValue("ip");

E é bem simples de se implementar isso.

Use a classe Properties para obter configurações de arquivos:

http://www.guj.com.br/java.tutorial.artigo.35.1.guj

Pra falar a verdade… eu usaria Properties também… mas como voce quer fazer tudo na mão faria do jeito que sugeri.

Mas a classe properties já tem métodos para escrever e ler em arquivos.

hehehehe bixo…qd eu fiz essa classe eu procurei algo que lesse .conf e não achei!!

:S

eu mudei seguindo o conselho da classe properties e deu certo!!
vai ai a classe:

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package midgardcliente;

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

/**
*

  • @author Eric
    */
    public class OpenFile {

    //Declarando todas as variáveis usadas.
    private String dirProj = System.getProperty(“user.dir”);
    private File file = null;
    private Properties props = new Properties();
    private FileInputStream fis = null;
    public static OpenFile InternalOpen = null;

    //Criando a Classe
    public OpenFile() {

     // o arquivo encontra-se no mesmo diretório //da aplicação
     file = new File(System.getProperty("user.dir")+"/server.properties");
     
     try {
         fis = new FileInputStream(file);
         
         //lê os dados que estão no arquivo
         props.load(fis);
     } catch (IOException ex) {
         JOptionPane.showMessageDialog(null, "Erro na abertura do arquivo!");
     }
    

    }

    //Essa classe serve para não declarar toda hora o OpenFile
    private static OpenFile GetOpenInterno() {
    if(InternalOpen == null)
    InternalOpen = new OpenFile();
    return InternalOpen;
    }

    //Fazer a leitura do Arquivo e Retornar a variável desejada!
    private String LerArquivoInterno(String VarPedida) {

     //Pegando a VarPerdida
     return props.getProperty(VarPedida); 
    

    }

    //Chamando a leitura
    public static String LerArquivo(String VarPedida) {
    return GetOpenInterno().LerArquivoInterno(VarPedida);
    }

    //Destrutor da classe - Coloque aqui tudo que você quer que a classe faça quando for destruida.
    @Override
    protected void finalize() throws Throwable {
    try {
    fis.close();
    } catch(IOException e) {
    System.out.println(“Problema ao fechar o Arquivo! (Problem to close the file!)”);
    }
    super.finalize();
    }
    }[/code]

Tentei iniciar todas com a letra maiúscula tb pra aprender já com o certo!!

Obrigado galera!!

Letra maiuscula que esta errado…

Outra coisa… voce nao precisa manter o FileInputStream aberto…

tomei a liberdade de mudar essa classe pra voce

package midgardcliente;

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

/**
 *
 * @author Eric
 */
public class OpenFile {
    private String dirProj = System.getProperty("user.dir");
    private Properties props = new Properties();
    private static OpenFile internalOpen;

    //Criando a Classe
    public OpenFile() {

        // o arquivo encontra-se no mesmo diretório //da aplicação
        File file = new File(System.getProperty("user.dir")+"/server.properties");
        
        try {
            FileInputStream fis = new FileInputStream(file);
            
            //lê os dados que estão no arquivo
            props.load(fis);
            fis.close();
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, "Erro na abertura do arquivo!");
        }
    }

    //Essa classe serve para não declarar toda hora o OpenFile
    private static OpenFile getOpenInterno() {
        if(InternalOpen == null) 
            internalOpen = new OpenFile();
        return internalOpen;
    }

    //Fazer a leitura do Arquivo e Retornar a variável desejada!
    private String lerArquivoInterno(String varPedida) {

        //Pegando a VarPerdida
        return props.getProperty(varPedida); 
    }

    //Chamando a leitura
    public static String lerArquivo(String varPedida) {
        return getOpenInterno().lerArquivoInterno(VarPedida);
    }
}

hehehe…valeu!!

to gostando disso!!