1. Conceptos sobre archivos
Los archivos también denominados ficheros son una colección de información (datos relacionados entre sí), localizada o almacenada como una unidad en alguna parte de la computadora. Los archivos son el conjunto organizado de informaciones del mismo tipo, que pueden utilizarse en un mismo tratamiento; como soporte material de estas informaciones.
Los archivos como colección de datos sirven para la entrada y salida a la computadora y son manejados con programas. Los archivos pueden ser contrastados con Arrays y registro; lo que resulta dinámico y, por esto, en un registro se deben especificar los campos, el número de elementos de un arrays (o arreglo), el número de caracteres en una cadena; por esto se denotan como "Estructuras estáticas".
En los archivos no se requiere de un tamaño predeterminado; esto significa que se pueden hacer archivos de datos más grandes o pequeños, según se necesiten. Cada archivo es referenciado por su identificador (su nombre).
Las principales características de los archivos son:
- Independencia de las informaciones respecto de los programas.
- La información almacenada es permanente.
- Un archivo puede ser accedido por distintos programas en distintos momentos.
- Gran capacidad de almacenamiento.
Hay dos aspectos importantes en que difieren las organizaciones de archivos: la secuenciación de registros y el conjunto de operaciones para manipularlos.
Por ello tenemos como modos básicos de acceso a:
- Los archivos secuenciales o de texto
- Los archivos de acceso aleatorio o binarios
2. Archivos secuenciales
La forma más sencilla de almacenar un conjunto de registros en un archivo es mediante la organización secuencial. En este tipo de archivos, los registros son escritos consecutivamente cuando el archivo es creado, por lo tanto, deben ser accesados de ese modo cuando se consultan. Es la forma básica de organizar un conjunto de registros, que forman un archivo, utilizando una organización
secuencial.
En un archivo organizado secuencialmente, lo registros quedan grabados consecutivamente cuando el archivo se utiliza como entrada. En la mayoría de los casos, los registros de un archivo secuencial quedan ordenados de acuerdo con el valor de algún campo de cada registro. Semejante archivo se dice que es un archivo ordenado; el campo, o los campos, cuyo valor se utiliza para determinar el ordenamiento es conocido como la llave del ordenamiento. Un archivo puede ordenarse ascendente o descendentemente con base en su llave de ordenamiento.
La característica más importante de esta técnica de organización de archivos es que solo permite el acceso secuencial, es decir, para acceder al registro k, se deben recorrer los k-1 registros anteriores.
Esta característica impide que el archivo secuencial se use en procesos en línea debido a que no se pueden consultar rápidamente los registros; sin embargo, muestra buen rendimiento en procesos en lote donde se aprovecha la capacidad para acceder al siguiente registro rápidamente. Otra ventaja de
esta organización de archivos radica en que la dirección del registro está implícita en el sistema; es decir, no se pierden registros por la desaparición de direcciones.
Estructura de la organización secuencial
Archivo secuencial es la forma más simple de almacenar y recuperar registros de un archivo. En un archivo secuencial, se almacenan los registros uno tras otro. El primer registro almacenado se coloca al principio del archivo. El segundo se almacena inmediatamente después (no existen posiciones sin
uso), el tercero después del segundo, etc. Este orden nunca cambia en la organización secuencial.
Una característica de los archivos secuenciales es que todos los registros se almacenan por posición: de primer registro, segundo registro etc.
Ventajas y desventajas
Ventajas:
Los archivos secuenciales proveen la mejor utilización de espacio y son rápidos cuando los registros son accedidos secuencialmente. Los archivos con poca volatilidad, gran actividad y tamaño variable son altamente susceptibles de ser organizados secuencialmente. La ventaja más importante de la técnica de organización secuencial de archivos es la capacidad de acceso al "siguiente" registro rápidamente, mientras que el patrón de acceso a un archivo secuencial se conforme al ordenamiento de registros en el archivo, los tiempos de acceso serán muy buenos.
Sin embargo, si el patrón de acceso al programa no se conforma al patrón de ordenamiento de los registros, entonces la eficiencia del programa puede ser terrible. Otra ventaja de los archivos de organización secuencial es que son muy sencillos de usar y aplicar.
Desventajas:
El acceso a un registro es pobre, la localización de un determinado registro no se puede hacer individualmente no de manera rápida, y el acceso aleatorio es impráctico.
Además, en los archivos secuenciales la dirección de registro está implícita y están vulnerables a fallas del sistema.
Escritura de los archivos secuenciales
En estos archivos, la información solo puede leerse y escribirse empezando desde el principio del archivo.
Los archivos secuenciales tienen algunas características que hay que tener en cuenta:
1. La escritura de nuevos datos siempre se hace al final del archivo.
2. Para leer un dato concreto del archivo hay que avanzar siempre hasta donde se encuentre dicho dato. Si el dato requerido se encuentra antes del dato en que se está posicionado el archivo en un momento dado, será necesario regresar al comienzo del archivo y avanzar hasta el dato necesario.
Almacenamiento de archivos secuenciales
Los archivos secuenciales pueden almacenarse en dispositivos de acceso serial o directo. Con frecuencia los dispositivos de acceso serial son considerablemente menos caros que los dispositivos de acceso directo en un sistema de cómputo, pero de hecho, los dispositivos de almacenamiento de acceso directo en una computadora siempre proporcionan mayor capacidad de almacenamiento y acceso más rápido que los dispositivos de acceso serial. Para leer un archivo secuencial, el sistema siempre comienza al principio del archivo y lee un registro a la vez hasta llegar al registro deseado.
Por ejemplo, si ocurre que el registro particular es el décimo en un archivo, el sistema comienza en el primer registro y lee hacia delante un registro a la vez hasta llegar al décimo.
Actualización en archivos secuenciales
Un archivo maestro representa el punto estático de algún aspecto de alguna organización en un tiempo dado. Los cambios en la organización se reflejan en el archivo maestro, y para llevar a cabo la actualización del archivo maestro se tendrán que realizar los tipos de actualización:
- Insertar un nuevo registro
- Borrar un registro
- Modificar un registro
Al estar usando un archivo secuencial como archivo maestro, el realizar las operaciones de actualización se llevará con el auxilio de un archivo de transacciones, debido a que se realizará el proceso en lote para que sea más eficiente.
Creación de archivos secuenciales
La creación de un archivo secuencial se realiza agregando registros al final del archivo, no importa el medio de entrada de datos. El archivo secuencial puede ser almacenado en cintas o en discos magnéticos. Un archivo secuencial puede tener registros fijos o variables, la declaración del archivo y la definición del registro dependerá del lenguaje de programación que se vaya a usar.
Clasificación de los archivos secuenciales
Normalmente el uso de los archivos secuenciales se da en procesos en lote, donde se ha hecho notar que son eficientes cuando se llevan a cabo diversas operaciones sobre una gran cantidad de registros o de todo el archivo. Esta eficiencia se logra con una acción: la clasificación, proceso que no es exclusivo de los archivos secuenciales, pero sí necesaria para diversas operaciones.
La clasificación es el proceso de examinar los registros en un archivo y ponerlos en una secuencia ascendente o descendente basada en el valor de uno o más campos del registro.
Recuperación de archivos secuenciales
Como se mencionó anteriormente la recuperación de información de los archivos se da como consulta (modo interactivo) o como la generación de reporte (modo lote). También se indicó la desventaja de acceder a un solo registro de un archivo secuencial.
Es ineficiente el uso de estos archivos para realizar la consulta de un registro, pero es óptimo su uso para la generación de un reporte de secuencia lógica en que se encuentra el archivo, el reporte podrá ser de varios tipos:
- Selectivo
- Resumen y sumarización
- Clasificado por uno o más campos
Consideraciones de los archivos secuenciales el uso más común para los archivos secuenciales es para el procesamiento de lotes, tales como respaldo de datos, generación de reportes, transmisión física de datos, etc., archivo de nómina.
Ventajas: los archivos secuenciales proveen la mejor utilización de espacio y son rápidos cuando los registros son accedidos secuencialmente. Los archivos con poca volatilidad, gran actividad y tamaño variables son altamente susceptibles de ser organizados secuencialmente.
Desventajas: el acceso a un registro es pobre, la localización de un determinado registro no se puede hacer individualmente ni rápidamente, el acceso aleatorio es impráctico. El archivo a causa de inserciones y supresiones, tiene que ser reescrito periódicamente.
Uso de las Clases FileReader y FileWriter
Las clases FileReader y FileWriter permiten leer y escribir, respectivamente, en un fichero.
Lo primero que debemos hacer es importar estas clases y las que controlan las excepciones.
Después debemos crear un objeto de alguna de estas clases. Se pueden construir con un objeto File, FileDescriptor o un String.
Al crear un objeto de estas clases, deben estar dentro de un try-catch, para poder manejar las excepciones.
Cuando creamos un objeto, abrimos un stream entre nuestro programa y el exterior, cuando debemos de usarlo debemos cerrar el stream con el método close().
Ejemplo de creación de los objetos
FileWriter fw=new FileWriter("D:\\fichero1.txt");
FileReader fr=new FileReader("D:\\fichero1.txt");
Al instanciar las clases escribimos la ruta del fichero. En el caso de FileWriter si la ruta del fichero que no existe este la crea, para FileReader sí debe existir el fichero, ya que si no existe lanzará una excepción. Usamos doble barra (\\) porque es un carácter de escape, para poner \.
Ejemplo:
Escribir y leer texto en un fichero.
Para escribir, usaremos el método write de FileWriter, este método puede usar como parámetro un String con lo que queremos escribir o un número que se corresponderá un carácter de la tabla ASCII.
Para leer, usaremos el método read de FileReader, este método no tiene parámetros pero devuelve un número que si le hacemos un casting a char este será legible por nosotros. Esto lo podemos mostrar por pantalla o incluso pasarlo a otro fichero (crear otro objeto). Cuando se termina el fichero, el método read devuelve -1.
import java.io.*;
//Importamos todas las clases de java.io
public class FicheroTextoApp {
public static void main(String[] args) {
try{
//Abro stream, crea el fichero si no existe
FileWriter fw=new FileWriter("D:\\fichero1.txt");
//Escribimos en el fichero un String y un caracter 97 (a)
fw.write("Esto es una prueb");
fw.write(97);
//Cierro el stream
fw.close();
//Abro el stream, el fichero debe existir
FileReader fr=new FileReader("D:\\fichero1.txt");
//Leemos el fichero y lo mostramos por pantalla
int valor=fr.read();
while(valor!=-1){
System.out.print((char)valor);
valor=fr.read();
}
//Cerramos el stream
fr.close();
}catch(IOException e){
System.out.println("Error E/S: "+e);
}
}
}
La idea es abrir un fichero, escribir o leer y cerrar el fichero. No es necesario que hagamos nada para mover el puntero del fichero, cuando leemos un carácter automáticamente el puntero se mueve (acceso secuencial).
3. Archivos de acceso aleatorio
Permiten situarse en cualquier punto del archivo para actualizar ciertos valores.
La clase Java RandomAccesFile del paquete java.io implementa un archivo de acceso aleatorio, puede ser utilizado tanto para lectura como escritura de bytes.
Todo objeto, instancia de RandomAccesFile , soporta el concepto de puntero que indica la posición actual dentro del archivo. Es un entero que empiza en 0 y mide en bytes.
Los archivos de acceso secuencial son muy útiles, pero a veces son necesarios archivos de acceso aleatorio que permiten acceder a sus contenidos en forma aleatoria o no secuencial.
La clase Java RandomAccessFile del paquete java.io implementa un archivo de acceso aleatorio, puede ser utilizado tanto como para lectura como escritura de bytes.
Todo objeto, instancia de RamdomAccessFile, soporta el concepto de puntero que indica la posición actual dentro del archivo. Es un entero que empieza en 0 y se mide en bytes.
RamdomAccessFile provee comandos para operar sobre el puntero.
Los constructores de la clase son:
RamdomAccessFile(String path, String modo);
RamdomAccessFile(File objetoFile, String modo);
Lanzan una excepción FileNotFoundException.
El argumento modo indica el modo de acceso en el que se abre el fichero.
Los valores permitidos para este parámetro son:
- "r": Abre el fichero en modo solo lectura. El fichero debe existir. Una operación de escritura en este fichero lanzará una excepción IOException.
- "rw": Abre el fichero en modo lectura y escritura. Si el fichero no existe se crea.
Ejemplo: abrir un fichero aleatorio para lectura
Se abre el fichero clientes.dat para lectura usando el primer constructor.
RandomAccessFile fichero = new
RandomAccessFile("/ficheros/clientes.dat", "r");
Ejemplo: abrir un fichero aleatorio para lectura/escritura
Se abre el fichero personas.dat para lectura/escritura usando el segundo
constructor. Si el fichero no existe se crea.
File f = new File ("/ficheros/personas.dat");
RandomAccessFile fichero = new RandomAccessFile(f, "rw");
Acceso a datos en ficheros aleatorios
Para acceder de forma aleatoria a los datos contenidos en el fichero, la clase RandomAccessFile dispone de varios métodos. Entre ellos:
long getFilePointer();
Devuelve la posición actual del puntero del fichero. Indica la posición (en bytes)
donde se va a leer o escribir.
long length();
Devuelve la longitud del fichero en bytes.
void seek(long pos);
Coloca el puntero del fichero en una posición determinada. La posición se da como un desplazamiento en bytes desde el comienzo del fichero. La posición 0 indica el principio del fichero. La posición length() indica el final del fichero.
Además, dispone de métodos de lectura/escritura:
public int read()
Devuelve el byte leído en la posición marcada por el puntero. Devuelve -1 si alcanza el final del fichero. Se debe utilizar este método para leer los caracteres de un fichero de texto.
public final String readLine()
Devuelve la cadena de caracteres que se lee, desde la posición marcada por el puntero, hasta el siguiente salto de línea que se encuentre.
public xxx readXxx()
Hay un método read para cada tipo de dato básico: readChar, readInt, readDouble, readBoolean, etc.
public void write(int b)
Escribe en el fichero el byte indicado por parámetro. Se debe utilizar este método para escribir caracteres en un fichero de texto.
public final void writeBytes(String s)
Escribe en el fichero la cadena de caracteres indicada por parámetro.
public final void writeXxx(argumento)
También existe un método Write para cada tipo de dato básico:
writeChar, writeInt, writeDouble, writeBoolean, etc.
4. La Interfaz serializable
La serialización es la transformación de un objeto en una secuencia de bytes que pueden ser posteriormente leídos para reconstruir el objeto original.
El objeto serializado puede guardarse en un fichero o puede enviarse por red para reconstruirlo en otro lugar. Puede crearse en un sistema Windows y enviarlo, por ejemplo, a otro sistema que utilice Linux.
Guardar objetos de forma que existan cuando la aplicación haya terminado se conoce como persistencia. Para poder transformar el objeto en una secuencia de bytes, el objeto debe ser serializable.
Un objeto es serializable si su clase implementa la interface Serializable. La interface Serializable se encuentra en el paquete java.io. Es una interface vacía. No contiene ningún método.
Public interface Serializable {
}
Sirve para indicar que los objetos de la clase que lo implementa se pueden serializar. Solo es necesario que una clase la implemente para que la máquina virtual pueda serializar los objetos.
Si un objeto contiene atributos que son referencias a otros objetos estos a su vez deben ser serializables.
Todos los tipos básicos Java son serializables, así como los arrays y los Strings.
5. Logging: niveles, formatos y configuraciones
Los objetos LOG son usados para enviar mensajes sobre las excepciones, advertencias o información sobre ocurrencias del sistema. En Java la funcionalidad para operaciones LOG esta implementada en el paquete java.util.logging.
Los mensajes log pueden ser enviados a diversos dispositivos, como a consola, archivos log, base de datos, y otros.
Niveles
Existen varios niveles de log, como muestra la siguiente lista:
SEVERE: Describe eventos que son de mucha importancia para el sistema a fin de que este no tenga un colapso severo.
WARNING: Describe mensajes de peligro o advertencia de sucesos de más bajo nivel que SEVERE.
INFO: Describe mensaje solo de información.
FINE: Describe sucesos sobre fallas menores (recuperables).
Ejemplo de uso de logging.
Formatos
Los formatos de los mensajes log están expresados a través de los parámetros que se desean incluir en el mensaje, como por ejemplo:
Object[] parametros = new Object[]{5, "hola", 8f};
LOGGER.log(Level.INFO,
"\np 0: {0}"
+ "\np 1: {1}"
+ "\np 2: {2}"
+ "\np 1: {1} (2da. vez)", parametros);
El arreglo parámetros de objetos contiene los datos a insertar en el mensaje:
"\np 0: {0}"
+ "\np 1: {1}"
+ "\np 2: {2}"
+ "\np 1: {1} (2da. vez)", parametros);
Entonces, el primer valor del arreglo se inserta en {0}, el segundo en {1} y así sucesivamente. También se puede repetir un dato como muestra el ejemplo al repetir el segundo valor, de la siguiente forma:
"\np 1: {1} (2da. vez)"
Configuraciones
Por defecto los mensajes log se pueden mostrar en consola, pero mediante un archivo properties (log. properties) se puede especificar que estos se almacenen en el archivo en el disco duro. Observe el contenido de un archivo de configuración:
No hay comentarios:
Publicar un comentario