Tema 6. Programación Orientada A Objetos
Tema 6. Programación Orientada A Objetos
Tema 6. Programación Orientada A Objetos
Definición
La información de un archivo se organiza en registros, los registros en campos, los campos en bytes, y los
bytes en bits.
Flujos de E/S
Para que un programa pueda manejar un archivo en un dispositivo de almacenamiento permanente, por
ejemplo un disco, primero debe crearse un flujo. Un flujo es un conducto a través del cual se
transportarán los datos hacia o desde el dispositivo de almacenamiento. Los datos fluirán entre la
memoria RAM de la computadora y el dispositivo de almacenamiento.
Si los datos van a enviarse desde la memoria hacia el disco, se trata de un flujo de salida (Output, en
Inglés); si los datos van a enviarse desde el disco hacia la memoria , el flujo es de entrada (Input, en
Inglés).
A las operaciones de entrada se les conoce como de lectura (Read, en Inglés) y a las de salida se les
conoce como de escritura (Write, en Inglés).
6.2. Clasificación
Dependiendo del tipo de datos que manejan en sus registros, los archivos se clasifican en archivos de
texto y archivos binarios.
Archivos de texto: Los datos en los archivos de texto se graban como secuencias de bytes. Por
ejemplo, el dato 123456 se graba como una secuencia de 6 bytes y no como un entero, por lo
que no pueden realizarse operaciones matemáticas con él.
El manejo de archivos de texto se puede llevar a cabo por medio de dos tipos de flujos: de bytes
y de caracteres.
Archivos binarios: Cuando se requiere efectuar operaciones con datos de alguno de los tipos
primitivos (bool, byte, double, float, int, long, short, etc.), tales datos deberán escribirse y leerse
en formato binario.
Normalmente, cuando se codifica un programa, se hace con la intención de que ese programa pueda
interactuar con los usuarios del mismo, es decir, que el usuario pueda pedir que realice cosas y
suministrar datos con los que se quiere que haga algo. Una vez introducidos los datos y las órdenes, se
espera que el programa manipule de alguna forma esos datos para proporcionarnos una respuesta a lo
solicitado.
En muchas ocasiones interesa que el programa guarde los datos que se le han introducido, de forma que
si el programa termina los datos no se pierdan y puedan ser recuperados en una sesión posterior. La
forma más normal de hacer esto es mediante la utilización de ficheros que se guardarán en un
dispositivo de memoria no volátil (normalmente un disco).
A todas las operaciones, que constituyen un flujo de información del programa con el exterior, se les
conoce como Entrada/Salida (E/S).
Todas las operaciones de E/S en Java vienen proporcionadas por el paquete estándar de la API de Java
denominado java.io que incorpora interfaces, clases y excepciones para acceder a todo tipo de ficheros.
Entrada/Salida estándar
Entrada/salida que se comunica con el usuario a través de la pantalla o de la ventana del terminal. Si
creamos una applet no se utilizarán normalmente estas funciones, ya que su resultado se mostrará en la
ventana del terminal y no en la ventana de la applet. La ventana de la applet es una ventana gráfica y
para poder realizar una entrada o salida a través de ella será necesario utilizar el AWT.
El acceso a la entrada y salida estándar es controlado por tres objetos que se crean automáticamente al
iniciar la aplicación:
a) System.in
Este objeto implementa la entrada estándar (normalmente el teclado), los métodos que nos
proporciona para controlar la entrada son:
b) System.out
Este objeto implementa la salida estándar. Los métodos que nos proporciona para controlar la
salida son:
print(a): Imprime a en la salida, donde a puede ser cualquier tipo básico Java ya que Java
hace su conversión automática a cadena.
println(a): Es idéntico a print(a) salvo que con println() se imprime un salto de línea al
final de la impresión de a.
c) System.err
Este objeto implementa la salida en caso de error. Normalmente esta salida es la pantalla o la
ventana del terminal como con System.out, pero puede ser interesante redirigirlo, por ejemplo
hacia un fichero, para diferenciar claramente ambos tipos de salidas.(Sistemas Operativos II
(S/F))
Ejemplo
A continuación vemos un ejemplo del uso de estas funciones que acepta texto hasta que se pulsa el
retorno de carro e informa del número de caracteres introducidos.
import java.io.*;
class CuentaCaracteres {
public static void main(String args[]) throws IOException {
int contador=0;
while(System.in.read()!='\n')
contador++;
System.out.println(); // Retorno de carro "gratuito"
System.out.println("Tecleados "+contador+" caracteres.");
Tipos de ficheros
En Java es posible utilizar dos tipos de ficheros (texto y binarios) y dos tipos de acceso a los ficheros
(secuencial o aleatorio).
Ficheros
Los ficheros de texto están compuestos de caracteres legibles, mientras que los binarios pueden
almacenar cualquier tipo de datos (int, float, boolean,...).
Acceso a ficheros
• Una lectura secuencial implica tener que acceder a un elemento antes de acceder al siguiente, es
decir, de una manera lineal (sin saltos).
• Los ficheros de acceso aleatorio permiten acceder a datos de una forma aleatoria, esto es
indicando una determinada posición.
El siguiente ejemplo crea el fichero de texto "/carta.txt" a partir de un texto que se le introduce por
teclado: import java.io.*; class CreaCarta {
public static void main(String args[]) throws IOException{
int c;
FileOutputStream f=new FileOutputStream("/carta.txt");
while( ( c=System.in.read() ) != -1 )
f.write( (char)c );
f.close();
}
}
La clase FileInputStream
Mediante los objetos de esta clase leemos de ficheros de texto de forma secuencial.
Presenta el método read() para la lectura del fichero. Este método se puede invocar de varias formas.
• int read( byte a[], int off, int len ): Lee len caracteres del fichero, insertándolos en el vector a.
import java.io.*;
class MuestraCarta {
public static void main(String args[]) throws IOException {
int c;
FileInputStream f=new FileInputStream("/carta.txt");
while( ( c=f.read() ) != -1 )
System.out.print( (char)c );
f.close();
}
Mediante los objetos se utilizan ficheros binarios mediante un acceso aleatorio, tanto para lectura como
para escritura. En estos ficheros hay un índice que nos dice en qué posición del fichero nos encontramos,
y con el que se puede trabajar para posicionarse en el fichero. Cuenta con una serie de funciones para
realizar el desplazamiento del puntero del fichero. Hay que tener en cuenta que cualquier lectura o
escritura de datos se realizará a partir de la posición actual del puntero del fichero.
La escritura del fichero se realiza con una función que depende el tipo de datos que se desee escribir:
void write( byte b[], int ini, int len ); Escribe los caracteres del vector b.
void write( int i ); Escribe la parte baja de i (un byte) en el flujo.
void writeBoolean( boolean b ); Escribe el boolean b como un byte.
void writeByte( int i ); Escribe i como un byte.
void writeBytes( String s ); Escribe la cadena s tratada como bytes, no caracteres.
void writeChar( int i ); Escribe i como 1 byte.
void writeChars( String s ); Escribe la cadena s.
void writeDouble( double d ); Convierte d a long y le escribe como 8 bytes.
void writeFloat( float f ); Convierte f a entero y le escribe como 4 bytes.
void writeInt( int i ); Escribe i como 4 bytes.
void writeLong( long v ); Escribe v como 8 bytes.
void writeShort( int i ); Escribe i como 2 bytes.
void writeUTF( String s ); Escribe la cadena s utilizando la codificación UTF-8.
Referencias: