t16 - ficheros
DESCRIPTION
Gestión de ficheros en JavaTRANSCRIPT
Tema – 16Ficheros
16.1. Introducción
• Un fichero es un objeto abstracto sobre el cual se puede leer y escribir información. Para nuestros programas representará un mecanismo para almacenar de forma permanente ciertos datos.
• Java ofrece diversas clases para trabajar con los ficheros. Utilizaremos unas u otras en función de cómo trabajemos con el fichero.
PROGRAMACIÓN 2
16.1. Introducción
• En Java podemos trabajar con dos tipos de ficheros:– Ficheros de texto: compuestos de caracteres
legibles.
– Ficheros binarios: pueden almacenar cualquier tipo de datos (int, float, boolean…).
• Hay dos tipos de acceso a los ficheros:– Secuencial.
– Aleatorio.
PROGRAMACIÓN 3
16.2. Clases Java para ficheros
• La clase File nos proporciona información acerca de los ficheros. Los métodos para crear un fichero son:
– File (String path)
– File (String path, String name)
– File (File dir, String name)
• “path” es la ruta al fichero, “name” es el nombre.
PROGRAMACIÓN 4
16.2. Clases Java para ficheros
• Otros métodos útiles de la clase File son:– boolean exists(): nos indica si un fichero existe.– long length(): nos indica la longitud del fichero
(contenido).– boolean delete(): borra el fichero (true si lo
borra, false si no).– boolean canRead(): indica si se puede leer del fichero.– boolean canWrite(): indica si se puede escribir en el
fichero.
• En la especificación de la clase File se pueden ver todos su métodos.
PROGRAMACIÓN 5
16.2. Clases Java para ficheros
• Las clases que ofrece Java para leer y escribir en ficheros son:– FileOutputStream: para trabajar con ficheros de
salida de texto con acceso secuencial.
– FileInputStream: para trabajar con ficheros de entrada de texto con acceso secuencial.
– RandomAccessFile: para trabajar con ficheros de entrada o salida binarios con acceso aleatorio.
• Usaremos alguna de estas clases junto con la clase File vista anteriormente.
PROGRAMACIÓN 6
16.3. Operaciones con ficheros
• Las operaciones que realizaremos al trabajar con ficheros serán las siguientes:
– Abrir el fichero.
• Debemos tener en cuenta el modo en que trabajaremos con el fichero.
– Usar el fichero.
• Realizaremos las operaciones de lectura/escritura deseadas.
– Cerrar el fichero.
• No es esencial, ya que el recolector de basura de Java lo cerrará por nosotros, pero es aconsejable.
PROGRAMACIÓN 7
16.3. Operaciones con ficheros
• Abrir el fichero:
– FileOutputStream fos= new FileOutputStream(fichero);
• Para añadir información al final del fichero escribieremos: FileOutputStream fos= new FileOutputStream (fichero, true);
– FileInputStream fis= new FileInputStream (fichero);
– RandomAccessFile raf= new RandomAccessFile(fichero, modo);
• MODO: r (sólo lectura), rw (lectura y escritura).
PROGRAMACIÓN 8
16.3. Operaciones con ficheros
• Usar el fichero con FileOutputStream:
– int write (int b): escribe un byte en el fichero.
– int write (byte[] b): escribe un conjunto de bytes en el fichero.
– int write (byte[] b, int off, int len): escribe un total de “len” bytes del vector, empezando por la posición “off”.
– void close(): cierra el fichero.
PROGRAMACIÓN 9
16.3. Operaciones con ficheros
• Usar el fichero con FileInputStream:– int read (): lee un byte del fichero. Devuelve el
byte leído o -1 si es el final del fichero.
– int read(byte*+ b): lee hasta “b.length” bytes de un fichero, guardándolos en “b”. Devuelve el número total de bytes leídos o -1 si es el final del fichero.
– int read(byte[] b, int off, int len): lee hasta un total de “len” bytes del vector, empezando por la posición off.
– void close(): cierra el fichero.
PROGRAMACIÓN 10
16.3. Operaciones con ficheros
• Podemos usar las clases DataOutputStream y DataInputStream junto con FileOutputStreamy FileInputStream. Las dos primeras nos ofrecen más métodos para la entrada y salida de datos.
– DataInputStream: short readShort(), intreadInt(), float readFloat(), String readLine()…
– DataOutpurStream: void writeShort(short dato), …
PROGRAMACIÓN 11
16.3. Operaciones con ficheros
• Usar el fichero con RandomAccessFile:
– boolean readBoolean(): lee un booleano del fichero.
– char readChar(): lee un carácter del fichero.
– double readDouble(): lee un double del fichero.
– int readInt(): lee un entero del fichero.
– String readLine(): lee la siguiente línea del fichero.
(continúa)
PROGRAMACIÓN 12
16.3. Operaciones con ficheros
• Usar el fichero con RandomAccessFile:– void writeBoolean(boolean v): escribe un booleano en
el fichero.– void writeChar(int v): escribe un carácter en el fichero.– void writeDouble(double v): escribe un double en el
fichero.– void writeInt(int v): escribe un entero en el fichero.– void writeBytes(String s): escribe una cadena de
caracteres en el fichero.
(continúa)
PROGRAMACIÓN 13
16.3. Operaciones con ficheros
• Usar el fichero con RandomAccessFile:– long length(): devuelve la longitud del fichero.
– void setLength(long newLength): establece el tamaño del fichero. Útil para borrar.
– long getFilePointer(): devuelve la posición actual en el fichero.
– void seek(long pos): coloca el puntero del fichero en la posición “pos”. El fichero siempre empieza en la posición 0.
– int skipBytes(int n): intenta saltar “n” bytes desde la posición actual.
PROGRAMACIÓN 14
16.3. Operaciones con ficheros
• Ejemplo de lectura de un archivo:File archivo = new File (“C:\\test.txt”);if(archivo.exists()){
RandomAccessFile raf = new RandomAccessFile (archivo,“r”);String linea = raf.readLine();//Cuando lleguemos al final del archivo linea será igual a nullwhile(linea!=null){
System.out.println(linea);linea = raf.readLine();
}raf.close();
}else{System.out.println(“El archivo no existe.”);
}
PROGRAMACIÓN 15
16.3. Operaciones con ficheros
• Ejemplo de escritura de un archivo:File archivo = new File (“C:\\test.txt”);if(archivo.exists()){
RandomAccessFile raf = new RandomAccessFile (archivo,“rw”);raf.seek(raf.length());// La línea anterior posiciona el cursor al final del archivo para conservar su // contenido sin sobreescribirraf.writeBytes(“Hola”); //Escribo una cadena de caracteresraf.writeInt(10); //Escribo un enteroraf.writeBoolean(true); //Escribo un booleanoraf.writeDouble(2.4); //Escribo un doubleSystem.getProperty("line.separator") //Escribo un salto de linearaf.close();
}else{System.out.println(“El archivo no existe.”);
}
PROGRAMACIÓN 16