Publicado el 14 de Enero del 2017
1.762 visualizaciones desde el 14 de Enero del 2017
300,6 KB
24 paginas
Creado hace 14a (18/05/2010)
Prácticas de Programación
Tema 1. Introducción al análisis y diseño de programas
Tema 2. Clases y objetos
Tema 3. Herencia y Polimorfismo
Tema 4. Tratamiento de errores
Tema 5. Aspectos avanzados de los tipos de datos
Tema 6. Modularidad y abstracción: aspectos avanzados
Tema 7. Entrada/salida con ficheros
Tema 8. Verificación y prueba de programas
Prácticas de Programación
Tema 7. Entrada/salida con ficheros
© M. Aldea y M. González
18/05/10
Tema 7. Entrada/salida con ficheros
7.1. Ficheros
7.2. Flujos de datos (streams)
7.3. Salida binaria
7.4. Entrada binaria
7.5. Salida de texto
7.6. Entrada de texto
7.7. Entrada/Salida de texto con formato
7.8. Uso de ficheros como tablas
7.9. Resumen
7.10. Bibliografía
Prácticas de Programación
Tema 7. Entrada/salida con ficheros
7.1 Ficheros
Fichero:
© M. Aldea y M. González
18/05/10
7.1 Ficheros
• secuencia de bytes en un dispositivo de almacenamiento:
disco duro, CD, DVD, memoria USB, ...
• se puede leer y/o escribir
• se identifica mediante un nombre (pathname)
- /home/pepe/documentos/un_fichero
Tipos de ficheros:
• programas: contienen instrucciones
• datos: contienen información, como números (enteros o
reales), secuencias de caracteres, ...
• en algunos sistemas operativos (como Linux) también son
ficheros los directorios, los dispositivos, las tuberías, ...
Prácticas de Programación
© M. Aldea y M. González
18/05/10
1
2
3
Tema 7. Entrada/salida con ficheros
Ficheros de texto y binarios
Tipos de ficheros de datos:
7.1 Ficheros
• de bytes (binarios): pensados para ser leídos por un programa
• de caracteres (de texto): están pensados para ser leídos
y/o creados por una persona
Fichero binario
0
1
2
3
4
5
6
7
...
00000000
00000000
00000000
00001110
00000000
00000000
00000000
00100001
...
Un número
entero: 14
Otro número
entero: 33
Fichero de texto
0
1
2
3
4
5
...
00110001
00110100
01101000
01101111
01101100
01100001
...
‘1’ (código ASCII 0x31)
‘4’ (código ASCII 0x34)
‘h’ (código ASCII 0x68)
‘o’ (código ASCII 0x6F)
‘l’ (código ASCII 0x6C)
‘a’ (código ASCII 0x61)
• Para “entender” los contenidos de un fichero es necesario
conocer de antemano el tipo de datos que contiene
Prácticas de Programación
Tema 7. Entrada/salida con ficheros
© M. Aldea y M. González
18/05/10
Punteros de lectura y escritura
4
7.1 Ficheros
• Indican el próximo byte a leer o a escribir
• Gestionados automáticamente por el sistema operativo
• Comienzan apuntando al primer byte del fichero
• Van avanzando por el fichero según se van leyendo sus
contenidos
Ejemplo:
puntero
de lectura
Prácticas de Programación
Tema 7. Entrada/salida con ficheros
lectura de un
int (4 bytes)
lectura de un
short (2 bytes)
puntero
de lectura
© M. Aldea y M. González
18/05/10
puntero
de lectura
5
7.2 Flujos de datos (streams)
La Entrada/Salida de Java se organiza generalmente mediante
objetos llamados Streams
Un Stream es la generalización de un fichero:
7.2 Flujos de datos (streams)
• secuencia ordenada de datos con
un determinado origen y destino
• su origen o destino puede ser un
Stream
fichero, pero también un string o un dispositivo (p.e. el teclado)
Para poder usar un stream primero hay que abrirle
• se abre en el momento de su creación
• y hay que cerrarle cuando se deja de utilizar
Las clases relacionadas con streams se encuentran definidas en
el paquete java.io (io es la abreviatura de Input/Output)
Prácticas de Programación
© M. Aldea y M. González
18/05/10
6
Tema 7. Entrada/salida con ficheros
Clasificación de los streams
Por el tipo de datos que “transportan”:
• binarios (de bytes)
• de caracteres (de texto)
Por el sentido del flujo de datos:
7.2 Flujos de datos (streams)
• de entrada: los datos fluyen desde el dispositivo o fichero hacia
el programa
• de salida: los datos fluyen desde el programa al dispositivo
Según su cercanía al dispositivo:
• iniciadores: son los que directamente vuelcan o recogen los
datos del dispositivo
• filtros: se sitúan entre un stream iniciador y el programa
Prácticas de Programación
Tema 7. Entrada/salida con ficheros
© M. Aldea y M. González
18/05/10
Uso de los Streams
Normalmente se utilizan por parejas
• formadas por un stream iniciador y un filtro
7.2 Flujos de datos (streams)
Binarios
Objeto
Objeto
ObjectOutputStream
ObjectInputStream
De Texto:
String
FileWriter
bytes
bytes
carac-
teres
FileOutputStream
FileInputStream
PrintWriter
Fichero
Fichero
Fichero
Fichero
String
BufferedReader
FileReader
Prácticas de Programación
Tema 7. Entrada/salida con ficheros
© M. Aldea y M. González
18/05/10
Jerarquía de clases
Principales Streams binarios
7.2 Flujos de datos (streams)
7
8
• OutputStream: escritura de ficheros binarios
• FileOutputStream (iniciador): escribe bytes en un fichero
• ObjectOutputStream (filtro): convierte objetos y variables en
arrays de bytes que pueden ser escritos en un OutputStream
• InputStream: lectura de ficheros binarios
• FileInputStream (iniciador): lee bytes de un fichero
• ObjectInputStream (filtro): convierte en objetos y variables
los arrays de bytes leídos de un InputStream
OutputStream
InputStream
FileOutputStream ObjectOutputStream
FileInputStream
ObjectInputStream
Prácticas de Programación
© M. Aldea y M. González
18/05/10
9
Tema 7. Entrada/salida con ficheros
Jerarquía de clases
Principales Streams de caracteres
7.2 Flujos de datos (streams)
• Writer: escritura de ficheros de texto
• FileWriter (iniciador): escribe texto en un fichero
• PrintWriter (filtro): permite convertir a texto variables y
objetos para escribirlos en un Writer
• Reader: lectura de ficheros de texto
• FileReader (iniciador): lee texto de un fichero
• BufferedReader (filtro): lee texto (línea a línea) de un Reader
Writer
Reader
FileWriter
PrintWriter
FileReader
BufferedReader
Prácticas de Programación
Tema 7. Entrada/salida con ficheros
Objetos stream predefinidos
System.out: Salida estándar (consola)
© M. Aldea y M. González
18/05/10
10
7.2 Flujos de datos (streams)
• objeto de la clase PrintStream (subclase de OutputStream)
- métodos print, println, printf, ...
System.err: Salida de error (consola)
• también es un objeto de la clase PrintStream
System.in: Entrada estándar (teclado)
• objeto de la clase InputStream
Deberían ser de las clases PrintWriter y BufferedReader
• pero los streams de caracteres no existían en las primeras
versiones de Java
• siguen siendo streams binarios por compatibilidad con
versiones antiguas
Prácticas de Programación
Tema 7. Entrada/salida con ficheros
© M. Aldea y M. González
18/05/10
11
7.3 Salida binaria
Es posible escribir variables y objetos en un fichero binario
Para poder escribir un objeto su clase debe implementar la interfaz
Serializable, de la manera siguiente:
7.3 Salida binaria
import java.io.*;
public class Nombre implements Serializable
{...}
Se usa la pareja de streams FileOutputStream (iniciador) y
ObjectOutputStream (filtro)
Objeto
ObjectOutputStream
bytes
FileOutputStream
Fichero
Prácticas de Programación
© M. Aldea y M. González
18/05/10
12
Tema 7. Entrada/salida con ficheros
Clase FileOutputStream
Operaciones más habituales:
7.3 Salida binaria
Descripción
Declaración
Constructor. Requiere el nombre del
fichero. Lo crea si no existe. Si existe se
borran sus contenidos.
Lanza FileNotFoundException si el
fichero no se puede crear
Igual que el anterior, salvo en que
cuando añade es true no se borran los
contenidos, sino que los datos se aña-
den al final del fichero
Sincronizar
Cerrar
FileOutputStream(String s)
throws FileNotFoundException
FileOutputStream(String s,
boolean añade)
throws FileNotFoundException
void flush()
void close()
Prácticas de Programación
Tema 7. Entrada/salida con ficheros
Clase ObjectOutputStream
Operaciones más habituales:
© M. Aldea y M. González
18/05/10
13
7.3 Salida binaria
Descripción
Constructor.
Requiere un OutputStream
Escribir un booleano
Escribir un double
Escribir un int
Escribir un objeto
Se escriben también los objetos a los que el
objeto obj se refiere (y así recursivamente)
Sincronizar (llama a out.flush())
Cerrar (llama a out.close())
Declaración
ObjectOutputStream(
OutputStream out)
void writeBoolean(boolean b)
void writeDouble(double d)
void writeInt(int i)
void writeObject(Object obj)
void flush()
void close()
Todos los métodos (incluido el constructor) lanzan IOException
• error al acceder al OutputStream (normalmente un fichero)
Prácticas de Programación
Tema 7. Entrada/salida con ficheros
Ejemplo de escritura de objeto
© M. Aldea y M. González
18/05/10
14
7.3 Salida binaria
Añadir a la clase Agenda del problema 2 una operación para grabar
una agenda (incluyendo los contactos que contiene), a un fichero:
• Previamente ha sido necesario declarar las clases que se van a
escribir como Serializable:
import java.io.*;
public class Contacto implements Serializable {...
import java.io.*;
public class Agenda implements Serializable {...
Prácticas de Programación
© M. Aldea y M. González
18/05/10
15
Tema 7. Entrada/salida con ficheros
7.3 Salida binaria
Ejemplo de escritura de objeto (cont.)
El método a añadir a la clase Agenda es:
public void salvaAFichero(String nomFich)
throws IOException {
ObjectOutputStream sal = null;
try {
// abre los streams iniciador y filtro
sal = new ObjectOutputStream(
new FileOutputStream(nomFich));
// graba el objeto actual
sal.writeObject(this);
} finally {
if (sal != null) {
sal.close(); // cierra los streams
}
}
}
© M. Aldea y M. González
18/05/10
16
Prácticas de Programación
Tema 7. Entrada/salida con ficheros
7.4 Entrada binaria
Es posible leer variables y objetos de un fichero binario que fue
creado según lo expuesto
Comentarios de: Prácticas de Programación - Tema 7. Entrada/salida con ficheros (0)
No hay comentarios