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

Aunque probablemente el primer constructor es el que más se utiliza habitualmente. Con FileInputStream. InputStream f2 = new FileInputStream(f). Si se intentan utilizar los métodos mark o reset en un FileInputStream se generará una IOException.txt").  Apertura de un FileInputStream Para abrir un FileInputStream sobre un fichero.txt" ). se puede elegir acceder a un byte. el segundo permite examinar el archivo más de cerca utilizando sus métodos antes de asignarlo a un flujo de entrada. varios bytes o al fichero completo. InputStream f1 = new FileInputStream("/archivo. Alejandro Reyes Marzano Pág 4 . Cualquiera de los dos constructores disponibles en esta clase puede lanzar una FileNotFoundException. 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.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. FileInputStream sobrescribe seis de los métodos de la clase abstracta InputStream. Cuando se crea un FileInputStream.txt").txt"). FileInputStream fichero=new FileInputStream("/carpeta/archive. byte a byte. File fichero = new File( "/carpeta/archive. también se abre para lectura. FileInputStream ficheroSt= new FileInputStream( fichero ). File f = new file("/archive.

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

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

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

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

JAVA MANEJO DE ARCHIVOS Los objetos DataInputStream se comportan como los FileInputStream. numeroSerie = miDStream. //Encadena un fichero de entrada de datos miDStream = new DataInputStream( miFStream ).read( b ). // Ahora se pueden utilizar los dos streams de entrada para // acceder al fichero (si se quiere. como floats.readLong().readInt(). Alejandro Reyes Marzano Pág 9 .  Apertura y cierre de DataInputStream Para abrir y cerrar un objeto DataInputStream.dbf" ). \r. miFStream.close(). ints o chars. Generalmente se utilizan DataInputStream con ficheros binarios. se pueden utilizar los mismos métodos read() de los objetos FileInputStream. se utilizan los mismos métodos que para FileInputStream: DataInputStream miDStream. i = miDStream.. por ejemplo: long numeroSerie.close(). FileInputStream miFStream. // Obtiene un controlador de fichero miFStream = new FileInputStream "/etc/ejemplo. \r\n o con EOF.  Lectura de un DataInputStream Al acceder a un fichero como DataInputStream. No obstante. Los streams de datos pueden leer cualquiera de las variables de tipo nativo. Para leer un long. // Cierra el fichero de datos explícitamente //Siempre se cierra primero el fichero stream de mayor nivel miDStream.. 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 marca el final de la cadena con \n.) miFStream. Para el método String readLine().

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

Se le da al constructor un String o un objeto File. miFichero = new File( "/etc/kk" ). Como con los streams de entrada. miFicheroSt = new FileOutputStream( miFichero ). se tienen las mismas posibilidades que para abrir un fichero stream de entrada.  Apertura de un FileOutputStream Para abrir un objeto FileOutputStream. miFicheroSt = new FileOutputStream( "/etc/kk" ).  Objetos FileOutputStream Los objetos FileOutputStream son útiles para la escritura de ficheros de texto. Como con los ficheros de entrada. también se puede utilizar: File miFichero FileOutputStream miFicheroSt. FileOutputStream miFicheroSt.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. primero se necesita abrir el fichero para luego escribir en él. Alejandro Reyes Marzano Pág 11 .

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

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

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

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

// Abrimos el fichero de acceso aleatorio miRAFile = new RandomAccessFile( "/tmp/java.seek( miRAFile.seek( miRAFile. Se tiene acceso a todas las operaciones read() y write() de las clases DataInputStream y DataOutputStream.log"."rw" ).length() ). miRAFile. La posición length() marca el final de ese fichero. Devuelve la longitud del fichero. // 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. También se tienen muchos métodos para moverse dentro de un fichero: long getFilePointer(). String s = "Informacion a incorporar\nTutorial de Java\n".length() )."rw" ).java. long length()."rw" ). La posición 0 marca el comienzo de ese fichero.close().JAVA MANEJO DE ARCHIVOS RandomAccessFile miRAFile. // Cerramos el fichero miRAFile.  Acceso a la Información Los objetos RandomAccessFile esperan información de lectura/escritura de la misma manera que los objetos DataInput/DataOutput. } } Alejandro Reyes Marzano Pág 16 . Devuelve la posición actual del puntero del fichero void seek( long pos ).log". 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.dbf".  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.writeBytes( s ). Log. que añade una cadena a un fichero existente: class Log { public static void main( String args[] ) throws IOException { RandomAccessFile miRAFile. miRAFile = new RandomAccessFile( "/tmp/kk. // Nos vamos al final del fichero miRAFile.

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

IOException excepcion){ javax. return true.showMessageDialog(null. return aux.java. una clase serializado con sus respectivos atributos y métodos. return aux.IOException ex){ javax.EOFException eof){ return aux. "Archivo inexistente" + f. "Error en la lectura de archivo\n"+ex.getMessage()). MANEJO DE ARCHIVOS } public boolean salvar(A objetos){ try{ if(!fila.getMessage()). return obj. return aux.exists()) fila.JOptionPane. } } } Aquí crearemos la clase Persona. try{ aux=leer(). } catch(java.io. return false.JOptionPane.JAVA } if ( input != null) input. Es una clase sencilla pues aquí se trata de explicar el uso de archivos. } catch(java.JOptionPane.swing.showMessageDialog(null. } catch (ClassNotFoundException f) { javax.swing. "Error de archivo inexistente\n"+excepcion.io. escribir(objetos). 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 .getMessage()).close().showMessageDialog(null.createNewFile(). } } public A recuperar(){ A aux=null.swing.io. } catch(java.

} /** Alejandro Reyes Marzano Pág 19 . private String dni. String apellidos.edad = edad. private int edad. } /** * @returna el nombre */ public String getNombre() { return nombre. public class Persona implements java.apellidos = apellidos. this. this.JAVA Copyright: */ package datos. } /** * @asigna el nombre */ public void setNombre(String nombre) { this. this. } /** * @asigna los apellidos */ public void setApellidos(String apellidos) { this. private String apellidos. int edad) { this.Serializable{ private String nombre.nombre = nombre.dni = dni. String dni. ©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. } /** * @returna las apellidos */ public String getApellidos() { return apellidos.nombre = nombre.apellidos = apellidos.io.

util. *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 .util. /* 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. es una clase que encapsula un objeto de la clase HashMap que nos permite manejar como una estructura donde se almacenaran las personas registradas. } /** *metodo que nos permite insertar un objeto persona a la lista de personas.Persona>(). } MANEJO DE ARCHIVOS } Clase Personas.HashMap<String . public Personas() { personas =new java. El lector puede implementar mas métodos como métodos de búsqueda y otros. } /** * @asigna la edad */ public void setEdad(int edad) { this.dni = dni.edad = edad.JAVA * @returna el dni */ public String getDni() { return dni. public class Personas implements java. } /** * @returna la edad */ public int getEdad() { return edad.java.Serializable{ private java.Persona> personas.io.HashMap<String . } /** * @asigna el dni */ public void setDni(String dni) { this.

if(aux==null){ getPersonas().File file){ Archivo archivo =new Archivo(file). } public void cargar(java.util. si no encuentra *retorna null.personas = personas. Alejandro Reyes Marzano Pág 21 . Persona aux=getPersonas(). } } La clase FrameArchivo. } /** * @returna la lista personas */ public java.io. si es null se inserta en otro *caso no se inserta.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.get(persona.recuperar().put(persona.io.Persona>)archivo. insertado=true.util. Persona> personas) { this.util.JAVA MANEJO DE ARCHIVOS *si lo encuentra retorna el objeto encontrado con ese identificador. personas=(java.HashMap<String. persona). } return insertado.File file){ Archivo archivo =new Archivo(file).HashMap<String. Persona> getPersonas() { return personas. } /** * @establece la lista personas con el parametro pasado */ public void setPersonas(java. } public void guardar(java. archivo.getDni()).salvar(personas).getDni().HashMap<String . El valor se asigna en la variable aux. para saber si inserto o se usa un boolean y se retorna ese valor*/ public boolean adicionarPersona(Persona persona){ boolean insertado=false.

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

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

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

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

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

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

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

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

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.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. Y se creara una lista vacía.

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. Alejandro Reyes Marzano Pág 31 .

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. 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. hay que tener cuidado.

Alejandro Reyes Marzano Pág 33 . si hacemos click en cancelar no se guardará.JAVA MANEJO DE ARCHIVOS Luego le asignamos un nombre y seleccionamos la dirección a donde se quiere guardar y hacemos click en 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 .

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

Sign up to vote on this title
UsefulNot useful