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…
Olha, pelo menos na CLDC 1.0 a classe InputStream não implementa o método getResourceAsStream(String name);
C
clvPJ
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
ChokitoPJ
Há algo como a PropertyResourceBundle ou a StringTokenizer que eu possa usar?
C
clvPJ
Usar isso pra que?
Nao entendi o que vc ker saber!
C
ChokitoPJ
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
clvPJ
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
rlcardimPJ
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
ChokitoPJ
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
ChokitoPJ
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:
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
Juliano_CarnielPJ
“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.
tenta acessá-lo com /arquivo.txt ou /res/arquivo.txt … Mas ahco qeu é do primeiro jeito
Abraços!
C
clvPJ
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
ChokitoPJ
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
clvPJ
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
ChokitoPJ
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…
importjava.io.*;publicclassarquivoExterno{privateStringtexto;// o conteúdo do arquivo carregadoprivateStringseparador;// a string usada para quebrar o texto// construtor 1: recebendo apenas o nome do arquivo, sem dados para quebrapublicarquivoExterno(Stringarquivo){// inicializando variáveisthis.texto=newString();this.separador=newString();// carregando o arquivo indicadomudaArquivo(arquivo);}// construtor 2: recebendo o arquivo e a string usada para separar o texto em partespublicarquivoExterno(Stringarquivo,Stringsepara){// inicializando variáveisthis.texto=newString();this.separador=separa;// carregando o arquivo indicadomudaArquivo(arquivo);}// Funções públicas// altera o arquivo externopublicvoidmudaArquivo(Stringarquivo){StringBufferbuffer=null;InputStreamis=null;InputStreamReaderisr=null;// tentando abrir o arquivo indicadotry{Classc=this.getClass();is=c.getResourceAsStream(arquivo);if(is==null)thrownewException("O arquivo não existe");isr=newInputStreamReader(is);buffer=newStringBuffer();intch;while((ch=isr.read())>-1){buffer.append((char)ch);}if(isr!=null)isr.close();}catch(Exceptionex){System.out.println(ex);}// armazenando o texto encontrado no arquivothis.texto=buffer.toString();}// recupera toda a string lida no arquivopublicStringtextoCompleto(){returnthis.texto;}// altera a string do separadorpublicvoidmudaSeparador(Stringsepara){this.separador=separa;}// recupera a string do separadorpublicStringtextoSeparador(){returnthis.separador;}// encontra o número de elementos presentes no texto a partir da quebra com o separador// retorna -1 caso nenhum separador tenha sido definidopublicinttotalElementos(){if(this.separador!=""){intaux1=0,aux2=0;// definindo o número de elementos do arraydo{aux1=this.texto.indexOf(this.separador,(aux1+1));aux2++;}while(aux1>-1);returnaux2;}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 definidopublicString[]arrayElementos(){if(this.separador==""){Stringretorno[]={"-1"};returnretorno;}else{intultimo=0,atual=0,elementos=0;// definindo o número de elementos do arrayelementos=totalElementos();// prerarando as stringsStringtemp=this.texto;Stringretorno[]=newString[elementos];// quebrando a string em um arrayfor(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;}}returnretorno;}}}
R
renandpfPJ
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
Juliano_CarnielPJ
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
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
Abraços!
R
renandpfPJ
Aproveitando…
Como faço para criar e escrever em um arquivo em J2ME?
Já procurei e não encontrei nada…
Valeu!
C
clvPJ
A pricipio não tem como! A menos que vc ache uma JSR especifica pra isso!