Anda di halaman 1dari 10

PROGRAMACION DIGITAL II

UNIVERSIDAD NACIONAL DEL CALLAO

UNIVERSIDAD NACIONAL DEL


CALLAO
FACULTAD DE INGENIERIA ELECTRICA Y
ELECTRONICA
ESCUELA DE INGENIERIA ELECTRONICA

SEPARATA
7.- PROGRAMACIN JAVA :
ARCHIVOS
CURSO :
PROGRAMACION DIGITAL II
PROFESOR:
FERNANDO MENDOZA APAZA
AO : 2009

1
ING FERNANDO MENDOZA APAZA

PROGRAMACION DIGITAL II

UNIVERSIDAD NACIONAL DEL CALLAO

Ficheros
Una aplicacin Java puede escribir en un archivo, salvo que se haya restringido su acceso al
disco mediante polticas de seguridad. La dificultad de este tipo de operaciones est en que
los sistemas de ficheros son distintos en cada sistema y aunque Java intentar aislar la
configuracin especfica de un sistema, no consigue evitarlo del todo.

clase File
En el paquete java.io se encuentra la clase File pensada para poder realizar operaciones de
informacin sobre archivos. No proporciona mtodos de acceso a los archivos, sino
operaciones a nivel de sistema de archivos (listado de archivos, crear carpetas, borrar
ficheros, cambiar nombre,...).

construccin de objetos de archivo


Utiliza como nico argumento una cadena que representa una ruta en el sistema de archivo.
Tambin puede recibir, opcionalmente, un segundo parmetro con una ruta segunda que se
define a partir de la posicin de la primera.
File archivo1=new File(/datos/bd.txt);
File carpeta=new File(datos);
El primer formato utiliza una ruta absoluta y el segundo una ruta relativa. La ruta absoluta se
realiza desde la raz de la unidad de disco en la que se est trabajando y la relativa cuenta
desde la carpeta actual de trabajo.
Otra posibilidad de construccin es utilizar como primer parmetro un objeto File ya hecho.
A esto se aade un segundo parmetro que es una ruta que cuenta desde la posicin actual.
File carpeta1=new File(c:/datos);// c\\datos
File archivo1=new File(carpeta1,bd.txt);
Si el archivo o carpeta que se intenta examinar no existe, la clase File no devuelve una
excepcin. Habr que utilizar el mtodo exists. Este mtodo recibe true si la carpeta o
archivo es vlido (puede provocar excepciones SecurityException).
Tambin se puede construir un objeto File a partir de un objeto URL.

el problema de las rutas


Cuando se crean programas en Java hay que tener muy presente que no siempre sabremos
qu sistema operativo utilizar el usuario del programa. Esto provoca que la realizacin de
rutas sea problemtica porque la forma de denominar y recorrer rutas es distinta en cada
sistema operativo.
Por ejemplo en Windows se puede utilizar la barra / o la doble barra invertida \\ como
separador de carpetas, en muchos sistemas Unix slo es posible la primera opcin. En
general es mejor usar las clases Swing (como JFileDialog) para especificar rutas, ya que
son clases en las que la ruta de elige desde un cuadro y, sobre todo, son independientes de la
plataforma.
Tambin se pueden utilizar las variables estticas que posee File. Estas son:

2
ING FERNANDO MENDOZA APAZA

PROGRAMACION DIGITAL II

UNIVERSIDAD NACIONAL DEL CALLAO

Para poder garantizar que el separador usado es el del sistema en uso:


String ruta=documentos/manuales/2003/java.doc;
ruta=ruta.replace(/,File.separatorChar);
Normalmente no es necesaria esta comprobacin ya que Windows acepta tambin el
carcter / como separador.

mtodos generales

3
ING FERNANDO MENDOZA APAZA

PROGRAMACION DIGITAL II

UNIVERSIDAD NACIONAL DEL CALLAO

4
ING FERNANDO MENDOZA APAZA

PROGRAMACION DIGITAL II

UNIVERSIDAD NACIONAL DEL CALLAO

secuencias de archivo
lectura y escritura byte a byte
Para leer y escribir datos a archivos, Java utiliza dos clases especializadas que leen y escriben
orientando a byte (Vase tema anterior); son FileInputStream (para la lectura) y
FileOutputStream (para la Escritura).
Se crean objetos de este tipo construyendo con un parmetro que puede ser una ruta o un
objeto File:
FileInputStream fis=new FileInputStream(objetoFile);
FileInputStream fos=new FileInputStream(/textos/texto25.txt);
La construccin de objetos FileOutputStream se hace igual, pero adems se puede
indicar un segundo parmetro booleano que con valor true permite aadir ms datos al
archivo (normalmente al escribir se borra el contenido del archivo, valor false).
Estos constructores intentan abrir el archivo, generando una excepcin del tipo
FileNotFoundException si el archivo no existiera u ocurriera un error en la apertura.
Los mtodos de lectura y escritura de estas clases son los heredados de las clases
InputStream y OutputStream. Los mtodos read y write son los que permiten leer y
escribir. El mtodo read devuelve -1 en caso de llegar al final del archivo.
Otra posibilidad, ms interesante, es utilizar las clases DataInputStream y
DataOutputStream. Estas Clases est mucho ms preparadas para escribir datos de todo
tipo.

escritura
El proceso sera:
1> Crear un objeto FileOutputStream a partir de un objeto File que posee la ruta al
archivo que se desea escribir.
2> Crear un objeto DataOutputStream asociado al objeto anterior. Esto se realiza en la
construccin de este objeto.
3> Usar el objeto del punto 2 para escribir los datos mediante los mtodos writeTipo
donde tipo es el tipo de datos a escribir (Int, Double, ...). A este mtodo se le pasa como
nico argumento los datos a escribir.
4> Se cierra el archivo mediante el mtodo close del objeto DataOutputStream.
Ejemplo:

5
ING FERNANDO MENDOZA APAZA

PROGRAMACION DIGITAL II

lectura

UNIVERSIDAD NACIONAL DEL CALLAO

File f=new File("D:/prueba.out");


Random r=new Random();
double d=18.76353;
try{
FileOutputStream fis=new FileOutputStream(f);
DataOutputStream dos=new DataOutputStream(fis);
for (int i=0;i<234;i++){ //Se repite 233 veces
dos.writeDouble(r.nextDouble());//N aleatorio
}
dos.close();
}
catch(FileNotFoundException e){
System.out.println("No se encontro el archivo");
}
catch(IOException e){
System.out.println("Error al escribir");
}

El proceso es anlogo. Slo que hay que tener en cuenta que al leer se puede alcanzar el final
del archivo. Al llegar al final del archivo, se produce una excepcin del tipo EOFException
(que es subclase de IOException), por lo que habr que controlarla.
Ejemplo, leer los nmeros del ejemplo anterior :
boolean finArchivo=false;//Para bucle infinito
try{
FileInputStream fis=new FileInputStream(f);
DataInputStream dis=new DataInputStream(fis);
while (!finArchivo){
d=dis.readDouble();
System.out.println(d);
}
dis.close();
}
catch(EOFException e){
finArchivo=true;
}
catch(FileNotFoundException e){
System.out.println("No se encontro el archivo");
}
catch(IOException e){
System.out.println("Error al leer");
}
En este listado, obsrvese como el bucle while que da lugar a la lectura se ejecuta
indefinidamente (no se pone como condicin a secas true porque casi ningn compilador lo
acepta), se saldr de ese bucle cuando ocurra la excepcin EOFException que indicar el fin
de archivo.
Las clases DataStream son muy adecuadas para colocar datos binarios en los archivos.

lectura y escritura mediante caracteres


Como ocurra con la entrada estndar, se puede convertir un objeto FileInputStream o
FileOutputStream a forma de Reader o Writer mediante las clases
InputStreamReader y OutputStreamWriter.

6
ING FERNANDO MENDOZA APAZA

PROGRAMACION DIGITAL II

UNIVERSIDAD NACIONAL DEL CALLAO

Existen adems dos clases que manejan caracteres en lugar de bytes (lo que hace ms
cmodo su manejo), son FileWriter y FileReader.
La construccin de objetos del tipo FileReader se hace con un parmetro que puede ser un
objeto File o un String que representarn a un determinado archivo.
La construccin de objetos FileWriter se hace igual slo que se puede aadir un segundo
parmetro booleano que, en caso de valer true, indica que se abre el archivo para aadir
datos; en caso contrario se abrira para grabar desde cero (se borrara su contenido).
Para escribir se utiliza write que es un mtodo void que recibe como parmetro lo que se
desea escribir en formato int, String o array de caracteres. Para leer se utiliza el mtodo read
que devuelve un int y que puede recibir un array de caracteres en el que se almacenara lo que
se desea leer. Ambos mtodos pueden provocar excepciones de tipo IOException.
Ejemplo:
File f=new File("D:/archivo.txt");
int x=34;
try{
FileWriter fw=new FileWriter(f);
fw.write(x);
fw.close();
}
catch(IOException e){
System.out.println("error");
return;
}
//Lectura de los datos
try{
FileReader fr=new FileReader(f);
x=fr.read();
fr.close();
}
catch(FileNotFoundException e){
System.out.println("Error al abrir el archivo");
}
catch(IOException e){
System.out.println("Error al leer");
}
System.out.println(x);
En el ejemplo anterior, primero se utiliza un FileWrite llamado fw que escribe un valor
entero (aunque realmente slo se escribe el valor carcter, es decir slo valdran valores hasta
32767). La funcin close se encarga de cerrar el archivo tras haber ledo. La lectura se realiza
de forma anloga.
Otra forma de escribir datos (imprescindible en el caso de escribir texto) es utilizar las clases
BufferedReader y BufferedWriter vistas en el tema anterior. Su uso sera:
File f=new File("D:/texto.txt);
int x=105;
try{
FileReader fr=new FileReader(f);
BufferedReader br=new BufferedReader(fr);
String s;
do{
s=br.readLine();
System.out.println(s);
}while(s!=null);
}

7
ING FERNANDO MENDOZA APAZA

PROGRAMACION DIGITAL II

UNIVERSIDAD NACIONAL DEL CALLAO

catch(FileNotFoundException e){
System.out.println(Error al abrir el archivo);
}
catch(IOException e){
System.out.println(Error al leer");
}
En este caso el listado permite leer un archivo de texto llamado texto.txt. El fin de archivo
con la clase BufferedReader se detecta comparando con null, ya que en caso de que lo ledo
sea null, significar que hemos alcanzado el final del archivo. La gracia de usar esta clase est
en el mtodo readLine que agiliza enormemente la lectura.

RandomAccessFile
Esta clase permite leer archivos en forma aleatoria. Es decir, se permite leer cualquier
posicin del archivo en cualquier momento. Los archivos anteriores son llamados
secuenciales, se leen desde el primer byte hasta el ltimo.
Esta es una clase primitiva que implementa los interfaces DataInput y DataOutput y
sirve para leer y escribir datos.
La construccin requiere de una cadena que contenga una ruta vlida a un archivo o de un
archivo File. Hay un segundo parmetro obligatorio que se llama modo. El modo es una
cadena que puede contener una r (lectura), w (escritura) o ambas, rw.
Como ocurra en las clases anteriores, hay que capturar la excepcin FileNotFound
cuando se ejecuta el constructor.
File f=new File("D:/prueba.out");
RandomAccessFile archivo = new RandomAccessFile( f, "rw");
Los mtodos fundamentales son:

seek(long pos). Permite colocarse en una posicin concreta, contada en


bytes, en el archivo. Lo que se coloca es el puntero de acceso que es la seal que marca
la posicin a leer o escribir.

long getFilePointer(). Posicin actual del puntero de acceso

long length(). Devuelve el tamao del archivo readBoolean,


readByte, readChar, readInt, readDouble, readFloat, readUTF,
readLine. Funciones de lectura. Leen un dato del tipo indicado. En el caso de
readUTF lee una cadena en formato Unicode.

writeBoolean, writeByte, writeBytes, writeChar, writeChars


writeInt, writeDouble, writeFloat, writeUTF, writeLine. Funciones de
escritura.
Todas reciben como parmetro, el dato a escribir. Escribe encima de lo ya escrito.
Para escribir al final hay que colocar el puntero de acceso al final del archivo.

el administrador de seguridad
Llamado Security manager, es el encargado de prohibir que subprogramas y
aplicaciones escriban en cualquier lugar del sistema. Por eso numerosas acciones podran dar
lugar a excepciones del tipo SecurityException cuando no se permite escribir o leer en
un determinado sitio.

serializacin
Es una forma automtica de guardar y cargar el estado de un objeto. Se basa en la interfaz
serializable que es la que permite esta operacin. Si un objeto ejecuta esta interfaz puede
ser guardado y restaurado mediante una secuencia.

8
ING FERNANDO MENDOZA APAZA

PROGRAMACION DIGITAL II

UNIVERSIDAD NACIONAL DEL CALLAO

Cuando se desea utilizar un objeto para ser almacenado con esta tcnica, debe ser incluida la
instruccin
implements
Serializable
(adems
de
importar
la
clase
java.io.Serializable) en la cabecera de clase. Esta interfaz no posee mtodos, pero es un
requisito obligatorio para hacer que el objeto sea serializable.
La clase ObjectInputStream y la clase ObjectOutputStream se encargan de realizar
este procesos. Son las encargadas de escribir o leer el objeto de un archivo. Son herederas de
InputStream
y
OutputStream,
de
hecho
son
casi
iguales
a
DataInput/OutputStream slo que incorporan los mtodos readObject y
writeObject que son muy poderosos. Ejemplo:
try{
FileInputStream fos=new FileInputStream("d:/nuevo.out");
ObjectInputStream os=new ObjectInputStream(fos);
Coche c;
boolean finalArchivo=false;
while(!finalArchivo){
c=(Coche) readObject();
System.out.println(c);
}
}
catch(EOFException e){
System.out.println("Se alcanz el final");
}
catch(ClassNotFoundException e){
System.out.println("Error el tipo de objeto no es compatible");
}
catch(FileNotFoundException e){
System.out.println("No se encontr el archivo");
}
catch(IOException e){
System.out.println("Error "+e.getMessage());
e.printStackTrace();
El listado anterior podra ser el cdigo de lectura de un archivo que guarda coches. Los
mtodos readObject y writeObject usan objetos de tipo Object, readObject les devuelve
y writeObject les recibe como parmetro. Ambos mtodos lanzan excepciones del tipo
IOException
y
readObject
adems
lanza
excepciones
del
tipo
ClassNotFoundException.
Obsrvese en el ejemplo como la excepcin EOFException ocurre cuando se alcanz el
final del archivo.

9
ING FERNANDO MENDOZA APAZA

PROGRAMACION DIGITAL II

UNIVERSIDAD NACIONAL DEL CALLAO

10
ING FERNANDO MENDOZA APAZA

Anda mungkin juga menyukai