Acessando arquivos com dados

20 respostas
C

Olá, há alguma forma simples de acessar um arquivo com dados dentro do próprio jar, como arquivos de texto simples? Não quero gravar sobre este arquivo, apenas ler dados que estarão nele durante a execução.

Baixei um exemplo do site da Nokia que faz essa leitura a partir de arquivos XML embutidos no jar, mas não achei essa a melhor opção por questões de compatibilidade e espaço (só o suporte à leitura do xml ocupava uns 14k, além, é claro, do xml que é muito “sujo” pra quem quer economizar espaço a todo custo). Eu tava procurando alguma coisa mais simples…

Valeu!

20 Respostas

C

Olá,
Cara vc pode usar o seguinte método da classe Class:

InputStream getResourceAsStream(String name)
          Finds a resource with a given name.

Basta vc instancia um class assim p.e:

String asd="";
asd.getClass().getResourceAsStream("arquivo.txt");

Ok?!

Falow!

P

“clv”:
Olá,
Cara vc pode usar o seguinte método da classe Class:

InputStream getResourceAsStream(String name)
          Finds a resource with a given name.

Basta vc instancia um class assim p.e:

String asd="";
asd.getClass().getResourceAsStream("arquivo.txt");

Ok?!

Falow!

Olha, pelo menos na CLDC 1.0 a classe InputStream não implementa o método getResourceAsStream(String name);

C


Olha, pelo menos na CLDC 1.0 a classe InputStream não implementa o método getResourceAsStream(String name);

Opa,
Implementa sim cara!
Eu fiz isso em um dos meus jogos!
E roda no meu celular MIDP1.0+CLDC1.0
TAlvez o que vc tenha visto no javadoc é que ele existe desde o JDK1.1 e não CLDC1.1. OK?!
Ahh… e não é a classe InputStream mas sim a classe “Class”!!!

Falow!

C

Há algo como a PropertyResourceBundle ou a StringTokenizer que eu possa usar?

C

Usar isso pra que?
Nao entendi o que vc ker saber!

C

Bom, com o StringTokenizer é mais simples processar os dados (string) do arquivo de texto lido pelo programa. Já a PropertyResourceBundle, pelo que entendi, funcionaria de forma similar ao getResourceAsStream que você sugeriu, mas eu poderia carregar direto os valores do arquivo de texto para algumas variáveis.

C

Então,
A única maneira que eu conheço é essa que falei.
Ja a parada do tokenizer nao tem nao.
Mas vc pode implementar um split com substring ou indexOf.

Falow!

R

O chokito falou que usou umas aplicações em XML.

Vc pegou algum tipo de driver ou algo assim?

Estou precisando desenvolver um programa que vai ter como saída arquivos XML.

Alguém sabe como posso fazer isso?

C

Eu baixei um tutorial bem legal direto do site da Nokia. Não tenho o endereço aqui, mas posso te mandar se você quiser.

C

Bom, ainda não consegui carregar o arquivo externo… :sad:

Fiz um aplicativo simples pra testar. A parte do código que interessa é essa aqui:

String externa = "";
externa.getClass().getResourceAsStream("entrada.txt");
        
String itens[] = {"texto interno", externa, "outro interno"};
this.list = new List("textos", List.IMPLICIT, itens, null);
this.list.addCommand(this.cmdSair);
this.list.setCommandListener(this);

Mas o que aconteceu foi que o arquivo “entrada.txt”, que tem o texto “texto externo” não carregou e o que eu vi, no final, foi isso (o arquivo não carregou e a variável “externa” continuou com “”):

Não me pareceu ser um caminho errado para o arquivo (tentei fazer o mesmo colocando a classe num packega e incluindo o caminho no nome do arquivo). Alguém sabe como resolver isso?

J

“rlcardim”:
O chokito falou que usou umas aplicações em XML.

Vc pegou algum tipo de driver ou algo assim?

Estou precisando desenvolver um programa que vai ter como saída arquivos XML.

Alguém sabe como posso fazer isso?

Da uma olhada em www.kxml.org

Abraços!

J

esse seu arquivo esta no diretório /res ?

tenta acessá-lo com /arquivo.txt ou /res/arquivo.txt … Mas ahco qeu é do primeiro jeito :wink:

Abraços!

C

Nãããão!!!
Para tudo!!!
Não é assim cara… vc nao viu o que eu falei direito.
Eu disse que o getResource… retorna um InputStream, eu não disse que o retorno vem na String.

Eu usei String pra exemplo só, poderia se qqer classe, pois o que preciso é apenas a classe Class.

Então, vc precisa pegar esse InputStream e ler ele.
Sacou?!

C

Bom, mas então qual é o caminho das pedras para ler uma string que está em um arquivo? Parece que tudo o que eu tento fazer dá errado… Minha última tentative foi com a InputStreamReader, que continua gerando excessões…

C

Opa,
Mas cara, vc tem que analisar quais são as excessões e tentar corrigir cara.
Verifique qual a mensagem da excessão e corre atrás.
Os arquivos dentro do res usa-se “/arquivo”.
Debuga se puder!
Já dei o caminho das pedras.
Procura no javadoc que geralmente tem exemplos de uso dos Streams e etc.

Ok?!

C

Finalmente consegui!!! Bom, mas como esta é a minha primeira tentativa de escrever algo em java (não só para J2ME), alguém pode dar uma olhada no que eu fiz e me dizer se há algum problema? Até agora tudo parece funcionar bem…

import java.io.*;

public class arquivoExterno {
    
    private String texto; // o conteúdo do arquivo carregado
    private String separador; // a string usada para quebrar o texto
     
    // construtor 1: recebendo apenas o nome do arquivo, sem dados para quebra
    public arquivoExterno(String arquivo) {
        // inicializando variáveis
        this.texto = new String();
        this.separador = new String();
        
        // carregando o arquivo indicado
        mudaArquivo(arquivo);
    }
    
    // construtor 2: recebendo o arquivo e a string usada para separar o texto em partes
    public arquivoExterno(String arquivo, String separa) {
        // inicializando variáveis
        this.texto = new String();
        this.separador = separa;
        
        // carregando o arquivo indicado
        mudaArquivo(arquivo);
    }
    
// Funções públicas
    
    // altera o arquivo externo
    public void mudaArquivo(String arquivo) {
        
        StringBuffer buffer = null;
        InputStream is = null;
        InputStreamReader isr = null;
        
        // tentando abrir o arquivo indicado
        try {
            Class c = this.getClass();
            is = c.getResourceAsStream(arquivo);     
            if (is == null)
            throw new Exception("O arquivo não existe");
       
            isr = new InputStreamReader(is);     
     
            buffer = new StringBuffer();
            int ch;
            while ((ch = isr.read()) > -1) {
                buffer.append((char)ch);
            }      
            if (isr != null) 
                isr.close();              
        } catch (Exception ex) {
            System.out.println(ex);
        }
        
        // armazenando o texto encontrado no arquivo
        this.texto = buffer.toString();
    }
    
    // recupera toda a string lida no arquivo
    public String textoCompleto() {
        return this.texto;
    }
    
    // altera a string do separador
    public void mudaSeparador(String separa) {
        this.separador = separa;
    }
    
    // recupera a string do separador
    public String textoSeparador() {
        return this.separador;
    }
    
    // encontra o número de elementos presentes no texto a partir da quebra com o separador
    // retorna -1 caso nenhum separador tenha sido definido
    public int totalElementos() {
        
        if (this.separador != "") {
            int aux1 = 0, aux2 = 0;
        
            // definindo o número de elementos do array
            do {
                aux1 = this.texto.indexOf(this.separador, (aux1 + 1));
                aux2++;
            } while (aux1 > -1);
        
            return aux2;
        } else {
            return -1;
        }
    }
    
    // retorna um array contendo os dados presentes no arquivo de texto já separados
    // retorna um array de um elemento contendo "-1" caso nenhum separador tenha sido definido
    public String[] arrayElementos() {
        
        if (this.separador == "") {
            String retorno[] = {"-1"};
            return retorno;
        } else {
            int ultimo = 0, atual = 0, elementos = 0;
        
            // definindo o número de elementos do array
            elementos = totalElementos();
        
            // prerarando as strings
            String temp = this.texto;
            String retorno[] = new String[elementos];
        
            // quebrando a string em um array
            for(atual=0; atual<elementos; atual++) {
                ultimo = temp.indexOf(separador);
                if (ultimo > -1) {
                    retorno[atual] = temp.substring(0, ultimo);
                    temp = temp.substring(ultimo + 1);
                } else {
                    retorno[atual] = temp;
                }
            }
            return retorno;
        }
    }
}
R

Olá!

Estou precisando persitir meus dados(Objetos com Strings).
Pelo que eu vi vc somente leu.

Será que isso é possivel?
Será que não da para Serializar os objetos e já recupera-los como objeto?

A questão é que não tem a Interface Serializable em J2ME. Acho que não tem como fazer isso… Seria uma mão na roda…

J

Olá!

é rapaz, não tem como serializar objetos não. Tbm havia pensado nisso no início, com crtz seria umas 4 mão na roda :wink:

infelizmente vc é quem precisa se virar com a persistência…

Acho qeu eles vão fazer algo assim ainda, ou já que os devices estão evoluindo, logo teremos um BD para J2ME para celulares, assim como tem para CDC :wink:

Abraços!

R

Aproveitando…

Como faço para criar e escrever em um arquivo em J2ME?
Já procurei e não encontrei nada…

Valeu!

C

A pricipio não tem como! A menos que vc ache uma JSR especifica pra isso!

Falow!

Criado 28 de junho de 2005
Ultima resposta 25 de jul. de 2005
Respostas 20
Participantes 6