J2ME - ESCREVER arquivos Texto ou XML [RESOLVIDO]

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:

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

E porque não pode explicar aqui??

É diferente dos outros??

E porque não pode explicar aqui??

É diferente dos outros??[/quote]

Ele quis dizer fora da Thread, Cristo ! :?

É coisa que todo desenvolvedor J2ME tem que saber.

E porque não pode explicar aqui??

É diferente dos outros??[/quote]

Ele quis dizer fora da Thread, Cristo ! :?

É coisa que todo desenvolvedor J2ME tem que saber.[/quote]

Epa disfarça :smiley:

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

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

no titulo deste post esta escrito RESOLVIDO.

Resolvido como? Qual foi a solucao encontrada?

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

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.

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

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();

    }

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.

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();

    }
  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í…

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

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

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.

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 .

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();
    }