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