problema al escribir datos en un fuchero

Iniciado por Toryas, 22 Octubre 2007, 06:04 AM

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

Toryas

hola amigos miren tengo el siguiente problema

que necesito  hacer que cuando ingreso unos datos me los valla guardando en un fichero en este caso un txt lo bonito es que cuendo voy ingresando los datos me los va escribiendo en el fichero, lo feo es que cuendo ingreso otro listado de datos me los va escribiendo en la smismas lineas donde  estaban los datos del listado anterior :( oce ala cosa es que tengo que ir ingresdando clientes y  los datos los va wardando en un fichero pero quiero hacer que se vallan guardando  en blokeas acia abajo pero no puedo hacerlo miren aka les dejo los codigos que llevo

este es la clase para escribir
import java.io.*;
import java.util.Date;
import java.text.DateFormat;
public class EscrituraContacto {
private FileWriter writer;
private BufferedWriter buffer;
private PrintWriter output;


public void abrir() throws IOException {
try {
writer = new FileWriter( "clientes.txt" );
buffer = new BufferedWriter(writer);
output = new PrintWriter(writer);
}
catch (SecurityException securityException) {
System.err.println("No tiene permiso para escribir en el fichero");
throw securityException;
}
catch (FileNotFoundException fileException) {
System.err.println("Error al crear el fichero" );
throw fileException;
}
}


public void escribir (String a) {
if (a!=null){
output.println(a);
}

}


public void cerrar()throws IOException {
if ( output != null )
output.close();

}
}


esta es de donde llamo
import java.io.*;
public class Taller{
public static Listas listas = new Listas();
public static BufferedReader teclado = new BufferedReader (new InputStreamReader(System.in));
public static Taller obj = new Taller();
public static byte opc = 0;
public static EscrituraContacto cliente = new EscrituraContacto();


public static void main(String[] args) throws IOException{


obj.menu();
   
}

public void menu()throws IOException{
System.out.println( "\t\t\t\t  MENU PRINCIPAL\n\n");
        System.out.println( "\t\t\t 1.-  Ingresar Cliente\n");
        System.out.println( "\t\t\t 2.-  Buscar Cliente \n ");
        System.out.println( "\t\t\t 3.-  Agregar Cliente\n ");
        System.out.println( "\t\t\t 4.-  Modificar Cliente\n ");
        System.out.println( "\t\t\t 5.-  Salir \n ");
       
        System.out.print("\nIngrese opcion : ");
        try {
         
          opc = Byte.parseByte (teclado.readLine());
          }

          catch (Exception e) {
           
          System.out.println("\n\nIngrese solo Numeros");
          obj.menu();
        }
       
        switch (opc){
        case 1 : obj.menu();
        break;
       
        case 2 : obj.menu();
        break;
       
        case 3 :obj.agregarCliente();
        obj.menu();
        break;
       
        case 4 : obj.menu();
        break;
       
        case 5 : System.exit(0);
        break;
       
        default :System.out.println("\nINGRESE UNA OPCION VALIDA");
                obj.menu();
              break;
      }
       
       

}
public void agregarCliente()throws IOException{

String nombre, apellido,direccion,telefono,rut;

System.out.println("Ingrese Nombre");
nombre = teclado.readLine();
System.out.println("Ingrese Apellido");
apellido = teclado.readLine();
System.out.println("Ingrese rut");
rut = teclado.readLine();
System.out.println("Ingrese Direccion");
direccion = teclado.readLine();
System.out.println("Ingresar Telefono");
telefono = teclado.readLine();
listas.addCliente(new Cliente(nombre, apellido, rut,telefono, direccion));
cliente.abrir();
cliente.escribir(nombre);
cliente.escribir(apellido);
cliente.escribir(rut);
cliente.escribir(direccion);
cliente.escribir(telefono);
cliente.cerrar();
}


}


bueno estoy en pañales con esta cosa de java asi que nos e mucho asi que si encuentran que el codigo es algo precario nose rian XD


egyware

#1
ya entendi tu problema. ;D

Código (java) [Seleccionar]

writer = new FileWriter( "clientes.txt" );
buffer = new BufferedWriter(writer);  //cual s la gracia de crear un buffer si no lo vas a usar
output = new PrintWriter(writer);

ya ahora si.
cuando tu escribes un archivo, primero la computadora lo abre pero en el principio de tal osea lo abre al principio del cuarderno(supongamos que un cuaderno es un archivo), y cada vez que lo abres, lo abres al principio, tu tienes que decirle a la computadora que tienes que abrir la ultima pagina (que esta en blanco) y ahi escribir.
si no me equivoco, la clase que hace esa maravilla es la RandomAccessFile pero hay que hacerle algunas modificaciones a ella, pero te permite cambiarte a la ultima pagina, (ademas de otras cosas como leer y escribir).

te la clase modificada:

Código (java) [Seleccionar]

public class AppendFile extends java.io.RandomAccessFile {
//Closeable, DataInput, DataOutput  tb implementa para completar tu trabajo
public AppendFile (String name, String mode) {
super (name,mode);//solo son contructores no hare nada aqui
}
public AppendFile (File file, String mode) {
super (file,mode);//solo son contructores no hare nada aqui
}
public void setPosFinal(){ //aqui lo que hago es posisionarme al final
this.seek(this.length()); //el this es innecesario pero te lo dejo igual

}

}

bueno si me equivoque en algo avisa pero esencia es eso, ultimamente estado solo jugando y nada de programacion :-[
bueno espero que te aya sido te ayuda adios ;D

aqui esta el api
http://java.sun.com/j2se/1.5.0/docs/api/java/io/RandomAccessFile.html

Toryas

hola bueno trate d eimplementar lo que me pusiste pero no pude :( XD

weno trate de hacer que al abrir el archivo me lo obriera en el final pero no pude

segun la api al usar el metodo seek tengo que  darle como parametro la posicion final

pero no se como  hacer para darle dicha posicion

en esta linea:

this.seek(this.length());

me da error en el length()

bueno cre que es lo mas practico lo de agregar al metodo abrir que se se ubike en el final del archivo pero no cacho como hacerlo slaudos

y gracias

egyware

#3
mmmmmm?????
creo que me falto algo... :huh: :huh:
Citar
public void seek(long pos)
          throws IOException
esta cita es del api de java lo que dice que el codigo debe estar vigilado por try y cacth
al lo que te deje modifica el metodo
asi
Código (java) [Seleccionar]

import java.io.*;
//...
public void setPosFinal(){
try {
seek(length());
}
catch (IOException e){
e.printStackTrace();//opcional
}
}
//...

o
Código (java) [Seleccionar]

import java.io.*;
//...
public void setPosFinal() throws IOException{
seek(length());
}
//...

pero la segunda opcion cada vez que uses setPosFinal() tendras que vigilar el codigo con try y catch
/**el this porsia es una referencia al mismo objeto*/
espero que sea ese el problema con las excepciones porque no  se me ocurre pero voy a revisar mi codigo para ver que falla (de hace ya un tiempecito que no programo  :-\:xD)

Toryas

jaja bueno bueno
que metodo pa poner en la ultima fila ni nada pero me percatede un erro que tenia ne el codigo

bastante tonto fui pero bueno toy en etapa de aprendizage

miren este era el problema

en esta parte de la clase escrtura:
public void abrir() throws IOException {
try {
writer = new FileWriter( "clientes.txt" );
buffer = new BufferedWriter(writer);
output = new PrintWriter(writer);
}


tansolo era agregar 5 caracteres XD

y tenia que dejar esta linea asi:
Código (java) [Seleccionar]
writer = new FileWriter( "clientes.txt",true );

tonto no ?XD

weno lo que estaba hciendo era siempre generar un archivo en vez de ocupar el que ya tenia

wneo gracias por la ayuda

marioly

Citartansolo era agregar 5 caracteres XD

Asi es, FileWriter tiene un constructor sobrecargado donde el segundo parametro indica si es append, por default ponen esto a false para que actue como truncate, siempre checa la documentacion de sun, alli vienen los parametros y metodos sobrecargados, o en algunos ide's te son indicados al vuelo :)