martes, 3 de octubre de 2017

Archivos & Ficheros


 INTRODUCCION

2.-El concepto de archivo

Los programas usan variables para almacenar información:los datos de entrada, los resultados calculados y valores intermedios generados a lo largodel cálculo. Toda esta información es efímera: cuando acaba el programa, tododesaparece. Pero, para muchas aplicaciones, es importante poder almacenardatos de manera permanente.
Cuando se desea guardar informaciónmásallá del tiempo de ejecución de un programa lo habitual es organizar esa información en uno o varios ficherosalmacenados en algún soporte de almacenamiento persistente. Otras posibilidades como el uso de bases de datos utilizan archivos como soporte para el almacenamiento de la información.

2.1 Los archivos desde el bajo nivel
Desde el punto de vista de mas bajo nivel, podemos definir un archivo (o fichero) como:
-un conjunto de bits almacenados en un dispositivo , y accesible a través de un cambio de acceso(pathname) que lo identifica.
Es decir, un conjunto de ceros y unos que residen fuera de la memoria del ordenador, ya sea en el disco duro, un pendrive,un CD, entre otros.
Esa versión de bajo nivel, si bien es completamente cierta, desde el punto de vista de la programación de aplicaciones, es demasiado simple.
Por ello definiremos varios criterios para distinguir diversas subcategorías de archivos. Estos tipos de archivos se diferenciaran desde el punto de vista de la programación:
cada uno de ellos proporcionara diferentes funcionalidades(métodos) para su manipulación.


  
2.2.-El criterio del contenido
Sabemos que es diferente manipular números que strings ,aunque en el fondo ambos acaben siendo bits en la memoria del ordenador. Por eso, cuando manipulamos archivos, distinguiremos dos clasesde archivos dependiendo del tipo de dato que contienen:
Ø  Los archivos de caracteres(o de texto).
Ø  Los archivos de bytes (o binarios)
Ø   
Un fichero de texto es aquel formado exclusivamente por caracteres y que por tanto,puede crearse y visualizarse usando un editor. Las operaciones de lectura y escritura trabajaran con caracteres.
Por ejemplo, los ficheros con código java son ficheros de texto.
En cambio un fichero binario ya no está formado por caracteres sino que los bytes que contiene pueden representar otras cosas como numeros, imagenes, sonidos, etc.

2.3.-El criterio de modo de acceso
Existen dos modos basicos de acceso a la informacioncontenida en un archivo:
Ø  Secuencial
Ø  Acceso directo
En el modo secuencial la informacion del archivo es una secuencia de bytes(o caracteres) de manera que para acceder al byte (o carácter) i_esimo se ha de haber accedido anteriormente a los i-1 anteriores.Unejemplo de acceso secuenciales la clase StringTokenizer.
EL modo de acceso directo nos permite acceder directamente a la información del byte i_esimo.Un ejemplo muy conocido de acceso directo lo tenemos con los vectores(arrays).



2.4 Ficheros
Para realizar operaciones sobre los ficheros, necesitamos contar con la información referentesobre un fichero (archivo). La clase File proporciona muchas utilidades relacionadas con ficherosy 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 ejemplo

public File(String pathname) ;
public File(String parent, Stringchild) ;
public File(File parent, Stringchild) ;
public File(URI uri) ;

new File(“/carpeta/archivo”);
new File(“carpeta”, “archivo”);
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. Porejemplo, si sólo se utiliza un fichero en la aplicación, el primer constructor es el mejor. Si encambio, se utilizan muchos ficheros desde un mismo directorio, el segundo o tercer constructorserán más cómodos. Y si el directorio o el fichero es una variable, el segundo constructor será elmás útil.

2.5.-Streams de Entrada
Hay muchas clases dedicadas a la obtención de entrada desde un fichero. Este es el esquema de lajerarquía de clases de entrada por fichero:

Objetos FileInputStream

La clase FileInputStream típicamente representan ficheros de texto accedidos en orden secuencial, byte a byte. Con FileInputStream, se puede elegir acceder a un byte, varios bytes o al fichero completo.
  

Apertura de un FileInputStream
Para abrir un FileInputStream sobre un fichero, 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 discoreal. Cualquiera de los dos constructores disponibles en esta clase puede lanzar unaFileNotFoundException.

InputStream f1 = new FileInputStream("/archivo.txt");
File f = new file("/archive.txt");
InputStream f2 = new FileInputStream(f);
FileInputStream fichero=new FileInputStream("/carpeta/archive.txt");
File fichero = new File( "/carpeta/archive.txt" );
FileInputStream ficheroSt= new FileInputStream( fichero );

Lectura de un FileInputStream

Una vez abierto el FileInputStream, se puede leer de él. El método read() tiene muchas opciones:
int read();
Lee un byte y devuelve -1 al final del stream.
int read( byte b[] );
Llena todo el array, si es posible. Devuelve el número de bytes leídos o -1 si se alcanzó el finaldel stream.
int read( byte b[],int offset,int longitud );
Lee longitud bytes en b comenzando por b[offset]. Devuelve el número de bytes leídos o -1 sise alcanzó el final del stream.

Cierre de FileInputStream

Cuando se termina con un fichero, existen dos opciones para cerrarlo: explícitamente, oimplícitamente cuando se recicla el objeto (el garbage collector se encarga de ello).
Para cerrarlo explícitamente, se utiliza el método close ():
miFicheroSt.close ();













Objetos ObjectInputStream

Para hacer operaciones con el archivo binario serializado abierto se usa objetos de la clase ObjectInputStream, en este caso se usa para leer archivo y se usa el método readObject.
Ejemplo:
private A leer() throws IOException, ClassNotFoundException{
input = new ObjectInputStream(new FileInputStream(fila));
A obj = null;
if( input != null){
obj = (A) input.readObject();
}
if ( input != null)
input.close();
return obj;
}

Objetos DataInputStream
Los objetos DataInputStream se comportan como los FileInputStream. Los streams de datos pueden leer cualquiera de las variables de tipo nativo, como floats, ints o chars. Generalmente se utilizan DataInputStream con ficheros binarios.

Apertura y cierre de DataInputStream
Para abrir y cerrar un objeto DataInputStream, se utilizan los mismos métodos que para
FileInputStream:
DataInputStream miDStream;
FileInputStream miFStream;
// Obtiene un controlador de fichero
miFStream = new FileInputStream "/etc/ejemplo.dbf" );
//Encadena un fichero de entrada de datos
miDStream = new DataInputStream( miFStream );
// Ahora se pueden utilizar los dos streams de entrada para
// acceder al fichero (si se quiere...)
miFStream.read( b );
i = miDStream.readInt();
// Cierra el fichero de datos explícitamente
//Siempre se cierra primero el fichero stream de mayor nivel
miDStream.close();
miFStream.close();



Lectura de un DataInputStream
Al acceder a un fichero como DataInputStream, se pueden utilizar los mismos métodos read() delos objetos FileInputStream. No obstante, también se tiene acceso a otros métodos diseñados paraleer 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.
Para el método String readLine(), se marca el final de la cadena con \n, \r, \r\n o con EOF.
Para leer un long, por ejemplo:
long numeroSerie;
numeroSerie = miDStream.readLong();

2.6.-Streams de Salida

La contrapartida necesaria de la lectura de datos es la escritura de datos. Como con los Streamsde entrada, las clases de salida están ordenadas jerárquicamente:
Examinaremos las clases FileOutputStream y DataOutputStream para complementar losstreams de entrada que se han visto.

Objetos FileOutputStream

Los objetos FileOutputStream son útiles para la escritura de ficheros de texto. Como con losficheros de entrada, primero se necesita abrir el fichero para luego escribir en él.


Apertura de un FileOutputStream

Para abrir un objeto FileOutputStream, se tienen las mismas posibilidades que para abrir unfichero stream de entrada. Se le da al constructor un String o un objeto File.

FileOutputStream miFicheroSt;
miFicheroSt = new FileOutputStream( "/etc/kk" );
Como con los streams de entrada, también se puede utilizar:
File miFichero FileOutputStream miFicheroSt;
miFichero = new File( "/etc/kk" );
miFicheroSt = new FileOutputStream( miFichero );


Escritura en un FileOutputStream

Una vez abierto el fichero, se pueden escribir bytes de datos utilizando el método write(). Como
con el método read() de los streams de entrada, tenemos tres posibilidades:
void write( int b );
Escribe un byte.
void write( byte b[] );
Escribe todo el array, si es posible.
void write( byte b[],int offset,int longitud );
Escribe longitud bytes en b comenzando por b[offset].

Cierre de FileOutputStream
Cerrar un stream de salida es similar a cerrar streams de entrada. Se puede utilizar el métodoexplícito:
miFicheroSt.close ();
O, se puede dejar que el sistema cierre el fichero cuando se recicle miFicheroSt.
  
3.-Archivos secuenciales
Los archivos secuenciales o también llamados archivos de texto plano, permiten la lectura de su información en cualquier editor de texto.

3.1.-Escritura en Archivo Secuencial
La escritura en un archivo secuencial puede hacerse mediante el uso de las clases File,FileWriter y BufferedWriter.
La clase BufferedWriter requiere un objeto instancia de la clase FileWriter para poder abrir el archivo.A su vez,opcionalmente la clase FileWriter puede requerir un objeto instancia de la clase File.Si no se desea usar un objeto de la clase File,al crear el objeto de la clase FileWriter,se debe incluir la ruta del archivo.
Es importante tener en cuenta que si se intenta abrir un archivo con la clase FileWriter y este no existe, entonces java lo crea.
Ejemplo:
importjava.io.BufferedWriter;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileWriter;
importjava.io.IOException;
public class EjemplosArchivos {

public static void main (String[] args) {
            try{
                        File archivo = new File("archivo.txt");
                        FileWriterfw = new FileWriter(archivo);
                        BufferedWriterbw = new BufferedWriter(fw);
                        for(int i=1;i<=10;i++)
                        {bw.write("escritura en archivo # "+i);
                        bw.newLine();
                        }
                        bw.close();




                       
            }catch(FileNotFoundException e){
                        e.printStackTrace();
            }catch (IOException e) {
                        e.printStackTrace();
            }
   }
}
Archivo "archivo.txt"
escritura en archivo # 1
escritura en archivo # 2
escritura en archivo # 3
escritura en archivo # 4
escritura en archivo # 5
escritura en archivo # 6
escritura en archivo # 7
escritura en archivo # 8
escritura en archivo # 9
escritura en archivo # 10

3.2.-Lectura en archivo secuencial
Para realizar la lectura en un archivo secuencial se puede hacer mediante el uso de las clases File,FileReader y BufferedReader.
La clase BufferedReader requiere un objeto instancia de la clase FileReader para poder abrir el archivo.A su vez opcionalmente, la
claseFileReader puede requerir un objeto instancia de la clase File.Si no se desea usar un objeto de la clase File,al crear el objeto de la clase
FileReader,se debe incluir la ruta del archivo.
Es importante tener en cuenta que si se intenta abrir un archivo con la clase FileReader y este no existe,entonces
se presenta una excepcion controlada por la clase FileNotFoundException.



Ejemplo:
importjava.io.BufferedReader;
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileReader;
importjava.io.IOException;

public class EjemplosArchivosLec {

public static void main (String[] args) {
            try{
                        File archivo = new File("archivo.txt");
                        FileReaderfr = new FileReader(archivo);
                        BufferedReaderbr = new BufferedReader(fr);
                        String cadena;
                        while((cadena = br.readLine())!=null){
                       
                                   System.out.println (cadena);
                        }
                       
                                  
            }catch (FileNotFoundException e){
                        e.printStackTrace();
            }catch (IOException e){
                        e.printStackTrace();
            }}  }
Salida:
escritura en archivo # 1
escritura en archivo # 2
escritura en archivo # 3
escritura en archivo # 4
escritura en archivo # 5
escritura en archivo # 6
escritura en archivo # 7
escritura en archivo # 8
escritura en archivo # 9
escritura en archivo # 10


4.-ARCHIVOS DE ACCESO ALEATORIO
A menudo, no se desea leer un fichero de principio a fin; sino acceder al fichero
como una base de datos, donde se salta de un registro a otro; cada uno en
diferentes partes del fichero. Java proporciona una clase RandomAccessFile para
este tipo de entrada/salida.
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,Stringmodo );
Con un objeto File:
miRAFile = new RandomAccessFile( File fichero,String modo );

El argumento modo determina si se tiene acceso de sólo lectura (r) o de
lectura/escritura (r/w). Por ejemplo, se puede abrir un fichero de una base de datos
para actualización:

RandomAccessFilemiRAFile;
miRAFile = new RandomAccessFile( "/tmp/kk.dbf","rw" );

4.1 Acceso a la Información
Los objetos RandomAccessFile esperan información de lectura/escritura de la
misma manera que los objetos DataInput/DataOutput. Se tiene acceso a todas las
operacionesread() y write() de las clases DataInputStream y
DataOutputStream.
También se tienen muchos métodos para moverse dentro de un fichero:
§ longgetFilePointer();
Devuelve la posición actual del puntero del fichero
§ voidseek( 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 marca el comienzo de ese fichero.
§ longlength();
Devuelve la longitud del fichero. La posición length() marca el final de ese
fichero.



4.2 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.log","rw" );
miRAFile.seek(miRAFile.length() );
// Cualquier write() que hagamos a partir de este punto del códigoañadirá información al fichero
En el siguiente ejemplo se añade una cadena a un fichero existente.

import java.io.*;
class Log {
public static void main( String args[] ) throws IOException {
RandomAccessFilemiRAFile;
String s = "Informacion a incorporar\nTutorial de Java\n";
// Abrimos el fichero de acceso aleatorio
miRAFile = new RandomAccessFile( "/tmp/java.log","rw" );
// Nos vamos al final del fichero
miRAFile.seek(miRAFile.length() );
// Incorporamos la cadena al fichero
miRAFile.writeBytes( s );
// Cerramos el fichero
miRAFile.close();
}
} 

5.-Semejanzas

El algoritmo en todos los casos es muy parecido ,ya sea para  escribir o  leer archivos,y es por eso que en este trabajo lo que se hizo es buscar las semejanzas entre los distintos autores y ver la manera mas detallada de entender el problema.
Tanto para los archivos de acceso secuencial como para el manejo de los archivos de acceso aleatorio los métodos que se usan son prácticamente los mismos.


6.-Diferencias
Casi no hay muchas diferencias en cuanto al código de como usar correctamente los archivos ,pero la parte de archivos secuenciales  tiene ejemplos practicos que se pueden copiar  y comprobar lo que   explica teóricamente en el concepto.



8.-Bibliografia


FLOREZ FERNADEZ, Héctor Arturo. Programación orientada a objetos usando java.2012.Editorial ecoe ediciones.

Schildt,Herbert.Java: soluciones de programación.2010.Editorial McGraw-Hill Interamericana.

Alejandro Reyes Marzano. Manejo de archivos.

Jorge Sanchez: Primer curso de administración de sistemas informaticos.
www.jorgesanchez.net.

Christian.garcia@unas.edu.pe



























No hay comentarios:

Publicar un comentario

Creación de un nodo de entrada en Java

Un nodo de entrada se utiliza para recibir un mensaje en un flujo de mensajes, normalmente de un origen no soportado por los nodos de entr...