miércoles, 9 de mayo de 2012

Crear, leer y escribir Archivo de Texto [Java]

¡Hola! me encuentro de regreso por un momento en Curiosidades, se acerca el fin de la Sexta Unidad de Programación Orientada a Objetos y desde hace tiempo se me ocurrió hacer una publicación para darles ideas a mis compañeros, eso fue en mi otro blog iSysCompany, pero por razones de la nada fue cerrado y al parecer todo por mi culpa u_u, pero aun asi volví a realizar 2 pequeñas clases para mostrar a mis compañeros una idea de lo que tienen que entregar para dicha Unidad mencionada.

La primera clase que muestro a continuación se encarga de almacenar en un archivo de texto alguna cosa que quieras, en mi caso es una variable que ya tiene un valor, bien podria ser mas interactivo, ejemplo:
  1. Que se pida el dato por consola
  2. Que de opciones para guardar algunas cosas
  3. Etc. jeje
No se me ocurre nada, de eso se deben encargar ustedes compañeros, si están leyendo esta publicación mas vale que comiencen a pensar en algo.

La segunda clase muestra como leer el contenido de un archivo de texto, trabajaré con el nombre del archivo de la clase anterior.

El objetivo de esta Unidad es utilizar clases para escribir sobre archivo [Binarios o de texto] y usar accesos secuenciales o aleatorios para obtener el contenido de los archivos [Binarios o de Texto].

A mi se me facilito el uso de archivos de texto y por eso uso en los ejemplos las clases:
  • File (Para crear el archivo)
  • FileWriter (Para escribir sobre el archivo)
  • FileReader (Para leer el archivo)
El metodo write de la clase FileWriter es el que se encarga de escribir sobre el archivo de texto. Para no hacer largo esto, aqui estan las clases:

/*Clase que permite escribir en un archivo de texto*/

//Importamos clases que se usaran
import java.io.File;
import java.io.FileWriter;

public class Escribir
{
public static void main(String []args)
{

//Un texto cualquiera guardado en una variable
String saludo="Hola";

try
{
//Crear un objeto File se encarga de crear o abrir acceso a un archivo que se especifica en su constructor
File archivo=new File("texto.txt");

//Crear objeto FileWriter que sera el que nos ayude a escribir sobre archivo
FileWriter escribir=new FileWriter(archivo,true);

//Escribimos en el archivo con el metodo write
escribir.write(saludo);

//Cerramos la conexion
escribir.close();
}

//Si existe un problema al escribir cae aqui
catch(Exception e)
{
System.out.println("Error al escribir");
}
}
}

/*Clase que permite leer un archivo de texto*/

//Importamos clases a usar
import java.io.FileReader;
import java.io.BufferedReader;
public class Leer
{
public static void main(String arg[])
{
//Creamos un String que va a contener todo el texto del archivo
String texto="";

try
{
//Creamos un archivo FileReader que obtiene lo que tenga el archivo
FileReader lector=new FileReader("texto.txt");

//El contenido de lector se guarda en un BufferedReader
BufferedReader contenido=new BufferedReader(lector);

//Con el siguiente ciclo extraemos todo el contenido del objeto "contenido" y lo mostramos
while((texto=contenido.readLine())!=null)
{
System.out.println(texto);
}
}

//Si se causa un error al leer cae aqui
catch(Exception e)
{
System.out.println("Error al leer");
}
}
}
Espero les sea de utilidad la información anterior, Saludos :)

    Choose :
  • OR
  • To comment
76 comentarios:
Write comentarios
  1. Muchas gracias!! :D este ejemplo esta excelente >< super sencillo y muy eficiente :D gracias por compartirlo :D

    ResponderEliminar
    Respuestas
    1. Me da gusto que te funcionará :) Saludos.

      Eliminar
  2. Muy bien amigo me fue de mucha utilidad, gracias

    ResponderEliminar
  3. hola y si yo deseo no escribir caracteres, en lugar de un número int que debo hacer? basandome en el primer ejemplo

    escribir.write(saludo);


    ResponderEliminar
    Respuestas
    1. Disculpa si entendí tu pregunta: ¿Si deseas escribir números?
      La solución podría ser un:
      escribir.write(String.valueOf(new Integer(9));
      Espero te sea de ayuda, gracias.

      Eliminar
  4. hola cuchox excelente!!!.. Me funciono ala perfección pero quisiera saber basándome en el primer código como hago que siga guardando en el archivo txt pero en otra línea?

    ResponderEliminar
    Respuestas
    1. Hola, hace unos días me encontraba programando en Visual Basic .NET, Existe una clase llamada StreamWriter que permite realizar una edición de los archivos, desconozco si en Java se puede hacer esto con el primer ejemplo que te doy. Una idea podría ser primero, extraer el contenido que tiene el archivo [Como en el segundo ejemplo, guardarlo en un StringBuilder [Con el método append] y después con el mismo contenido volver a llamar al append [append es para ir agregando "trozos" de texto] al final tendras el texto antiguo y el nuevo.
      Posteriormente puedes usar directamente el ejemplo 1.
      Supongo puedes usar un escribir.write(stringBuilder.toString());
      Espero te sea de ayuda :D Saludos y suerte

      Eliminar
  5. Excelente aporte, no entendía como hacer estas operaciones con archivos, ahora me queda claro, ¡Gracias!

    ResponderEliminar
    Respuestas
    1. Excelente, me da gusto :D hay formas más complejas pero quiero pensar que ésta es una de las más fáciles, Saludos.

      Eliminar
  6. gracias si me ayudo exitos

    ResponderEliminar
  7. Hola muchas gracias por poner el codigo este sera mi base para futuros programas mil gracias

    ResponderEliminar
    Respuestas
    1. Gracias amigo :D Espero te sirvan, cualquier duda no dudes en consultarnos.

      Eliminar
  8. Muy util, disculpa como puedo introducir un salto de linea para guardar en el archivo por varias lineas,

    Saludos y muy buen blog

    ResponderEliminar
    Respuestas
    1. Hola amigo, en la línea del: escribir.write(saludo);
      saludo juega el papel de una cadena... puedes hacer esto:
      escribir.write(saludo+"\n");
      El \n funciona como un salto de línea, espero te funcione, gracias por visitarnos :D

      Eliminar
    2. puedes utilizar este metodo:
      void escribirtxt() throws IOException{

      BufferedWriter out = null;
      try {
      out = new BufferedWriter(new FileWriter("C:/log.txt", true));
      out.write(datos);
      out.newLine();
      } catch (IOException e) {
      // error processing code
      } finally {
      if (out != null) {
      out.close();
      }
      }
      }

      el método debe ir en un try y un catch
      y lo puedes usar en un botón o donde quieras...

      Eliminar
    3. olvide mencionarte si declaras como una variable String global puedes utilizarla en donde quieras y con esto asignarle texto igual en el método puedes poner después de declararlo algo así como:
      datos="tu texto";
      datos= unavariablestring+unjtextarea.gettext+"un texto";
      datos= unavariabletiponumerica+"";
      así como incluir un filechooser para indicar la ruta donde lo vas a guardar...

      Eliminar
  9. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  10. Hola!! de que manera lo implemento en una interfaz gráfica.

    ResponderEliminar
    Respuestas
    1. pamela es fácil solo crea un método y le introduces el siguiente código:
      try
      {
      //Crear un objeto File se encarga de crear o abrir acceso a un archivo que se especifica en su constructor
      File archivo=new File("texto.txt");

      //Crear objeto FileWriter que sera el que nos ayude a escribir sobre archivo
      FileWriter escribir=new FileWriter(archivo,true);

      //Escribimos en el archivo con el metodo write
      escribir.write(saludo);

      //Cerramos la conexion
      escribir.close();
      }

      //Si existe un problema al escribir cae aqui
      catch(Exception e)
      {
      System.out.println("Error al escribir");
      }

      puedes declarar la variable 'saludos' como global para poder modificarla desde cualquier botón o método
      y en un botón solo mandas llamar el método y listo

      Eliminar
  11. Amigo como escribo una matriz en un archivo y como la puedo leer de un archivo?

    ResponderEliminar
    Respuestas
    1. Si pudieras ser más especifico con tu pregunta te podría ayudar, ¿qué tipo de matriz?

      Eliminar
  12. Hola Pamela, Puedes crear un una JFrame con 3 botones: Leer, guardar, nuevo.
    También puedes ocupar un jTextArea
    Cada botón realiza las siguientes funciones.
    Leer -> Leer.java -> Obtiene el contenido de un x archivo y lo muestra en el TextArea.
    Guardar -> Escribir.java -> Crear un archivo con el contenido del jTextArea.
    Nuevo -> Limpiar jTextArea

    ResponderEliminar
  13. Bueno Una Pregunta, en el codigo esta establecido un Nombre de Archvio Por Defecto, Como Puedo Grabar El Archivo Pero Con Un Nombre Asignado Por el Usuario. Saludos @MastecSyT

    ResponderEliminar
    Respuestas
    1. Hola amigo, lo más fácil sería en lugar de hacer esto:
      File archivo=new File("texto.txt");

      Hacer esto:
      Scanner t=new Scanner(System.in);
      System.out.println("Nombre para archivo:");
      String nombreArchivo=t.next();
      File archivo=new File(nombreArchivo);

      Esto si es desde consola, puedes hacerlo con JFileChooser pero se verá raro, puesto que es mezclar una aplicación de consola con una de interfaz gráfica.

      Eliminar
  14. hola, fijate que no me funciona si pongo "\n", las lineas simpre me siguen saliendo en una sola fila. de antemano...Gracias

    ResponderEliminar
    Respuestas
    1. Hola, puedes utilizar el mètodo newLine(); en el objeto out, ese genera un salto de linea, saludos.

      Eliminar
  15. Hola, disculpa estoy tratando de hacer un archivo de registros en txt, pero quiero leer cada registro y como podría limitarlos.

    ResponderEliminar
    Respuestas
    1. Hola amigo, yo te podrìa recomendar utilizar algun simbolo para dividir los registros, por ejemplo: Jesus Alberto?19?Huatusco|Juan ramirez?24?Cordoba.
      Si utilizas un split y usas el simbolo de | obtendras una fila de registros, y cada una de esas filas les hace otro split usando el ? obtendras cada campo.
      Espero te sea de ayuda mi idea, saludos.

      Eliminar
  16. Necesito crear un archivo .txt a partir del contenido de los archivos .txt que haya en una carpeta, es decir, que sólo extraiga el texto de los archivos *.txt, mas no de los *.doc

    Será que alguien puede darme una mano con esto?

    ResponderEliminar
  17. Leería cualquier tipo de archivo? específicamente tiene que set un .txt?

    ResponderEliminar
    Respuestas
    1. Hola amigo, si puedes leer cualquier archivo siempre y cuando su contenido sea texto, saludos.

      Eliminar
  18. muy bueno el programa!!

    ResponderEliminar
  19. Muy buen aporte, pero tengo una duda, como hago para que me escriba en el archivo txt el resultado de un analizador lexico (ya tengo el analizador, solo quiero saber como imprimir o escribir los resultados en el achivo de texto)

    ResponderEliminar
    Respuestas
    1. Una forma sencilla, basándose en los ejemplos anteriores, tienes que modificar la línea que tiene el siguiente contenido:
      String saludo="Hola";
      El contenido que deseas guardar debe ser el que se le está asignando al objeto "saludo". El código que continua no necesitas realizarle modificaciones.

      Eliminar
  20. Me ha servido muchisimo! Eternamente gracias, ya que casi todos los scripts que hay en la web cuando los copias siempre hay algun error. En este nada! Sos un groso!

    ResponderEliminar
  21. Gracias :D me alegra que te haya podido ayudar, saludos.

    ResponderEliminar
  22. Hola , oye , no se donde se guarda mi archivo

    ResponderEliminar
    Respuestas
    1. Hola, ¿Qué tal?, respondiendo tu pregunta, el archivo se debe guardar exactamente donde tu compilaste y ejecutaste tu clase. Si necesitas especificar un lugar te recomiendo utilices lo siguiente:

      File archivo=new File("c:/Carpeta/texto.txt");

      Declara el objeto archivo indicando una ruta.

      Saludos.

      Eliminar
  23. Hola, felicidades por tu aporte!. Tengo una pregunta, cómo puedo hacer para que en mi archivo de texto pueda escribir en formato de columnas, por ejemplo, lanzar datos diferentes en el txt y que escriba de esta forma:

    Ana Sandy Ricardo David Nicolas
    Diana Fernando Irma Karla Carlos

    Espero haberme dado a entender, gracias.
    Saludos :)

    ResponderEliminar
    Respuestas
    1. ¿Qué tal? Creo que por el formato de respuesta no logré ver lo que me querías mostrar pero supongo que quieres que se vea como si fuera una tabla no? Para eso lo que yo uso sería un /t para colocar tabulaciones, el problema es cuando algunas palabras son mas grandes que otras pasaría que no quedarían los textos en las mismas "columnas". Espero eso te ayude, saludos.

      Eliminar
  24. hola como le puedo hacer para q yo escriba algo y se guarde en el bloc saludos

    ResponderEliminar
    Respuestas
    1. Perdón, no entendí muy bien tu pregunta, ¿podrías ser más específico?

      Eliminar
    2. Como puedo crear dos archivos txt y ordenar los datos ingresados en los dos archivos... siendo los datos int?????

      Eliminar
  25. Hola, saludos, yo tengo muchas dudas debido a que no se manejar bien los archivos, pero mi profesor nos dejo guardar dos arreglos de tipo reales en un archivo cada arreglo, la verdad no tengo idea de como hacer eso, también nos dejo crear un tercer archivo intercalar el contenido de los dos archivos quedando ordenados, espero y puedan ayudarme, es un proyecto de mi semestre, de antemano muchas gracias.

    ResponderEliminar
  26. quisiera saber como puedo respetar la primera y ultima letra que esta dentro de lo que escribí en el archivo ojala y me puedan ayudar

    ResponderEliminar
  27. hay gueeeeeeeeeeeeeee

    que buen codigo!
    muchas gracias x3

    ResponderEliminar
  28. buenas una pregunta teng un programa en java eclipse y lo hice ejecutable y quiero q la informacion q grabe en el doc de texto me lo presente automaticamente cuando se tenga qpresentarse me pueden ayudar!! gracias de ante mano!!!

    ResponderEliminar
    Respuestas
    1. Que tal, con gusto te ayudo, solo que no entendí bien lo que necesitas hacer y bueno... te respondo esto varios días después, si gustas contáctame a mi correo jast1000@gmail.com saludos.

      Eliminar
  29. Hola buenas tardes, te acabo de mandar un correo a jast1000@gmail.com comentandote mi codigo para ver si me puedes orientar... que necesitaría hacer?? Lo que intento hacer es cargar un archivo XML desde cualquier ruta y sin un nombre definido para luego sacar de ese archivo XML un dato de un nodo en particular... :( Ojala que si me puedas orientar... =O

    ResponderEliminar
  30. hola, mi duda es: en la linea
    File archivo=new File("c:/Carpeta/texto.txt"); como especifico la ruta de almacenamiento pero con un nombre dinamico al archivo (jalado de una base de datos)????
    ejemplo nombre dinamico jalado de la base de datos: nombre dinamico=juan..nombre dinamico=pedro... nombre dinamico=jose

    resultado:
    C:/Carpeta/juan.txt
    C:/Carpeta/pedro.txt
    C:/Carpeta/jose.txt

    ResponderEliminar
    Respuestas
    1. ¿Qué tal? El tema aquí es que por tu parte debes obtener los datos de una tabla en base de datos y un campo por Ej. NOMBRE guardar su valor en una variable. Después en el constructor de File agregar un path + la variable donde guardaste el valor obtenido de la tabla. Saludos.

      Eliminar
  31. NECESITO UN PRORAMA QUE IMPRIMA LA TABLA DE VALORES ASCII COMPLETA, ADEMAS LA MANDE A UN ARCHIVO DE TEXTO.

    ResponderEliminar
  32. Buenas tardes cochux esta muy bueno el código pero tengo una pregunta sabes como abrir y guardar los datos que estén en un archivo txt. En un programa de java. Pero quiero que los datos los muestre en forma de tabla e implementar una foto y si es posible una huella... Ya que tengo un proyecto de grado que es sobre votación... O guardar el archivo txt en sql server.. Espero que me puedas ayudar

    ResponderEliminar
  33. Muy buen aprote, solo que tengo un pregunta......como hago crarme dos archivos .txt y luego usar sus direcciones para almacenar datos....
    tengo esto:
    File archivo = new File("C:\\carpeta\\texto.txt");
    archivo.mkdir();
    esto lo que hace es crarme dos carpeta..el archivo .txt no lo crea

    ResponderEliminar
  34. Lo maximo, me has salvado de una. Muchas gracias

    ResponderEliminar
  35. Me ha sido muy útil! Sencillo, bien explicado. Gracias por tu aporte!

    Un saludo

    ResponderEliminar
  36. disculpa hice una agenda la cual crea un txt con la información pero quiero que me haga otro txt con otra nueva informacion

    ResponderEliminar
  37. Hola amigo quiera saber si ese archivo de guarda en algún lado y donde esta

    ResponderEliminar
  38. oye sabes como puedo hacer para que ese archivo de texto pueda ser evaluado por un patron de analizador lexico

    ResponderEliminar
  39. hola, amigos.. alguien me puede ayudar. como puedo hacer que en una app el enter no me lo cuente como un caracter??

    ResponderEliminar

  40. Hola tengo en la GUI un Label que se llama Nombre y a su costado un jTextField
    como haria para que al pulsar el boton aceptar
    se guarde el nombre ingresado en el JTextField en un archivo de texto

    ResponderEliminar
  41. ¿Como guardo la información de un registro en un archivo?

    ResponderEliminar
  42. hola amigo me encanto tu publicación de mucha ayuda pero tengo una duda

    como puedo hacer el método de modificar el texto antes guardado y el método de borra el archivo guardado

    ResponderEliminar
  43. Hola , mi pregunta es se como se podría guardar una clase en un archivo , es decir guardar toda la información que tiene una clase concreta . Gracias

    ResponderEliminar
  44. Hol me am pedido que aga esto
    al abrir archivo "empleado.ser" si no existe lo crea y te despliega el menu
    si existe que muestre los datos y muestre menu
    al salir (4) que guarde los datos en el texto
    ESTE ES EL CODIGO:
    import java.io.*;
    import java.util.Scanner;
    import java.io.IOException;
    public class Archivo{
    private static Departamento departamento;
    private static Scanner teclado = new Scanner(System.in);
    BufferedWriter bw;
    public static void main(String [] args) throws ClassNotFoundException,IOException{
    File archivoEntrada=new File("C:\\Users\\Eyva\\Desktop\\empleado.txt");
    BufferedWriter bw;
    if(archivoEntrada.exists()){
    System.out.println("el archivo si existe");
    System.out.println("Nombre del archivo "+archivoEntrada.getName());
    System.out.println("Camino "+archivoEntrada.getPath());
    System.out.println("Camino absoluto "+archivoEntrada.getAbsolutePath());
    System.out.println("Se puede escribir "+archivoEntrada.canRead());
    System.out.println("Se puede leer "+archivoEntrada.canWrite());
    System.out.println("Tamaño "+archivoEntrada.length());
    }
    else{
    System.out.println("el archivo no existe");
    archivoEntrada.createNewFile();
    System.out.println(archivoEntrada.getName()+" Ha sido creado");

    }
    int opcion=0;
    departamento = pedirDepartamento();
    int opc = 0;
    while(opc != 4){
    opc = menu();
    switch (opc) {
    case 1:
    departamento.setEmpleado(pedirEmpleado());
    break;
    case 2:
    departamento.eliminarEmpleado(departamento.buscaEmpleado(pedirClaveEmpleado()));
    break;
    case 3:
    listarEmpleados();
    break;
    case 4:
    System.out.println("Cerrando...");
    break;
    default:
    System.out.println("Opción inválida");
    }
    }
    }
    public static int menu(){
    System.out.println("1. Contratar empleado");
    System.out.println("2. Liquidar empleado");
    System.out.println("3. Listar empleados del departamento");
    System.out.println("4. Salir");
    return teclado.nextInt();
    }
    public static Empleado pedirEmpleado(){
    System.out.printf("%s%n%s%n%s%n%s%n","Escribe la clave del empleado ", "curp","nombre y " ,"antigüedad del empleado ");
    Empleado e = new Empleado(teclado.nextInt(),teclado.next(), teclado.next());
    e.setAntiguedad(teclado.nextInt());

    e.setPuesto(pedirPuesto());
    return e;
    }

    public static Puesto pedirPuesto(){
    System.out.printf("%s%n%s%n","Escribe los datos del puesto: ", "clave, nombre, clave presupuestal y sueldo base");
    Puesto p = new Puesto(teclado.nextInt(), teclado.next(), teclado.next());

    return p;
    }

    public static Departamento pedirDepartamento(){
    System.out.printf("%s%n%s%n","Escribe el nombre del departamento y", " cantidad de empleados");
    Departamento d = new Departamento(teclado.next(), teclado.nextInt());
    return d;
    }

    public static int pedirClaveEmpleado(){
    System.out.printf("%s%n","Escribe la clave del empleado a buscar: ");
    return teclado.nextInt();
    }

    public static void listarEmpleados(){
    try{
    for(Empleado e: departamento.getEmpleados())
    System.out.printf("%s%n", e.toString());

    }
    catch(Exception e){
    System.err.println("Error"+ e);
    }
    }
    }

    ResponderEliminar
  45. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  46. Cómo puedo guardar el contenido del archivo del texto de manera vertical?

    ResponderEliminar