Modificar archivos txt en j2me

Iniciado por dark33, 22 Octubre 2010, 05:09 AM

0 Miembros y 1 Visitante están viendo este tema.

dark33

Hola a todos. Estoy haciendo una aplicacion que permite modificar un archivo txt. La idea es que si por ejemplo el archivo txt existe en el celular pueda agregar una nueva linea al final de la ultima masomenos asi:

archivo txt actual:

linea1
linea2
linea3

Agrego una nueva linea4 al archivo txt

linea1
linea2
linea3
linea4

Eh intentado agregar pero se me sobrescribe la primera linea.Luego intente con \r\n y me sale el simbolo '?' al final de la linea. Una solucion que habia planteado era leer primero todo el archivo txt y luego recuperar todos los datos como string en una variable "datos" de tipo string.Posteriormente sumar el string que quiero agregar como linea osea "datos"+"linea4" y para que se vaya abajo le aumente \r\n ,asi ,"datos"+"\r\n"+"linea4. Me funciono en parte.Pero cada vez que hago una escritura, la linea se le agrega el simbolo '?' al final.

El codigo es el siguiente:

Código (java) [Seleccionar]
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import javax.microedition.io.Connector;
import javax.microedition.io.file.FileConnection;
public class writeMemory{
   private String url;
   private FileConnection fc;
   private OutputStream os;
   private String data;
   private PrintStream ps;
   public writeMemory(String vurl){
       url=vurl;
   }
   
   public void write(String vdata){
       data=vdata;
       new Thread(new Runnable() {
           public void run() {
               try {
                   fc = (FileConnection) Connector.open(url);
                   if (!fc.exists()) {
                      fc.create();  
                   }
                   os = fc.openOutputStream();
                   String datos="";
                   InputStream fis = fc.openInputStream();
                   int value=0;
                   while((value=fis.read())!=-1){
                       System.out.print((char)value);
                       datos=datos+(char)value;
                    }
                   System.out.println((char)value);
                   datos=datos+(char)value;
                   fis.close();
                   ps = new PrintStream(os);
                   ps.print(datos+"\r\n"+data);
                   ps.flush();
                   ps.close();    
                   fc.close();    
               } catch (IOException ex) {
                   ex.printStackTrace();
               }
           }
       }).start();
   }
}

Espero que me puedan ayudar.Desde ya muchas gracias.






[D4N93R]

Hola, no conozco mucho de Java, pero te digo lo siguiente:

1) Todo código debe estar dentro de [code=java][/code].
2) NUNCA anides Try-Catch, con uno solo es suficiente, y en tal caso puedes validar por errores, lo cual es recomendable.
3) Revisa la documentación sobre el PrintStream.
4) En esta parte:
Código (java) [Seleccionar]
public void write(String vdata){
        data=vdata;

No lo debes hacer así, puedes usar el mismo vdata.
5) No se porqué estas usando un subproceso.
6) No estás validando Race Conditions y ni todo lo referente a multi-threading.

Un saludo.

dark33

#2
Hola D4N93R. Use varios Try-Catch para poder hacer pruebas nómas =). Por otra parte al hilo lo puse porque  supuestamente se puede producir un dead lock que hasta ahora no me paso. Teniendo el hilo no me deja usar el vdata directamente salvo que sea un final.
Saludos.

[D4N93R]

Si estás haciendo pruebas, instancia la clase y llama a ese método varias veces, y usa alguna forma de identificar cada vuelta para que se te haga más fácil la depuración. Con respecto a escribir al final del archivo, creo que hay una clase que se llama FileWriter, en el constructor hay un parámetro que se llama append, le pass true.

Un saludo!

dark33

#4
Hola de nuevo.Efectivamente si hay una clase FileWriter pero es para la plataforma Java y no esta disponible para J2ME  :-[. Asi que no me quedo otra que utilizar la interfaz FileConnection.
Saludos.
.

dark33

#5
Hola a todos.Despues de lidiar con esto pude solucionar el problema de que aparezcan el caracter '?' y el otro simbolo parecido a este '□'. Al hacer  datos=datos+(char)value se adjuntaba el simbolo '?' al string datos ya que este siempre aparece al final de la ultima linea. Tambien al hacer por ejemplo ps.println(texto) se escribia el simbolo '□'.La linea  datos=datos+(char)value; del codigo anterior ya no iria ya que era la que adjuntaba el simbolo '?' y se utiliza el metodo print y no println de la clase PrintStream .
Código (java) [Seleccionar]

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import javax.microedition.io.Connector;
import javax.microedition.io.file.FileConnection;
public class writeMemory{
   private String url;
   private FileConnection fc;
   private OutputStream os;
   private String data;
   private PrintStream ps;
   public writeMemory(String vurl){
       url=vurl;
   }
   
   public void write(String vdata){
       data=vdata;
       new Thread(new Runnable() {
           public void run() {
               try {
                   fc = (FileConnection) Connector.open(url);
                   if (!fc.exists()) {
                       fc.create();
                   }
                   os = fc.openOutputStream();
                   String datos="";
                   InputStream fis = fc.openInputStream();
                   int value=0;
                   while((value=fis.read())!=-1){
                       System.out.print((char)value);
                       datos=datos+(char)value;
                    }
                   System.out.println((char)value);
                   ps = new PrintStream(os);
                   ps.print(datos+"\r\n"+data);
                   ps.close();
                   fis.close();
                   fc.close();
               } catch (IOException ex) {
                   ex.printStackTrace();
               }
           }
       }).start();
   }
}
.
Si bien funciona bien el codigo me gustaria una mejor solucion mas optmizada puesto que esta aplicacion se ejecuta sobre un celular y ademas por cada escritura que se hace se necesita recuperar los datos del txt y concatenarle la nueva linea. Lo mejor seria posicionarse en la ultima linea y hacer un retorno de carro y escribir la nueva linea directamnete. Esto no lo pude conseguir con J2ME.
Saludos.