JAVA

MANEJO DE ARCHIVOS

Manejo de Archivos en Java Índice
1. Introducción 2. Ficheros  Creación de un objeto File  Comprobaciones y Utilidades 3. Streams de Entrada  Objetos FileInputStream  Apertura de un FileInputStream  Lectura de un FileInputStream  Cierre de FileInputStream  Ejemplo: Visualización de un fichero  Objetos ObjectInputStream  Objetos DataInputStream  Apertura y cierre de DataInputStream  Lectura de un DataInputStream  Streams de entrada de URLs  Apertura de un Stream de entrada 4. Streams de Salida  Objetos FileOutputStream  Apertura de un FileOutputStream  Escritura en un FileOutputStream  Cierre de FileOutputStream  Ejemplo: Almacenamiento de Información  ObjectOutputStream  Streams de salida con buffer  Creación de Streams de salida con buffer  Volcado y Cierre de Streams de salida con buffer  Streams DataOutput  Apertura y cierre de objetos DataOutputStream  Escritura en un objeto DataOutputStream  Contabilidad de la salida 5. Ficheros de Acceso Aleatorio  Creación de un Fichero de Acceso Aleatorio  Acceso a la Información  Actualización de Información

1. Introducción
Alejandro Reyes Marzano Pág 1

JAVA

MANEJO DE ARCHIVOS

El manejo de archivos (persistencia), es un tema fundamental en cualquier lenguaje de programación. Pues nos permite interactuar con los dispositivos de almacenamiento externo para poder mantener la información en el tiempo. Java no es una excepción. Cuando se desarrollan applets para utilizar en red, hay que tener en cuenta que la entrada/salida directa a fichero es una violación de seguridad de acceso. Muchos usuarios configurarán sus navegadores para permitir el acceso al sistema de ficheros, pero otros no. Por otro lado, si se está desarrollando una aplicación Java para uso interno, probablemente será necesario el acceso directo a ficheros. 2. Ficheros Para realizar operaciones sobre los ficheros, necesitamos contar con la información referente sobre un fichero (archivo). La clase File proporciona muchas utilidades relacionadas con ficheros y con la obtención de información básica sobre esos ficheros.

Creación de un objeto File

Para crear un objeto File nuevo, se puede utilizar cualquiera de los tres constructores siguientes: Constructores de la clase File
child) ; public File(File parent, child) ; public File(URI uri) ;

ejemplo public File(String pathname) ; new File(“/carpeta/archivo”); public File(String parent, String new File(“carpeta”, “archivo”);
String new File(new File(“/carpeta”), “archive”)

new File(new URI(str);

El constructor utilizado depende a menudo de otros objetos File necesarios para el acceso. Por ejemplo, si sólo se utiliza un fichero en la aplicación, el primer constructor es el mejor. Si en cambio, se utilizan muchos ficheros desde un mismo directorio, el segundo o tercer constructor serán más cómodos. Y si el directorio o el fichero es una variable, el segundo constructor será el más útil.

Comprobaciones y Utilidades

Una vez que se haya creado un objeto de la clase File, se puede utilizar uno de los siguientes métodos para obtener información sobre el fichero:

Utilidad Nombres del fichero
Alejandro Reyes Marzano

Métodos (tipo y método)
String getName()

Pág 2

JAVA

MANEJO DE ARCHIVOS
String getPath() String getAbsolutePath() String getParent() boolean renameTo( File nuevoNombre ) boolean exists() boolean canWrite() boolean canRead() boolean isFile() boolean isDirectory() boolean isAbsolute() long lastModified() long length() boolean mkdir() String[] list()

Comprobaciones

Información general del fichero Utilidades de directorio

Vamos a desarrollar una pequeña aplicación que muestra información sobre los ficheros pasados como argumentos en la línea de comandos:
import java.io.*; class InformacionFichero { public static void main( String args[] ) throws IOException { if( args.length > 0 ){ for( int i=0; i < args.length; i++ ){ File f = new File( args[i] ); System.out.println( "Nombre: "+f.getName() ); System.out.println( "Camino: "+f.getPath() ); if( f.exists() ){ System.out.print( "Fichero existente " ); System.out.print( (f.canRead() ? "y se puede Leer":"")); System.out.print( (f.canWrite()?"se puese Escribir":"")); System.out.println( "." ); System.out.println( "La longitud del fichero son " +f.length()+" bytes" ); } else{ System.out.println( "El fichero no existe." ); } } } else System.out.println( "Debe indicar un fichero." ); } }

3. Streams de Entrada Hay muchas clases dedicadas a la obtención de entrada desde un fichero. Este es el esquema de la jerarquía de clases de entrada por fichero:

Alejandro Reyes Marzano

Pág 3

File fichero = new File( "/carpeta/archive. Cuando se crea un FileInputStream.txt"). FileInputStream sobrescribe seis de los métodos de la clase abstracta InputStream.JAVA MANEJO DE ARCHIVOS InputStream FilterInputStream ByteArrayInputStream PipedInputStream SequenceInputStream BufferedInputStream PushbackInputStream ObjectInputStream StringBufferInputStream LineNumberInputStream DataInputStream FileInputStream DataInput ObjectInput  Objetos FileInputStream La clase FileInputStream típicamente representan ficheros de texto accedidos en orden secuencial. Con FileInputStream.txt").txt"). InputStream f2 = new FileInputStream(f).  Apertura de un FileInputStream Para abrir un FileInputStream sobre un fichero. Si se intentan utilizar los métodos mark o reset en un FileInputStream se generará una IOException. Aunque probablemente el primer constructor es el que más se utiliza habitualmente. FileInputStream fichero=new FileInputStream("/carpeta/archive. File f = new file("/archive. byte a byte. Alejandro Reyes Marzano Pág 4 . Cualquiera de los dos constructores disponibles en esta clase puede lanzar una FileNotFoundException.txt" ). varios bytes o al fichero completo. también se abre para lectura. se puede elegir acceder a un byte. InputStream f1 = new FileInputStream("/archivo. FileInputStream ficheroSt= new FileInputStream( fichero ). el segundo permite examinar el archivo más de cerca utilizando sus métodos antes de asignarlo a un flujo de entrada. se le da al constructor un String o un objeto File: El ejemplo siguiente crea dos FileInputStreams que están utilizando el mismo archivo de disco real.

JTextArea ta. int i. El método read() tiene muchas opciones: int read(). Lee longitud bytes en b comenzando por b[offset].  Cierre de FileInputStream Cuando se termina con un fichero. o implícitamente cuando se recicla el objeto (el garbage collector se encarga de ello). public void init() { byte b[] = new byte[1024].int offset. Llena todo el array. int read( byte b[]. Devuelve el número de bytes leídos o -1 si se alcanzó el final del stream.close(). int read( byte b[] ). si es posible.  Ejemplo: Visualización de un fichero Si la configuración de la seguridad de Java permite el acceso a ficheros. existen dos opciones para cerrarlo: explícitamente. try { fis = new FileInputStream( "/carpeta/archivo. se puede leer de él. El código siguiente contiene los elementos necesarios para mostrar un fichero: FileInputStream fis. Devuelve el número de bytes leídos o -1 si se alcanzó el final del stream. se puede ver el contenido de un fichero en un objeto JTextArea.txt"). } catch( FileNotFoundException e ) { } try { i = fis.JAVA MANEJO DE ARCHIVOS  Lectura de un FileInputStream Una vez abierto el FileInputStream. // El buffer de lectura se debe hacer lo suficientemente grande // o esperar a saber el tamaño del fichero String s. Para cerrarlo explícitamente.int longitud ). Lee un byte y devuelve -1 al final del stream.read( b ). } catch( IOException e ) { } Alejandro Reyes Marzano Pág 5 . se utiliza el método close(): miFicheroSt.

String t. } public String getTelefono() { return( telefono ).String d ) { nombre = n. protected String direccion.out.JAVA s = new String( b. protected String telefono. } void printDireccion( String nombre ) { Alejandro Reyes Marzano Pág 6 .0 ).io. Para probar. } public String getDireccion() { return( direccion ). } public String getNombre() { return( nombre ).println( nombre+"\n direccion ). class Direccion { protected String nombre.java en el que partimos de un fichero agenda que dispone de los datos que nosotros deseamos de nuestros amigos. Agenda. int tamano = 0. } "+telefono+"\n "+ } class DireccionArray { protected Direccion lista[].*. Direccion( String n. } public void print() { System. ta = new TextArea( s. DireccionArray() { lista = new Direccion[max]. add( ta ).5.40 ). buscará en el fichero de datos si existe ese nombre y presentará la información que se haya introducido. import java. intentar que aparezca la información de Pepe. teléfono y dirección. final int max = 128. } MANEJO DE ARCHIVOS Hemos desarrollado un ejemplo. telefono = t. direccion = d. Si tecleamos un nombre. como son: nombre.

print(). try { while( !"".in ) ) ) { lista.bucle(). int contador = 0.println( "Introduzca un nombre o <Enter>" ). } Direccion cargaDireccion() throws IOException { = Alejandro Reyes Marzano Pág 7 .printDireccion( nombre ). lista[tamano++] = direccion.println( "Introduzca un nombre o <Enter>" ). System.JAVA MANEJO DE ARCHIVOS for(int i=0.exit( 1 ). } } void addDireccion( Direccion direccion ) { if( tamano == max ) System.contador-1 ) ). } Agenda() { lista = cargaDirecciones().0. i < tamano. while( contador < longLinea &&( chars[contador++] (byte)entrada.read() ) != '\n' ) if( chars[contador-1] == -1 ) return( null ). } } catch( Exception e ) { } } String leeEntrada( InputStream entrada ) throws IOException { byte chars[] = new byte[longLinea].out.equals( nombre = leeEntrada( System.getNombre(). final int longLinea = 32. } void bucle() { String nombre.0. return( new String( chars. FileInputStream agFichero. i++ ) { if( lista[i].out. agenda. } } public class Agenda { DireccionArray lista. System.indexOf( nombre ) != -1 ) lista[i]. public static void main( String argv[] ) { Agenda agenda = new Agenda().

if( nombre == null ) return( null ). lista.exit( 1 ).println( "Error cargando Agenda " ).direccion ) ).addDireccion( nuevaDireccion ). if( input != null){ obj = (A) input. Ejemplo: private A leer() throws IOException. } catch( FileNotFoundException e ) { System. return obj. Direccion nuevaDireccion. } while( true ) { try { nuevaDireccion = cargaDireccion(). } if ( input != null) input. A obj = null. } catch( Exception e ) { System.telefono. String telefono = leeEntrada( agFichero ). en este caso se usa para leer archivo y se usa el método readObject. } } } }  + "\n " Objetos ObjectInputStream Para hacer operaciones con el archivo binario serializado abierto se usa objetos de la clase ObjectInputStream.out. System.out.println( "No hay fichero de Agenda" ). }  Objetos DataInputStream Alejandro Reyes Marzano Pág 8 . return( new Direccion( nombre.close(). ClassNotFoundException{ input = new ObjectInputStream(new FileInputStream(fila)).readObject(). String direccion = leeEntrada( agFichero ) +leeEntrada( agFichero ) + "\n " +leeEntrada( agFichero ). return( lista ). try { agFichero = new FileInputStream( "agenda" ). } DireccionArray cargaDirecciones() { DireccionArray lista = new DireccionArray().JAVA MANEJO DE ARCHIVOS String nombre = leeEntrada( agFichero ). if( nuevaDireccion == null ) return( lista ).

Para el método String readLine(). miFStream.close().read( b ). FileInputStream miFStream. Para leer un long.  Lectura de un DataInputStream Al acceder a un fichero como DataInputStream. i = miDStream.) miFStream. // Cierra el fichero de datos explícitamente //Siempre se cierra primero el fichero stream de mayor nivel miDStream. se utilizan los mismos métodos que para FileInputStream: DataInputStream miDStream. Generalmente se utilizan DataInputStream con ficheros binarios. ints o chars.readInt(). Los streams de datos pueden leer cualquiera de las variables de tipo nativo. por ejemplo: long numeroSerie. también se tiene acceso a otros métodos diseñados para leer cada uno de los tipos de datos: byte readByte() int readUnsignedByte() short readShort() int readUnsignedShort() char readChar() int readInt() long readLong() float readFloat() double readDouble() String readLine() Cada método leerá un objeto del tipo pedido. se pueden utilizar los mismos métodos read() de los objetos FileInputStream. No obstante. // Obtiene un controlador de fichero miFStream = new FileInputStream "/etc/ejemplo. //Encadena un fichero de entrada de datos miDStream = new DataInputStream( miFStream ).readLong().  Apertura y cierre de DataInputStream Para abrir y cerrar un objeto DataInputStream. // Ahora se pueden utilizar los dos streams de entrada para // acceder al fichero (si se quiere. Alejandro Reyes Marzano Pág 9 .JAVA MANEJO DE ARCHIVOS Los objetos DataInputStream se comportan como los FileInputStream.. numeroSerie = miDStream.dbf" ). como floats. \r\n o con EOF. se marca el final de la cadena con \n.close().. \r.

si se quiere: URL imagenSrc. 4.JAVA  MANEJO DE ARCHIVOS Streams de entrada de URLs Además del acceso a ficheros. se puede proporcionar directamente un URL.datos). Java proporciona la posibilidad de acceder a URLs como una forma de acceder a objetos a través de la red. imagenes[0] = getImage( getDocumentBase(). Como con los Streams de entrada. Se utiliza implícitamente un objeto URL al acceder a sonidos e imágenes.read( buffer. las clases de salida están ordenadas jerárquicamente: Alejandro Reyes Marzano Pág 10 . con el método getDocumentBase() en los applets: String imagenFich = new String( "imagenes/pepe. Por ejemplo.imagenFich ).length )."imagenes/pepe. byte buffer[] = new byte[24]. se puede utilizar un fichero de datos para un applet: ImputStream is.gif" ).openStream().gif" ). imagenSrc = new URL( "http://enterprise.buffer. Ahora se puede utilizar is para leer información de la misma forma que se hace con un objeto FileInputStream: is.  Apertura de un Stream de entrada También se puede abrir un stream de entrada a partir de un URL. Streams de Salida La contrapartida necesaria de la lectura de datos es la escritura de datos. is = new URL( getDocumentBase().com/~info" ).0. No obstante. imagenes[0] = getImage( imagenSrc.

FileOutputStream miFicheroSt. primero se necesita abrir el fichero para luego escribir en él.  Apertura de un FileOutputStream Para abrir un objeto FileOutputStream. Alejandro Reyes Marzano Pág 11 . miFicheroSt = new FileOutputStream( miFichero ).JAVA MANEJO DE ARCHIVOS OutputStream ByteArrayOutputStream FileOutputStream FilterOutputStream PipedOutputStream ObjectOutputStream BufferedOutputStream PrintStream DataOutputStream ObjectOutput DataOutput RandomAccessFile Examinaremos las clases FileOutputStream y DataOutputStream para complementar los streams de entrada que se han visto. Se le da al constructor un String o un objeto File. Como con los ficheros de entrada. se tienen las mismas posibilidades que para abrir un fichero stream de entrada. miFichero = new File( "/etc/kk" ). Como con los streams de entrada. también se puede utilizar: File miFichero FileOutputStream miFicheroSt. miFicheroSt = new FileOutputStream( "/etc/kk" ).  Objetos FileOutputStream Los objetos FileOutputStream son útiles para la escritura de ficheros de texto.

*. public static final int longLinea = 81.int offset.err.0.equalsIgnoreCase( new String( nombre. Por ejemplo: 475123. se puede dejar que el sistema cierre el fichero cuando se recicle miFicheroSt.JAVA MANEJO DE ARCHIVOS  Escritura en un FileOutputStream Una vez abierto el fichero. void write( byte b[] ). pregunta al usuario una lista de nombres y números de teléfono. Cada nombre y número se añade a un fichero situado en una localización fija.io. Se puede utilizar el método explícito: miFicheroSt. Como con el método read() de los streams de entrada.Antonio 354762.Pepe 347698.3 ) ) ) Alejandro Reyes Marzano Pág 12 . fos = new FileOutputStream( "telefono. O. public static void main( String args[] ) throws IOException { byte tfno[] = new byte[longLinea]. el usuario especifica "Fin" ante la solicitud de entrada del nombre. Para indicar que se ha introducido toda la lista. if( "fin".Luisa 123456. void write( byte b[]. byte nombre[] = new byte[longLinea].Maria El código fuente del programa es el siguiente: import java. Escribe todo el array.int longitud ). Escribe un byte. tenemos tres posibilidades: void write( int b ). Una vez que el usuario ha terminado de teclear la lista.0.  Ejemplo: Almacenamiento de Información Este programa. Escribe longitud bytes en b comenzando por b[offset].  Cierre de FileOutputStream Cerrar un stream de salida es similar a cerrar streams de entrada. leeLinea( nombre ).Juanito 564878.close(). el programa creará un fichero de salida que se mostrará en pantalla o se imprimirá. while( true ) { System.dat" ).println( "Teclee un nombre ('Fin' termina)" ). class Telefonos { static FileOutputStream fos. se pueden escribir bytes de datos utilizando el método write(). si es posible.

fos. en caso necesario.JAVA MANEJO DE ARCHIVOS break. linea[i] = (byte)0. entonces se le añade un buffer al stream: Alejandro Reyes Marzano Pág 13 . leeLinea( tfno ). i++ ) fos. Luego se escribe con el metodo writeObject(objeto).writeObject(obj). while( (i < ( longLinea-1) ) && ( ( b = System. if ( out != null) out. Cuando se llena el buffer.close(). fos. for( int i=0. o. FileOutputStream fos=new FileOutputStream(fila).in. int i = 0. o se escriben muchos elementos pequeños. i++ ) fos.' ).close(). se envía a disco con una única operación de escritura. } }  Objetos ObjectOutputStream Los objetos de la clase ObjectOutputStream nos permite escribir en el archivo.write( '\n' ). if (out != null) out. System.println( "Teclee el numero de telefono" ). Ejemplo: File fila=new File(“miArchivo. ose proporciona un flujo de comunicación con los dispositivos de almacenamiento. será una buena idea utilizar un stream de salida con buffer. } fos. tfno[i] != 0.err. for( int i=0. } private static void leeLinea( byte linea[] ) throws IOException { int b = 0.bin”).write( '. de la clase ObjectOutputStream.write( tfno[i] ). pero toda salida se almacena en un buffer. Los streams con buffer ofrecen los mismos métodos de la clase FileOutputStream. primero se necesita un stream FileOutput normal.  Creación de Streams de salida con buffer Para crear un stream BufferedOutput. se puede enviar el buffer a disco en cualquier momento. ObjectOutputStream out=new ObjectOutputStream(fos).  Streams de salida con buffer Si se trabaja con gran cantidad de datos. nombre[i] != 0.read() ) != '\n' ) ) linea[i++] = (byte)b.write( nombre[i] ).

write( b ). // Encadena un stream de salida con buffer (por eficiencia) miBufferStream = new BufferedOutputStream( miFileStream ). // Cerramos el fichero de datos. // Ahora se pueden utilizar los dos streams de entrada para // acceder al fichero (si se quiere) miBufferStream. FileOutputStream miFileStream. BufferedOutputStream miBufferStream.close().close(). se pueden escribir datos binarios en un fichero.writeInt( i ). // Cierra el fichero de datos explícitamente. miFileStream. Siempre se cierra // primero el fichero stream de mayor nivel miDataStream. miBufferStream.JAVA MANEJO DE ARCHIVOS FileOutputStream miFileStream. Siempre se ha de cerrar primero el // fichero stream de mayor nivel miBufferStream. Con la clase DataOutputStream.  Apertura y cierre de objetos DataOutputStream Para abrir y cerrar objetos DataOutputStream.  Volcado y Cierre de Streams de salida con buffer Al contrario que los streams FileOutput. // Encadena un fichero de salida de datos miDataStream = new DataOutputStream( miBufferStream ).close().close().close(). miDataStream.flush(). cada escritura al buffer no se corresponde con una escritura en disco. // Encadena un stream de salida con buffer miBufferStream = new BufferedOutputStream( miFileStream ). // Obtiene un controlador de fichero miFileStream = new FileOutputStream( "/tmp/kk" ). cuando se quiera volcar el buffer explícitamente se debe hacer mediante una llamada a flush(): // Se fuerza el volcado del buffer a disco miBufferStream.  Streams DataOutput Java también implementa una clase de salida complementaria a la clase DataInputStream. miFileStream. A menos que se llene el buffer antes de que termine el programa. se utilizan los mismos métodos que para los objetos FileOutputStream: DataOutputStream miDataStream. Alejandro Reyes Marzano Pág 14 . // Obtiene un controlador de fichero miFileStream = new FileOutputStream( "/tmp/kk" ). BufferdOutpurStream miBufferStream.

Este método simplemente devuelve el número total de bytes escritos en el fichero. writeByte( int i ). Por ejemplo. 5.size() % 4. Si nuestras cadenas utilizan caracteres Unicode.JAVA MANEJO DE ARCHIVOS  Escritura en un objeto DataOutputStream Cada uno de los métodos write() accesibles por los FileOutputStream también lo son a través de los DataOutputStream.String modo ). writeShort( int i ). Java proporciona una clase RandomAccessFile para este tipo de entrada/salida. i < numBytes. se tienen dos posibilidades: bytes y caracteres.write( 0 ). Para las cadenas. debemos escribirlas con writeChars(). writeBytes( String s ).  Contabilidad de la salida Otra función necesaria durante la salida es el método size(). Con un objeto File: miRAFile = new RandomAccessFile( File fichero. Por ejemplo. writeDouble( double d ). String modo ). writeInt( int i ). sino acceder al fichero como una base de datos. cada uno en diferentes partes del fichero. for( int i=0.  Creación de un Fichero de Acceso Aleatorio Hay dos posibilidades para abrir un fichero de acceso aleatorio: Con el nombre del fichero: miRAFile = new RandomAccessFile( String nombre. Hay que recordar que los bytes son objetos de 8 bits y los caracteres lo son de 16 bits. de la forma siguiente: int numBytes = miDataStream. writeChars( string s ). writeChar( int i ). no se desea leer un fichero de principio a fin. Se puede utilizar size() para ajustar el tamaño de un fichero a múltiplo de cuatro. donde se salta de un registro a otro. se puede abrir un fichero de una base de datos para actualización: Alejandro Reyes Marzano Pág 15 . También encontrará métodos complementarios a los de DataInputStream: void void void void void void void void void writeBoolean( boolean b ). El argumento modo determina si se tiene acceso de sólo lectura (r) o de lectura/escritura (r/w). Ficheros de Acceso Aleatorio A menudo. writeFloat( float f ). i++ ) miDataStream.

log". // Abrimos el fichero de acceso aleatorio miRAFile = new RandomAccessFile( "/tmp/java."rw" ). Devuelve la posición actual del puntero del fichero void seek( long pos ).length() ).log". miRAFile = new RandomAccessFile( "/tmp/kk. } } Alejandro Reyes Marzano Pág 16 .writeBytes( s ). La posición se da como un desplazamiento en bytes desde el comienzo del fichero. // Incorporamos la cadena al fichero miRAFile. Coloca el puntero del fichero en una posición determinada.JAVA MANEJO DE ARCHIVOS RandomAccessFile miRAFile. // Cualquier write() que hagamos a partir de este punto del código // añadirá información al fichero Vamos a ver un pequeño ejemplo.  Actualización de Información Se pueden utilizar ficheros de acceso aleatorio para añadir información a ficheros existentes: miRAFile = new RandomAccessFile( "/tmp/kk. miRAFile."rw" ). La posición 0 marca el comienzo de ese fichero.java. long length().seek( miRAFile. // Nos vamos al final del fichero miRAFile. También se tienen muchos métodos para moverse dentro de un fichero: long getFilePointer().length() ). String s = "Informacion a incorporar\nTutorial de Java\n". Se tiene acceso a todas las operaciones read() y write() de las clases DataInputStream y DataOutputStream. La posición length() marca el final de ese fichero. Devuelve la longitud del fichero.dbf". que añade una cadena a un fichero existente: class Log { public static void main( String args[] ) throws IOException { RandomAccessFile miRAFile.seek( miRAFile.close(). Log.  Acceso a la Información Los objetos RandomAccessFile esperan información de lectura/escritura de la misma manera que los objetos DataInput/DataOutput."rw" ). // Cerramos el fichero miRAFile.

Crearemos una aplicación sencilla para poder entender mejor el uso de las clases que nos permite el manejo de archivos. guardar archivo. import java. /**construye un archivo con el objeto file en la que se encapsula el archivo con * todas las propiedades nombre. etc. if( input != null){ obj = (A) input.writeObject(obj). } private void escribir(A obj) throws IOException{ output = new ObjectOutputStream(new FileOutputStream(fila)).io. Esta clase es una plantilla que nos permite manejar cualquier tipo de objetos serializados /* Name: Author: Description: Date: Copyright: Archivo® ALEJANDRO REYES MARZANO es una clase que nos permite manejar archivos serializados de cualquier objeto.*. etc*/ public Archivo(File fila) { this.java que nos permite manipular los archivos. public class Archivo <A>{ /**file sirve para encapsular la interaccion de nuestros programas con el sistema * de archivos. A obj = null.JAVA MANEJO DE ARCHIVOS Ejemplo 01. if (output != null) output. if ( output != null) output. para ello definimos una clase llamado Archivo.fila=fila. Mediante la clase File no nos limitamos a leer el contenido de un * archivo. fecha. guardar como. ademas podemos obtener toda la informacion del archivo nombre. abrir. Crear una aplicación usando archivos serializados con las opciones de nuevo archivo.close().fecha etc **/ private File fila. } private A leer() throws IOException.readObject(). /**La clase InputStream nos sirve para leer datos del cliente*/ private ObjectInputStream input. salir. /**es un objeto que nos permite escribir en el archivo*/ private ObjectOutputStream output. ClassNotFoundException{ input = new ObjectInputStream(new FileInputStream(fila)). es una plantilla 20/06/09 15:17 ©2008-2009 alemsoft corp */ package datos. Alejandro Reyes Marzano Pág 17 .

return aux.getMessage()).io. } catch(java.java.JAVA } if ( input != null) input.io.swing.getMessage()).exists()) fila. ya el lector puede implementar clases mas sofisticadas de acuerdo a sus necesidades /* Name: Author: Description: Date: Persona® ALEJANDRO REYES MARZANO es una clase que usaremos para nuestra aplicacion 20/06/09 15:17 Alejandro Reyes Marzano Pág 18 . } } } Aquí crearemos la clase Persona. } catch(java.JOptionPane. } catch (ClassNotFoundException f) { javax.showMessageDialog(null. una clase serializado con sus respectivos atributos y métodos.showMessageDialog(null. return aux. Es una clase sencilla pues aquí se trata de explicar el uso de archivos. } } public A recuperar(){ A aux=null. "Error en la lectura de archivo\n"+ex. } catch(java. "Archivo inexistente" + f.swing.getMessage()).IOException excepcion){ javax.EOFException eof){ return aux. try{ aux=leer().IOException ex){ javax. escribir(objetos).swing.JOptionPane.io. "Error de archivo inexistente\n"+excepcion. return true.createNewFile(). return aux. return obj. return false.showMessageDialog(null.JOptionPane.close(). MANEJO DE ARCHIVOS } public boolean salvar(A objetos){ try{ if(!fila.

©2008-2009 alemsoft corp MANEJO DE ARCHIVOS /** *@construye un objeto persona y establece los valores nulos *a los parametros correspondientes*/ public Persona() { } /** *@construye un objeto persona y establece los atributos con los * datos pasados como parametro */ public Persona(String nombre.Serializable{ private String nombre.io.edad = edad. private String dni.dni = dni.nombre = nombre. int edad) { this. String apellidos.JAVA Copyright: */ package datos. private int edad.apellidos = apellidos.nombre = nombre.apellidos = apellidos. } /** Alejandro Reyes Marzano Pág 19 . this. public class Persona implements java. } /** * @returna el nombre */ public String getNombre() { return nombre. String dni. } /** * @asigna el nombre */ public void setNombre(String nombre) { this. this. } /** * @asigna los apellidos */ public void setApellidos(String apellidos) { this. private String apellidos. this. } /** * @returna las apellidos */ public String getApellidos() { return apellidos.

dni = dni.Persona> personas. es una clase que encapsula un objeto de la clase HashMap que nos permite manejar como una estructura donde se almacenaran las personas registradas.Persona>(). } /** * @returna la edad */ public int getEdad() { return edad.HashMap<String .Serializable{ private java.JAVA * @returna el dni */ public String getDni() { return dni. public Personas() { personas =new java.util. El lector puede implementar mas métodos como métodos de búsqueda y otros.util.io.java.edad = edad. } /** *metodo que nos permite insertar un objeto persona a la lista de personas.HashMap<String . *recibe como parametro un objeto persona y luego obtiene el dni como identificador *con ese identificador busca en la lista si ya se encuentra o no el objeto Alejandro Reyes Marzano Pág 20 . /* Name: Author: Description: Date: Copyright: Personas® ALEJANDRO REYES MARZANO es una estructura de objetos 20/06/09 15:17 ©2008-2009 alemsoft corp */ package datos. public class Personas implements java. } /** * @asigna la edad */ public void setEdad(int edad) { this. } /** * @asigna el dni */ public void setDni(String dni) { this. } MANEJO DE ARCHIVOS } Clase Personas.

util. para saber si inserto o se usa un boolean y se retorna ese valor*/ public boolean adicionarPersona(Persona persona){ boolean insertado=false. } public void guardar(java. } /** * @establece la lista personas con el parametro pasado */ public void setPersonas(java.HashMap<String.JAVA MANEJO DE ARCHIVOS *si lo encuentra retorna el objeto encontrado con ese identificador. archivo. persona). } /** * @returna la lista personas */ public java. El valor se asigna en la variable aux.put(persona.io. personas=(java. si es null se inserta en otro *caso no se inserta. si no encuentra *retorna null.util. } return insertado. } public void cargar(java.File file){ Archivo archivo =new Archivo(file).Persona>)archivo. if(aux==null){ getPersonas(). insertado=true.personas = personas.HashMap<String.get(persona.getDni(). Persona> getPersonas() { return personas.salvar(personas). Alejandro Reyes Marzano Pág 21 . Persona> personas) { this.java es la clase principal donde se muestra la aplicación /* Name: Author: Description: Date: Copyright: FrameArchivo® ALEJANDRO REYES MARZANO es la clase principal 20/06/09 15:17 ©2008-2009 alemsoft corp */ package ventanas.io.File file){ Archivo archivo =new Archivo(file). } } La clase FrameArchivo.util.HashMap<String .recuperar().getDni()). Persona aux=getPersonas().

swing.JButton().JAVA import datos. 2.add(jLabel1).swing.swing. jButtonMostrar = new javax.JLabel().setLayout(new java. 5)). jMenu1 = new javax. jMenu2 = new javax.WindowConstants. jTextFieldEdad = new javax.JMenuItem()."). jLabel1 = new javax. jSeparator1 = new javax.JLabel(). jFileChooserOperaciones = new JFileChooser().addActionListener(new Salir(this)). this.JTextField().swing.swing. 5. this.jMenuItemNuevo. jTextFieldDni = new javax. jMenuItemGuardarC = new javax. initComponents(). jMenuItemSalir = new javax.JSeparator().addActionListener(new Guardar(this)).JMenuBar().swing.*.swing.JButton(). jLabel2.addActionListener(new AbrirArchivo(this)).swing.JMenuItem(). jMenuItemGuardar = new javax.swing.swing. this.swing. } @SuppressWarnings("unchecked") private void initComponents() { jPanel1 = new javax. jLabel1.JMenuItem(). jLabel2 = new javax. jTextFieldApellidos = new javax. jMenuItemAbrir = new javax.jMenuItemSalir.jMenuItemGuardar.swing.swing.JLabel(). jMenuBar1 = new javax.swing. jTextFieldNOmbre = new javax.add(jTextFieldNOmbre).awt.addActionListener(new GuardarArchivo(this)). Alejandro Reyes Marzano Pág 22 .jMenuItemGuardarC. MANEJO DE ARCHIVOS public FrameArchivo() { super(".JTextField().setText("Apellidos").swing.swing. private String currFileName=null. private JFileChooser jFileChooserOperaciones.swing. jMenuItemNuevo = new javax.GridLayout(4.JLabel().:Manejo de Archivos:. jLabel3 = new javax.swing. private boolean dirty=false.JScrollPane().JTextArea().addActionListener(new Nuevo(this)). jScrollPane1 = new javax. jButtonAgregar = new javax.swing.swing.swing. import javax. import java. this.swing.JMenu().JMenu().setText("Nombre").*.JMenuItem().*.JPanel(). public class FrameArchivo extends javax. setDefaultCloseOperation(javax.JTextField().io.swing. jTextAreaMostrar = new javax.JMenuItem().swing.JFrame { Personas personas=new Personas(). jPanel1.JTextField(). jLabel4 = new javax. jPanel1. jPanel1. this.jMenuItemAbrir. private Archivo archivo.EXIT_ON_CLOSE).swing.

jMenu1.add(jLabel2).InputEvent.ActionListener() { public void actionPerformed(java. jPanel1. jLabel3.addActionListener(new java. jMenuItemNuevo.setText("Salir"). java. jButtonAgregar.KeyStroke.. jMenuItemAbrir. jMenuItemNuevo. } }). java.event.setText("Agregar").event.setText("Nuevo Lista"). jMenuItemSalir. jButtonMostrar.setText("Dni").setText("Abrir"). jMenu1.event.awt. jPanel1. jMenuBar1.getKeyStroke(ja va.swing.ActionEvent evt) { jButtonMostrarActionPerformed(evt).setAccelerator(javax.getKeyStroke(java.awt.CTRL_MASK)).KeyStroke.KeyEvent. jMenuItemGuardarC. jButtonMostrar.InputEvent.InputEvent.setAccelerator(javax.event. jLabel4. jPanel1.event.VK_G.add(jTextFieldDni).CTRL_MASK)).add(jLabel4).awt.setAccelerator(javax.add(jMenuItemSalir).event.KeyStroke.setText("Guardar"). jMenu1.setViewportView(jTextAreaMostrar).KeyEvent. jTextAreaMostrar.KeyEvent.add(jSeparator1). jMenuItemGuardar.setRows(5). java. jMenuItemAbrir.awt.event.awt. jMenu1.swing.add(jLabel3).add(jMenuItemAbrir).awt..awt. jPanel1.CTRL_MASK)).VK_N.swing.add(jMenuItemGuardar).add(jMenuItemNuevo).InputEvent.setText("Edad").setAccelerator(javax. MANEJO DE ARCHIVOS jButtonAgregar. awt.event.event.awt. jPanel1.setText("Mostrar"). jMenu1. jMenu1. jScrollPane1.event.ActionListener() { public void actionPerformed(java. jMenu1.add(jTextFieldEdad).swing.getKeyStroke(java.KeyEvent.getKeyStroke(jav a.awt.event.ActionEvent evt) { jButtonAgregarActionPerformed(evt).add(jTextFieldApellidos). jTextAreaMostrar.event.VK_C.VK_A. awt.setColumns(20).setText("Guardar Como .add(jMenuItemGuardarC).CTRL_MASK)). } }).add(jMenu1).addActionListener(new java. jMenuItemGuardarC.setText("Archivo").").awt. java. jMenuItemGuardar.JAVA jPanel1. Alejandro Reyes Marzano Pág 23 .KeyStroke.

swing.addComponent(jPanel1.Alignment. layout.createSequentialGroup() . 107.JAVA MANEJO DE ARCHIVOS jMenu2.swing.addGap(36. 18) .addGap(18.addGroup(layout.createParallelGroup(javax.LEADING) . 33.PREFERRED_SIZE.createParallelGroup(javax.setLayout(layout). getContentPane().createSequentialGroup() . setJMenuBar(jMenuBar1). javax.addGroup(layout.GroupLayout.MAX_VALUE)) ).swing. 36) . javax.GroupLayout.swing. 36.addContainerGap(41.setText("Otros").DEFAULT_SIZE.swing.swing. javax.addComponent(jButtonAgregar))) .createParallelGroup(javax.createSequentialGroup() . 33) .PREFERRED_SIZE) .LEADI NG) .swing. 226.GroupLayout layout = new javax.add(jMenu2). Short.GroupLayout.Group Layout.A lignment. 18. jMenuBar1. javax.createSequentialGroup() .swing. } Alejandro Reyes Marzano Pág 24 .addGroup(layout.GroupLayout.addContainerGap() .LEADI NG) .MAX_VALUE)) ).GroupLayout.addGap(67.addComponent(jPanel1.swing.GroupLayout.swing.PREFERRED_SIZE.addComponent(jScrollPane1. 205.addComponent(jScrollPane1.GroupLayout. pack().GroupLayout. 67.createParallelGroup(javax.addContainerGap(javax. 67) .GroupLayout.setHorizontalGroup( layout.LEADING) .addGroup(layout. javax.createSequentialGroup() .addContainerGap() .swing.GroupLayout.setVerticalGroup( layout.Alignment.swing.addComponent(jButtonMostrar))) .addGap(33.swing.swing.GroupLayout.PREFERRED_SIZE) .A lignment.addComponent(jButtonMostrar) .GroupLayout.PREFERRED_SIZE) .PREFERRED_SIZE. 379.Alignment. javax.GroupLayout.swing. javax.addGroup(layout.createParallelGroup(javax.addComponent(jButtonAgregar) . javax.swing. Short.LEADING) .GroupLayout(getContentPane()). javax.addGroup(layout.addGroup(layout. layout.addGroup(layout.PREFERRED_SIZE.PREFERRED_SIZE))) .

} } { private void jButtonMostrarActionPerformed(java. String apellidos=this. this.mostrar().getText()). } }).getText().getEdad()+"\n". return false.setVisible(true).setEdad(edad).JOptionPane.jTextFieldNOmbre.getDni())) f=personas. } private void reset(){ Alejandro Reyes Marzano Pág 25 .jTextAreaMostrar. p.JAVA MANEJO DE ARCHIVOS { private void jButtonAgregarActionPerformed(java.awt.ActionEvent evt) } this.adicionarPersona(this. } this.ActionEvent evt) boolean f=false.swing.getText(). for(Object ob: co){ s+=((Persona)ob).setNombre(nombre).getPersonas().awt.jTextFieldApellidos."ya se encuentra registrado").event.reset(). } private void mostrar(){ String s="\n\tLista de Personas\n".invokeLater(new Runnable() { public void run() { new FrameArchivo().getNombre()+"\t"+ ((Persona)ob).datos().jTextFieldEdad. } private boolean verString(String s){ if(!(s==null)) return true.setText(s). p. if(!f){ javax.jTextFieldDni.datos()). public static void main(String args[]) { java.event.util. String dni=this.Collection co=personas. return p. int edad=Integer.values().verString(this. p.awt.setDni(dni).getApellidos()+"\t\t"+((Persona)ob).setApellidos(apellidos).showMessageDialog(this. p. if(this. java. } private Persona datos(){ Persona p=new Persona(). String nombre=this.getText().EventQueue.getDni()+"\t"+((Persona)ob).parseInt(this.

JMenuItem jMenuItemSalir. } else { this.setText("").swing.JTextField jTextFieldNOmbre.JPanel jPanel1. this. javax.JLabel jLabel4.swing. this. } } //para manejo de archivos public boolean saveFile() { if(currFileName == null) return saveAsFile().JTextField jTextFieldApellidos.setText(""). javax.JMenuItem jMenuItemGuardarC. if (JFileChooser.JSeparator jSeparator1. javax.jTextFieldApellidos.JLabel jLabel2.getSelectedFile().JLabel jLabel3.setText(""). javax. javax. this.JMenuItem jMenuItemAbrir.swing.swing.JScrollPane jScrollPane1.swing. } private private private private private private private private private private private private private private private private private private private private private private javax. } Alejandro Reyes Marzano Pág 26 . javax.swing.swing.repaint(). tituloAplicacion().guardar(file).repaint(). javax.APPROVE_OPTION ==jFileChooserOperaciones. return false. javax. this. this. javax.jTextFieldNOmbre.swing. javax.setText("").dirty = false.swing. try { File file = new File (currFileName).swing.personas. javax. javax.swing.swing.swing.swing.jTextFieldDni.jTextFieldEdad.swing.getPath().swing.swing. javax.swing. javax. return true.swing.swing.JMenuBar jMenuBar1.JButton jButtonMostrar. javax.JMenuItem jMenuItemGuardar.jTextFieldNOmbre.JAVA this. javax.repaint(). javax. javax. javax. this.JTextField jTextFieldDni.JMenuItem jMenuItemNuevo. this.JTextField jTextFieldEdad.JTextArea jTextAreaMostrar. javax.JButton jButtonAgregar. return saveFile(). javax.JMenu jMenu2.requestFocus().swing. MANEJO DE ARCHIVOS public boolean saveAsFile() { this.JMenu jMenu1.swing.showSaveDialog(this)) { currFileName = jFileChooserOperaciones.JLabel jLabel1.

NO_OPTION: return true. } return false. this.YES_OPTION: return saveFile().dirty = false. dirty = false.setTitle(caption).setText(""). this.event. case JOptionPane."Ventanita". int value= JOptionPane.printStackTrace(). } } public void tituloAplicacion() { String caption.personas.showConfirmDialog(this.cargar(file). this.jTextAreaMostrar. case JOptionPane. } if(dirty) { caption = "*" + caption. } public void nuevo(java.ActionEvent e) { if(cerrarAplicacion()) { personas= new Personas().YES_NO_CANCEL_OPTION) .awt.currFileName = fila. if (currFileName == null) { caption = "Lista contactos 01". "Desea cambios ?". MANEJO DE ARCHIVOS } public boolean cerrarAplicacion() { if(!dirty) return true.CANCEL_OPTION: default: return false. tituloAplicacion()." + caption.JAVA catch(Exception ex){ ex. } } void abrir(String fila) { try { File file = new File(fila). JOptionPane. tituloAplicacion(). this. currFileName = null. switch(value) { case JOptionPane. } catch(Exception ex){ Guardar los Alejandro Reyes Marzano Pág 27 . } else { caption = currFileName. this. } caption = "contactos .

getPath()).exit(0).getSelectedFile(). if (JFileChooser.ActionEvent e) { if(cerrarAplicacion()) System. } @Override public void actionPerformed(java.awt.awt.JAVA ex.nuevo = nuevo.ActionListener { FrameArchivo abrir.ActionEvent e) { abrirArchivo(). } } /**clase para el manejo de archivos*/ class Nuevo implements java.event. } public void salir(java.repaint(). } this.event. } public void salvarComo(java.getID() == java.ActionEvent e) { nuevo.event.WindowEvent e) { super. } public void abre(java. if(e.nuevo(e).printStackTrace().event. } } MANEJO DE ARCHIVOS public void abrirArchivo() { if (!cerrarAplicacion()) return.event.awt.awt.ActionListener { FrameArchivo nuevo. } == } class AbrirArchivo implements java.ActionEvent e) { saveFile().awt. public AbrirArchivo(FrameArchivo abrir) { Alejandro Reyes Marzano Pág 28 .showOpenDialog(this)) { abrir(jFileChooserOperaciones.WINDOW_CLOSING) salir(null).ActionEvent e) { saveAsFile().event. } @Override protected void processWindowEvent(java.awt. public Nuevo(FrameArchivo nuevo) { this. } void salvar(java.event.awt.APPROVE_OPTION jFileChooserOperaciones.WindowEvent.event.awt.awt.event.processWindowEvent(e).

event. } @Override public void actionPerformed(java. } MANEJO DE ARCHIVOS @Override public void actionPerformed(java. } @Override public void actionPerformed(java.ActionEvent e) { abrir.salvarComo(e).awt.abre(e).event.ActionListener { FrameArchivo guardar.JAVA this.event.event. } } class GuardarArchivo implements java.event.g = g.awt.ActionListener { FrameArchivo salir.awt. } } class Guardar implements java.awt.salir(e).salir=salir. public GuardarArchivo(FrameArchivo guardar) { this.awt.ActionEvent e){ guardar.event.event.ActionEvent e) { salir. public Guardar(FrameArchivo g) { this.abrir = abrir.salvar(e).guardar = guardar. } } Prueba: Así se ve el programa Alejandro Reyes Marzano Pág 29 . public Salir(FrameArchivo salir) { this. } } class Salir implements java.ActionListener { FrameArchivo g.ActionEvent e) { g.awt. } @Override public void actionPerformed(java.awt.

. Y se creara una lista vacía.JAVA MANEJO DE ARCHIVOS En la barra de menú elegimos la opción Archivo luego elegimos el menú ítem nuevo para crear una nueva lista de personas a registrar. Después de haber creado la lista ya podemos ingresar personas en la lista. Alejandro Reyes Marzano Pág 30 . Para ello llénanos los datos de la persona en los campos respectivos. Como se ve en la imagen.

Alejandro Reyes Marzano Pág 31 . Así podemos seguir ingresando mas personas a la lista.JAVA MANEJO DE ARCHIVOS Luego damos agregar y la persona será agregando a la lista de personas.

hay que tener cuidado. da lo mismo pero cuando el archivo ya existe y estamos trabajando con ese archivo si queremos actualiza podemos hacer con la opción guardar y si queremos guardar con otro nombre lo hacemos con guardar como. Alejandro Reyes Marzano Pág 32 .JAVA MANEJO DE ARCHIVOS Ahora demos click en mostrar para mostrar la lista de personas registradas En el menú archivo seleccionamos guardar como es la primera vez puedes hacer con la opción guardar o guardar como.

JAVA MANEJO DE ARCHIVOS Luego le asignamos un nombre y seleccionamos la dirección a donde se quiere guardar y hacemos click en guardar. Alejandro Reyes Marzano Pág 33 . si hacemos click en cancelar no se guardará. Para abrir seleccionamos la opción abrir del menú archivo.

JAVA MANEJO DE ARCHIVOS Seleccionamos el fichero y hacemos click en abrir Finalmente mostramos la lista que habíamos guardado Alejandro Reyes Marzano Pág 34 .

Alejandro Reyes Marzano Pág 35 .JAVA MANEJO DE ARCHIVOS Bueno. espero que les sirva en algo eso es todo por esta vez.

Sign up to vote on this title
UsefulNot useful