J2ME - ESCREVER arquivos Texto ou XML [RESOLVIDO]

23 respostas
J

Boa noite. Eu peço desculpas de antemão mas estou com um problema seríssimo.
Preciso externalizar dados de uma aplicação J2ME para sincronizar as mesmas com uma aplicação no Computador.
A forma que eu acho que seria a mais simples, seria gravar os dados em um arquivo, seja ele XML ou TXT e enviá-lo para a máquina via BlueTooth.
Porém, tudo que eu encontrei não funciona. Pedem para usar o FileConnection, mas no NetBeans Mobility não funciona, dá pau. Tentei apenas criar o .jar e enviar para os telefones, um Nokia, um Motorola e um Sony-Ericksson. Nenhum dos tres aparelhos aceitou a funcionalidade.

Então por favor, pelo amor de tudo que é mais sagrado, eu não estou aguentando mais pesquisar e não encontrar nada. Não é possível que não haja como fazer isso.
Se o problema é permissões de escrita, é possível modificar isso?
Ou existe uma outra forma de se fazer?

Para XML eu tentei usar o Kxml2, que como parser é muito bom, mas não funciona para gravar no arquivo.

Obrigado pela atenção.

[RESOLVIDO]
Depois de muito bater cabeça e nem os mestres de java do meu trampo saberem como se fáz, dei sorte e achei como fazer.
O macete é usar o FileConnection, porém dentro de uma Thread, assim:

new Thread(new Runnable() { public void run() { FileConnection fc = null; try{ fc = (FileConnection)Connector.open("file://localhost/root1/teste.txt"); if (!fc.exists()) { throw new IOException("O arquivo não existe."); } //InputStream fis = fc.openInputStream(); OutputStream write = fc.openOutputStream(); write.write("Vamos ver se vai funcionar mesmo".getBytes()); // //Para ler faça Assim: // byte[] b = new byte[1024]; // int length = fis.read(b, 0, 1024); // String obj = new String(b,0,length); // fis.close(); // //Para ler faça Assim: fc.close(); }catch(Exception e){} } }).start();
Estando dentro da Thread ele processa o arquivo, fora não.
Espero que sirva para alguém como servirá para mim.
Abraço a todos !! :smiley:

23 Respostas

S

Posso te explicar pq nao funcionou por fora ou vc ja entendeu?

F

E porque não pode explicar aqui??

É diferente dos outros??

P

E porque não pode explicar aqui??

É diferente dos outros??

Ele quis dizer fora da Thread, Cristo ! :?

É coisa que todo desenvolvedor J2ME tem que saber.

F

E porque não pode explicar aqui??

É diferente dos outros??

Ele quis dizer fora da Thread, Cristo ! :?

É coisa que todo desenvolvedor J2ME tem que saber.

Epa disfarça :smiley:

S

O boone, o kra so fez por adivinhacao e xute, queria explicar pra ele pq nao funcionou. Foi por isso que eu disse isso.

J

Então explica aí pq não funcionou fora da Thread, por favor… eu não sei o porque!!! =-/

D

no titulo deste post esta escrito RESOLVIDO.

Resolvido como? Qual foi a solucao encontrada?

F

Ele conseguiu escrever uma string num arquivo.
Tudo isso deve estar dentro de uma Thread, senao nao funciona.

Ae, alguem sabe tecnicamente pq nao funciona se o código estiver fora de uma thread?

Valeu

E

Na verdade assim, pelo muito que pesquisei, sei que existe 2 tipos de sistema de arquivos.

Existe a maneira de vc abrir um arquivo enviado pelo .jar e a outra maneira é pegar os arquivos do sistema do celular.

Pelas pesquisas vi que com o FileConnection você consegue acessar os arquivos do palm de uma determinada pasta, mais não consegue acessar os arquivos enviados pelo .jar. E no ponto usando a classe midlet.getClass().getResourceAsStream(“xx.txt”) ele pega só arquivos do .jar, mais só abre, tb não consigo fazer a gravação dos arquivos.

Também me matei e até agora não estou conseguindo ler e gravar arquivos usando o FileConnection, pois no celular funciona, mais coloco no palm já não fumega. rsss

No Mais é isto pessoal, abraços.

R

aheee! alguem explica entao porque não funciona fora da thread uai!!
enrolaram pacas e nao explcaram!!
valeu!

J

Dae pessoal, utilizei o codigo do inicio para criar o código de que preciso, que é coletar os dados armazenados no RMS e gerar um xml. Mas no simulador do Wireless Tolkit aparece que o aplicativo está tentando ler e escrever e pede autorização e não acontece. Alguem poderia me dizer se o problema é no código ou na configuração do emulador:

private void gerarXML() {
        new Thread(new Runnable() {
            public void run() {
                FileConnection fc = null;
                try{
                    ObjectSet os = pm.find(Infracao.class, null, new OrdemId());
                    fc = (FileConnection)Connector.open("file://localhost/c:/Teste.xml",Connector.READ_WRITE);
                    if (!fc.exists()) {
                        fc.create();
                    }
                    OutputStream escreve = fc.openOutputStream();
                    escreve.write("<?xml version='1.0' encoding='ISO-8859-1'?>".getBytes());

                    while (os.hasNext()){
                        Infracao infracao = (Infracao) os.next();
                        escreve.write(("<infracao cd_infracao='" + infracao.getCd_infracao() + "'>").getBytes());
                        escreve.write(("<nr_agente>" + infracao.getNr_agente() + "</nr_agente>").getBytes());
                        escreve.write(("<placa>" + infracao.getPlaca() + "</placa>").getBytes());
                        escreve.write(("<modelo>" + infracao.getModelo() + "</modelo>").getBytes());
                        escreve.write(("<local>" + infracao.getLocal() + "</local>").getBytes());
                        escreve.write(("<tipo>" + infracao.getTipo() + "</tipo>").getBytes());
                        escreve.write(("<data>" + infracao.getData() + "</data>").getBytes());
                        escreve.write(("<hora>" + infracao.getHora() + "</hora>").getBytes());
                        escreve.write(("<obs>" + infracao.getObs() + "</obs>").getBytes());
                        escreve.write(("<nulo>" + infracao.getNulo() + "</nulo>").getBytes());
                        escreve.write("</infracao>".getBytes());
                    }
                    fc.close();
                }catch(Exception e){
                    getAlStatus().setString("Erro: " + e.getMessage());
                    getAlStatus().setType(AlertType.ERROR);
                    switchDisplayable(alStatus, getAlStatus());
		}
            }
        }).start();

    }
P

Faz o favor de arrumar sua URL que está erradíssima ?

O correto é você determinar um path válido através de System.getProperty() e a partir daí apendar o nome do arquivo e formar então uma URL válida.

Quanto ao emulador, teu JAD precisa ter declarada as permissões READ e/ou WRITE.

E parabéns por fazer certo de colocar este código dentro da Thread.

J

Dae boone. Eu fiz as alterações que você disse alterando tb o arquivo JAD, mas ainda assim não aontece nada. Vou postar o codigo alterado:

private void gerarXML() {
        new Thread(new Runnable() {
            public void run() {
                FileConnection fc = null;
                try{
                    ObjectSet os = pm.find(Infracao.class, null, new OrdemId());
                    String arquivo = System.getProperty("fileconn.dir.private") + "Teste.xml";
                    fc = (FileConnection)Connector.open(arquivo,Connector.READ_WRITE);
                    if (!fc.exists()) {
                        fc.create();
                    }
                    OutputStream escreve = fc.openOutputStream();
                    escreve.write("<?xml version='1.0' encoding='ISO-8859-1'?>".getBytes());

                    while (os.hasNext()){
                        Infracao infracao = (Infracao) os.next();
                        escreve.write(("<infracao cd_infracao='" + infracao.getCd_infracao() + "'>").getBytes());
                        escreve.write(("<nr_agente>" + infracao.getNr_agente() + "</nr_agente>").getBytes());
                        escreve.write(("<placa>" + infracao.getPlaca() + "</placa>").getBytes());
                        escreve.write(("<modelo>" + infracao.getModelo() + "</modelo>").getBytes());
                        escreve.write(("<local>" + infracao.getLocal() + "</local>").getBytes());
                        escreve.write(("<tipo>" + infracao.getTipo() + "</tipo>").getBytes());
                        escreve.write(("<data>" + infracao.getData() + "</data>").getBytes());
                        escreve.write(("<hora>" + infracao.getHora() + "</hora>").getBytes());
                        escreve.write(("<obs>" + infracao.getObs() + "</obs>").getBytes());
                        escreve.write(("<nulo>" + infracao.getNulo() + "</nulo>").getBytes());
                        escreve.write("</infracao>".getBytes());
                    }
                    fc.close();
                    getAlStatus().setString("Arquivo Gerado.");
                    getAlStatus().setType(AlertType.INFO);
                    switchDisplayable(alStatus, getAlStatus());
                }catch(Exception e){
                    getAlStatus().setString("Erro: " + e.getMessage());
                    getAlStatus().setType(AlertType.ERROR);
                    switchDisplayable(alStatus, getAlStatus());
		}
            }
        }).start();

    }
P
  1. Se eu fosse vc utilizaria “fileconn.dir.photos” que é muito mais tranquila de funcionar e ser compativel com outras marcas

  2. Kd os atributos no JAD ? Mostra aí…

J

Dae cara, os atributos estaum ae;

MIDlet-1: PrototipoTCC,/res/semaforo.png,PrototipoTCC
MIDlet-Jar-Size: 222784
MIDlet-Jar-URL: PrototipoTCC.jar
MIDlet-Name: PrototipoTCC
MIDlet-Permissions: javax.microedition.io.Connector.file.read, javax.microedition.io.Connector.file.write
MIDlet-Vendor: Juliano Maccari
MIDlet-Version: 1.0
MicroEdition-Configuration: CLDC-1.1
MicroEdition-Profile: MIDP-2.0

A

OutputStream nunca funcionou comigo,me matei bastante tentando fazer um chat por bluetooth ate descobrir que celular so funciona com DataOutputStream.

J

O aplicativo gera o arquivo no emulador, mas fica pedindo a cada loop para ler ou gravar no arquivo. AntonioDiego, como tu falou em Bluetooth, tu tens uma sugestão de como eu posso enviar este arquivo gerado por Bluetooth.

A

na maioria das conexoes basta voce ter os bytes do arquivo ,ou qualquer bytes que voce queira enviar.

//voce tem os bytes no array

byte[] bytes=new byte[1024];//bytes que serao enviados

DataOutputStream out=conn.openDataOutputStream();

out.write(bytes);

out.flush;
//se o arquivo for muito grande tera que usar um buffer ,pois o java me nao pode alocar muitos bytes e da outofmemory

//tem o inputstream do arquivo- in

byte[] buffer=new byte[1024];

int byteslidosnobuffer=0;
while((byteslidosnobuffer=in.read(buffer)!=-1){// in.read(buffer) ler do arquivo para o array de bytes e retorna quantos bytes faram lidos,o mesmo que in.read(buf,0,buf.length);

out.write(buffer,0,byteslidosnobuffer);

out.flush;

}

use DIS e DOS .

J

Bom pergunta algumas vezes para ler ou gravar, acho que isso é normal. Mas alguém sabe me dizer pq na Thread o código não chama o alert e na estrutura try catch ele entra nos dois no debug.

private void gerarXML() {
        new Thread(new Runnable() {
            public void run() {
                FileConnection fc = null;
                try{
                    ObjectSet os = pm.find(Infracao.class, null, new OrdemId());
                    String arquivo = System.getProperty("fileconn.dir.photos") + "Teste.xml";                    
                    String teste;
                    fc = (FileConnection)Connector.open(arquivo);
                    if (!fc.exists()) {
                        fc.create();
                    }
                    OutputStream escreve = fc.openOutputStream();
                    teste = "<?xml version='1.0' encoding='ISO-8859-1'?>\r\n<infracoes>\r\n";

                    while (os.hasNext()){
                        Infracao infracao = (Infracao) os.next();
                        teste = teste + "<infracao cd_infracao='" + infracao.getCd_infracao() + "'>\r\n" +
                        "<nr_agente>" + infracao.getNr_agente() + "</nr_agente>\r\n" +
                        "<placa>" + infracao.getPlaca() + "</placa>\r\n" +
                        "<modelo>" + infracao.getModelo() + "</modelo>\r\n" +
                        "<local>" + infracao.getLocal() + "</local>\r\n" +
                        "<tipo>" + infracao.getTipo() + "</tipo>\r\n" +
                        "<data>" + infracao.getData() + "</data>\r\n" +
                        "<hora>" + infracao.getHora() + "</hora>\r\n" +
                        "<obs>" + infracao.getObs() + "</obs>\r\n" +
                        "<nulo>" + infracao.getNulo() + "</nulo>\r\n" +
                        "</infracao>\r\n";
                    }
                    teste = teste + "</infracoes>\r\n";
                    escreve.write(teste.getBytes());
                    getAlStatus().setString("Arquivo Gerado.");
                    getAlStatus().setType(AlertType.INFO);
                    switchDisplayable(alStatus, getAlStatus());
                    escreve.flush(); 
                }catch(Exception e){
                    getAlStatus().setString("Erro na geração do arquivo. ");
                    getAlStatus().setType(AlertType.ERROR);
                    switchDisplayable(alStatus, getAlStatus());
		}
            }
        }).start();
    }
A

essa coisa desse property que voce pegou nao funciona, e tambem Outputstream nao funcina no celular.

J

E qual caminho devo utilizar para salvar o arquivo.

A
public void salva(){

new Thread(){

public void run(){

FileConnection conn=(FileConnection)Connector.open(file:///E:(Drive E:/-Cartao de Memoria)/Other/newfile.xml”);

conn.create();

DataOutputStream out=conn.openDataoutputStream();

out.writeUTF(Escrevendo no arquivo);

out.flush();

out.close();

conn.close();

}

}.start();

}
A

e cade a resoluçao.

Criado 6 de março de 2009
Ultima resposta 13 de mai. de 2011
Respostas 23
Participantes 11