sábado, 7 de enero de 2012

Escribiendo y leyendo en un archivo de texto con java





Es un código simple escrito para ustedes, donde implemento las dos operaciones basica para este tipo de problemas, lectura y escritura de un archivo plano de texto (El resto de operaciones posibles se desprenden de estas), espero les sea de utilidad.

Aparte les dejo al final el proyecto hecho en Netbeans usando interface grafica.

Nota: En la ruta si usan Windows al igual que en Linux deben usar el "/".

Hosting
Codigo de la clase Archivo:

//Autor: Rey Salcedo Padilla
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;

public class Archivo{

 public void escribir(String ruta, String cadena){
  File archivo = new File(ruta);
   try {
    FileWriter escribirArchivo = new FileWriter(archivo, true);
    BufferedWriter buffer = new BufferedWriter(escribirArchivo);
    buffer.write(cadena);
    buffer.newLine();
    buffer.close();
   }catch (Exception ex) {
   }
 }

 public String leer(String ruta) {
  ArrayList array = new ArrayList();
  String linea = "";
  String retornar = "";
  File archivo = new File(ruta);
  try {
   FileReader leerArchivo = new FileReader(archivo);
   BufferedReader buffer = new BufferedReader(leerArchivo);
   while ((linea = buffer.readLine()) != null){
    retornar += linea + "\n";
   }
   buffer.close();
   }catch (Exception ex){
   }
 return retornar;
 }            
}




//Autor:Rey
Salcedo Padilla
public class Main{
 public static void main(String []args){
  Archivo archivo = new Archivo();
  String ruta = "/home/rey/Escritorio/ArchivoDeTexto/hola.txt";
  
   archivo.escribir(ruta,"Todos obedecen con gusto cuando el que manda es justo.");
   archivo.escribir(ruta,"Los años dan enseñanzas que los dias no alcanzan a comprender.");
 
  System.out.println(archivo.leer(ruta));
 }
}


Comenta acerca del código.




38 comentarios:

  1. Muchas gracias men, me sirvio de mucho

    ResponderEliminar
  2. hola necesito crear un formulario html que inserte registros a un .txt sin utilizar php gracias....

    ResponderEliminar
    Respuestas
    1. hola oye eso es imposible.. para hacer eso tienes que usar algun lenguaje de programacion web y html solo es de diceño web XDD si nesesitas ayuda con eso este es mi correo i_s_ra789@hotmail.com

      Eliminar
  3. De antemano muy agradecido
    atte.

    David desde Guate
    it_mdavid@hotmail.com

    ResponderEliminar
  4. esta bueno, y como se aria si quisiera despues de modificarlo, guardarlo en otro archivo de texto?????

    ResponderEliminar
  5. Hola.

    en la clase Archivo implementé un método llamado escribir así:

    escribir(String ruta, String cadena); donde la ruta seria donde voy a guardar el archivo, en el caso de tu pregunta seria una ruta y nombre diferente al original, y cadena seria el contenido de JTextField y listo.

    Lo demás de Por medio JDialog solicitar los nuevos datos.

    Inténtalo y me cuentas, anonimo

    ResponderEliminar
  6. muchisimnas gracias, me gustaria saber como puedo contar los caracteres de un texto y ademas de eso, por ejemplo saber cuantas "a" hay en un texto... seria de mucha ayuda gracias

    ResponderEliminar
  7. Si lo tienes almacenado en un String, puede hacerlo con el metodo length(); para contar cuantas letras 'a' hay ten encuenta que las cadena en Java con vectores char, por ejemplo:

    char data[] = {'a', 'b', 'c'};
    String str = new String(data);

    //Es quivalente a:

    String str = "abc";

    Es decir lo puedes recorrer y contar solo las 'a'
    ----------------------------------------------------

    Si no quieres implementar estos metodos; mira la documentacion de java (http://docs.oracle.com/javase/6/docs/api/) y ubicate en la clase String; veras muchos metodos que te facilitaran las cosas; escribe algo de codigo y comentalo en este blogger.

    ResponderEliminar
  8. public class ejemplo{
    public static void main(String []args){
    String cadenaTexto = "En un recinto del zoológico se "+
    "tienen dos tipos de animales: avestruces y "+
    "jirafas. Hay 30 ojos y 44 patas, "+
    "¿cuántos animales hay de cada tipo?";

    System.out.println("------------------------");
    System.out.println(cadenaTexto);
    System.out.println("------------------------");

    //Como un String es un vector char
    //lo recorreremos para saber su longitud
    int contador = 0;
    for(char letra:cadenaTexto.toCharArray()){
    contador++;
    }
    System.out.println("Numero de caracteres:" + contador);
    System.out.println("------------------------");

    //forma mas simple de saber la longitud (recomendada)
    System.out.println("Numero de caracteres:" + cadenaTexto.length());
    System.out.println("------------------------");

    //-----------------------------------------------
    contador = 0;
    char letraABuscar = 'a';
    for(char letra:cadenaTexto.toCharArray()){
    if(letraABuscar == letra){
    contador++;
    }
    }
    System.out.println("La letra '"+letraABuscar+"' esta " + contador + " veces.");

    }
    }

    ResponderEliminar
  9. muy buen post, tengo una duda si quisiera que cuando abra el archivo me leyera 8 lineas y las escribiera en una sola como seria?

    ResponderEliminar
  10. Observa que escribi un metodo llamado leer(String ruta), el cual contiene un ciclo while que itera siempre que exista una linea que leer en el archivo.

    la respuesta seria que vallas acumulando cada 8 lineas leidas, das un enter "/n" y asi hasta que ya no tengas lineas que leer, despues retorna

    Intenta y me dices como te fue.

    ResponderEliminar
  11. no me quedo muy claro, esta es la parte de codigo que mencionas
    while ((linea = buffer.readLine()) != null){

    retornar += linea + "\n";
    }
    cuando mencionas acumular mi duda es en donde lo acumulo? acaso a esto te refieres

    for(int i=1;i<9;i++){
    linea?????????
    }

    ResponderEliminar
  12. se me ocurre que lo concadenes en una variable String temporal, cuando el ciclo llegue a 8 o 16, etc; lo agregas a la variable retornar y listo.

    ResponderEliminar
  13. Otra idea mejor que se me acaba de ocurrir es: si te das cuenta el lee una linea y zas da un enter y asi hasta leer todo el archivo.

    cambiemos eso, y le damos enter solo cuando hallamos leido 8 lineas, y luego 16 y etc.

    ResponderEliminar
  14. hola que tal rey muchas gracias por toda la ayuda ya logre que lea un numero definido de lineas las ponga en una sola y luego haga el salto de linea el codigo me quedo de la sig manera
    while ((linea = buffer.readLine()) != null){
    if(operador<2){
    retornar +=linea + ",";
    operador++;
    }else{
    operador=0;
    retornar +=linea + "\n";
    }

    }

    mi duda es la siguiente: comence por leer 3 lineas y ponerle una coma y luego haga el salto de linea digo si hace esto lo hara para cualquier numero de lineas, asi que mi contador lo inicialice en 0 lo aumente de 1 en 1 pero sorpresa si le pongo 3 me devuelve 4 lineas.
    porque??????
    lo mas practico le puse oprador<2 y quedo pero me quede con esa duda. sinceramente no estaba tan dificil pero esperaba que alguien lo hiciera por mi cuando me sente y decidi pensar fue mas facil

    ResponderEliminar
  15. ahora tengo otra duda cuando guardo el archivo me sobreescribe el primero y ademas no respeta el texto como aparece en textfield, lo escribe todo en una sola cadena, tendria que hacer lo mismo en el metodo escribir como lo hice en el metodo leer?

    ResponderEliminar
  16. Hola para la primera pregunta, la respuesta es que recuerda que cuando inicias desde cer, el cero se evalua tambien.

    es decir, si pones 3; se elavalua el 0,1,2,3; si te das cuenta son 4 numeros

    ResponderEliminar
  17. Con relacion a lo de sobre escribir en la clase Archivo mira la linea.

    FileWriter escribirArchivo = new FileWriter(archivo, true);

    Cambia el true por false; y mira lo que sucede

    ResponderEliminar
  18. mmm no conserva nada del archivo anterior y sobre escribe todo, pero aun asi cuando lee el archivo y coloca el texto en el textfield me aparece asi

    victor palomo,123456789,victor@palomo.com
    ana luisa,987654321,ana@luisa.com
    donaji guti,789456123,donaji@guti.com

    y cuando lo guardo me aparece todo seguido como una sola cadena sin saltos de linea osea quiero que se guarde como aparece en el textfield y otra pregunta cuantas lineas puedo abrir en ese textfield

    ResponderEliminar
  19. tengo un archivo donde cada 4 lineas corresponde a un registro el archivo esta asi
    nombre
    email
    celular
    empresa
    entonces yo leo 4 lineas y las pongo seguidas y separadas con comas
    nombre,email,celular,empresa
    el problema es que el archivo es como de 60,000 lineas entonces debe leer el archivo, ordenar y guardar en un nuevo, tome este ejemplo para probar como podria hacerlo pero no se que tan factible sea hacerlo de una manera similar

    ResponderEliminar
  20. Recuerda que si quieres generar saltos de lineas debes usar "\n"; y otra cosa, no seria mejor que guardes cada registro asi por ejemplo:

    nombre:fulanito;email:fulanito@talcosa.com;celular:0000;empresa:holamundo

    ResponderEliminar
  21. en realidad le pongo comas porque de esta forma lo podria abrir en un excel tipo csv, oye rey crees que el textfield pueda soportar un archivo txt asi de grande como de 100,000 lineas, o habra otra forma de hacerlo???

    ResponderEliminar
  22. para archivos csv puedes usar cualquier separador; creo que en vez de usar JTextField, te sirve mas JTextArea:

    lo que te sugeri con relacion a los registro o filas asi:

    nombre:fulanito;email:fulanito@talcosa.com;celular:0000;empresa:holamundo

    es porquye puedes primeramente partir la cadenas usando el ";" como separacion y luego extraer el dato usando los ":"

    Cuando tenga tiempo te envio un metodo, yo hice halgo igual hace tiempo

    ResponderEliminar
  23. bueno intentare hacer que funcione el problema es que ya voy sobre tiempo y ya necesito poner a correr el programa, muchas gracias rey de todos modos sigo con la misma duda este es el metodo para escribir
    public void escribir(String ruta, String cadena){
    File archivo = new File(ruta);
    try {
    FileWriter escribirArchivo = new FileWriter(archivo, false);
    BufferedWriter buffer = new BufferedWriter(escribirArchivo);
    buffer.write(cadena);
    buffer.newLine();
    buffer.close();
    }catch (Exception ex) {
    }
    }
    no entiendo donde podria el salto de linea, lo tendria que poner igual como hice el metodo leer

    ResponderEliminar
  24. hola rey te comento ya logre que funcionara aparte de los \n tenia que poner \r\n tenia que dar el salto de linea y luego el retorno de carro, trate de abrir el txt para que me ordenara el archivo pero como me lo temia el programa se atoro, estaba pensando que en lugar de que me lo abra en el txt me lo guarde directo en otro archivo, tu que opinas??? o que podria hacer? el archivo txt es de 100,000 lineas

    ResponderEliminar
  25. es oblitatorio que use archivos de texto plano? puede usar bases de datos portables?, esta ultima es una mejor opcion

    ResponderEliminar
  26. segun lo que me cuentas, quieres usar un formulario para tomar ciertos datos e irlos guardando en un archivo de texto, y luego recuperarlos; cuando dices ordenar te refieres a los datos en el archivo de texto?, como haces para recuperar los datos del archivo y luego mostrarlos?

    ResponderEliminar
  27. Mia este ejemplo que hice usando una base de datos portable en un archivo.

    http://usandojava.blogspot.com/2012/03/sqlite-java-y-un-ejemplo-practico.html

    ResponderEliminar
  28. Tienes razon no he sido muy claro con lo que tengo que hacer te explico,
    me dieron un archivo de texto tipo base de datos el problema es que los registros estan uno de bajo de otro,
    nombre
    direccion
    telefono
    email
    entonces tengo que abrir el archivo que son como 100,000 lineas y ordenar en columnas estos datos de la siguiente manera:
    nombre direccion telefono email
    realmente una vez que este ordenado puedo guardarlo donde sea en otro archivo txt, o en una base de datos lo importante es que se ordenen los datos en columnas

    ResponderEliminar
  29. Ordenar? mas bien organizar;

    prueba con este metodo; ruta es donde está el archivo, el archivo debe ser asi como me lo describistes, veras como te crea otro alli mismo pero organizado.

    public void Organizar(String ruta) {
    ArrayList array = new ArrayList();
    String linea = "";
    String retornar = "";
    File archivo = new File(ruta);

    int contador = 0;
    String cadena = "";

    try {
    FileReader leerArchivo = new FileReader(archivo);
    BufferedReader buffer = new BufferedReader(leerArchivo);
    while ((linea = buffer.readLine()) != null){
    if(contador != 4){
    cadena += linea+",";
    contador++;
    }else{
    escribir(ruta+"Orgganizado",cadena);
    cadena = linea+",";
    contador = 1;
    }
    }
    buffer.close();
    }catch (Exception ex){
    }
    }

    ResponderEliminar
    Respuestas
    1. De hecho rey ya lo organiza esa parte esta hecha mi duda ahora es sobre la rapidez para abrir el archivo pues te comento tiene como 100,000 lineas y me da la impresion que el programa truena o tu dime cuanto tardaria en organizar el txt que te comento

      Eliminar
  30. En archivos de texto plano es mas lento porque la consulta de informacion es secuencial; te recomuendo que pase eso a una base de datos, por ejemplo Sqlite el cual no necesitas innstalar servidor.

    mira el ejemplo: te puede servir:

    http://usandojava.blogspot.com/2012/03/sqlite-java-y-un-ejemplo-practico.html

    ResponderEliminar
  31. de cualquier modo necesito un programa que pase los datos del txt a la base de datos, no???

    ResponderEliminar
  32. Respuestas
    1. pues muchas gracias rey la verdad me sirvio muchisimo tus post y gracias por la atencion, nos vemos en tu otra publicacion jajajjajaja

      Eliminar

Entrada destacada

Matriz de adyacencia para un grafo

"La matriz de adyacencia es una matriz cuadrada que se utiliza como una forma de representar relaciones binarias."; aunque pa...