Вы находитесь на странице: 1из 10

JAVA

TRATAMIENTO DE FICHEROS
Para trabajar con archivos binarios, podemos usar Streams Data, tanto de entrada como de salida. Lo que hacen estos Streams es filtrar Streams bytes y permiten que los distintos tipos primitivos que puedan ser escritos o le dos directamente desde el Stream. Se crean con el constructor Data!nputStream, al que pasamos como ar"umento un !nputStream. DataInputStream (InputStream) #l ar"umento tiene que ser un ar"umento de entrada que e$ista, como puede ser un Stream!nput%uffered o Stream!nput&ile. 'n Stream de salida requiere el constructor Data(utputStream )(utputStream*. #l ar"umento (utputStream indica el Stream de salida asociado al Stream de datos. DataOutputStream (OutputStream) Los m+todos de lectura y escritura que se aplican a los Stream Data, tanto !nput como (utput. read%oolean)*, read%yte)*, readDouble)*, read&loat)*, read!nt)*, readLon")*, readShort)*, ,rite%oolean)boolean* ,rite%yte)byte* ,riteDouble)double* ,rite&loat)float* ,rite!nt)int* ,riteLon")lon"* ,riteShort)short*

-odos si"uen un mismo sistema. la palabra read se"uida por el tipo de dato o ,rite se"uida del tipo y con el ar"umento del tipo de dato que se trate en este caso. /ada m+todo input nos devuelve el tipo de dato indicado. as read&loat)* nos devuelve un dato tipo float. A diferencia de lo que pasaba con los datos tipo byte, cuando lle"an al final de la lectura en los datos representados por read en lu"ar de devolvernos 01 como en los binarios, aqu nos devuelve la e$cepci2n #(&. )#(&#$ception* que capturaremos con un bloque try0catch. Aqu asociamos la declaraci2n catch al objeto IOE ception. Lue"o llamamos a close)* y cerramos el Stream. )ver proyecto 3et%eans 3umerosPrimos&icheros*. Java utili4a Strin"s para tratar con te$tos. /uando hablamos de Streams hacemos referencia a los caracteres porque hablamos de transferencia de entradas y salidas en bytes. 'n byte puede ser un car5cter, pero nunca un strin" de caracteres. Lo Streams car5cter son usados para trabajar con
!"!

-ratamiento de ficheros

cualquier te$to representado por c2di"o AS/!! o '3!/(D#. /on un Stream car5cter podemos trabajar con archivos de te$to plano )t$t*, html, de c2di"o fuente. Las clases usadas para leer o escribir estos Streams son subclases de 6eader o de 7riter, que deben ser usados por todas las entradas de te$to en lu"ar de tratar directamente con Streams bytes.

#EER ARCHI$OS DE TE%TO DESDE &NA A'#ICACI(N )A$A


La clase principal que se usa para esto es la clase principal &ile6eader para poder leer Streams car5cter desde un archivo. La clase &ile6eader hereda de !nputStream6eader. Lo que hace esta clase es leer un Stream byte y convierte los bytes en valores inte"er que representar los distintos caracteres '3!/(D#. #l proceso es bastante similar en todos los Streams, independientemente del tipo de datos con el que estemos trabajando. /uando trabajamos con un Stream !nput de entrada car5cter tenemos que asociarlo con un archivo usando el constructor &ile6eader)Strin"*. #l ar"umento Strin" que le pasamos en el constructor indica el archivo que vamos a utili4ar como referencia y tambi+n puede contener la ruta donde se encuentra el archivo. /on la declaraci2n Fi*eRea+er *ector,ne- Fi*eRea+er(.in+ice/t t0)1 creamos un nuevo &ile6eader al que llamamos lector y lo asociamos a un archivo de te$to, en este caso ndice.t$t. 'na ve4 hecho esto, podemos llamar a sus m+todos para leer caracteres de ese archivo. 8stos son. rea+() rea+(char234 int4 int) #l m+todo read)* nos devuelve el si"uiente car5cter dentro del Stream como un entero que representa a un car5cter en concreto. Al m+todo read le pasamos tres ar"umentos )char, int, int*. #l char es una array con caracteres y los int representan los puntos de inicio y el n9mero de caracteres que tiene que leer. #n caso que no pueda leer nin"9n car5cter nos devuelve 01 como los m+todos de caracteres de entrada de bytes. Fi*eRea+er te to,ne- Fi*eRea+er(.in+ice/t t0)1 55se car6a e* 7ichero +e te to/ int in89te1 +o: in89te,te to/rea+()1 55E* m;to+o rea+ +evue*ve un entero/ i7(in89te<,!") S9stem/out/print((char)in89te)155Convertimos e* entero con un cast en car=cter 55antes +e mostrar*o/ >-hi*e(in89te<,!")1 55Cuan+o *ee !" in+ica ?ue acaba *a *ectura/ S9stem/out/print*n(.0)1 te to/c*ose()1 Para leerlo car5cter a car5cter lo hacemos con la clase %uffered6eader, que lee un car5cter
!@!

JAVA

!nutStream y lo almacena en el buffer para una mayor eficiencia en el trabajo. Para crear una versi2n %uffered debemos tener ya un objeto 6eader de al"9n tipo. /on %uffered podemos usar los si"uientes constructores. 8u77ere+Rea+er(Rea+er) #l objeto 6eader lo especificamos en el ar"umento. /rea un buffer de Stream de caracteres que est+ asociado con el objeto 6eader que especificamos en el ar"umento. 8u77ere+Rea+er(Rea+er4 int) -ambi+n crea un buffer de Stream de caracteres que est+ asociado con el objeto 6eader que especificamos como primer ar"umento. /omo se"undo ar"umento le indicamos el tama:o que va a tener el buffer con un inte"er. Podemos usar los si"uientes m+todos. rea+() rea+(char234 int4 int) #stos m+todos funcionan e$actamente i"ual que los que vimos con &ile6eader. Adem5s podemos leer una l nea de te$to usando el m+todo rea+#ine()/ #ste m+todo devuelve un objeto Strin" que contiene la si"uiente l nea de te$to dentro del Strin". 3o incluye el car5cter o caracteres que representan el final de una l nea. #l valor que se devuelve al final de la l nea es nu**. #l final de la l nea lo indican los caracteres ABnA o ABrA )nueva l nea o retorno de carro* )ver proyecto 3et%eans Leer&uente&icheros*.

ESCRIT&RA DE ARCHI$OS DE TE%TO


La clase principal que se usa para esto es la clase principal &ile7riter. #s subclase de (utputStream7riter, que es la encar"ada de convertir caracteres 'nicode a bytes. Los constructores con los que cuenta son. Fi*eCriter(Strin6) Fi*eCriter(Strin64 boo*ean) #l Strin" indica el nombre del archivo al que vamos a diri"ir el Strin" de caracteres. Puede incluir una ruta al directorio como en los casos anteriores. Si el archivo es para ser a:adido al ya e$istente, el valor boolean ser5 true. As a:adiremos te$to a un archivo, en lu"ar de sobreescribirlo. ;ay que tener cuidado de no borrar el contenido del archivo e$istente, como en otros archivos de escritura, o saber que lo vamos a hacer, si es lo que queremos. Los m+todos ser5n.
!D!

-ratamiento de ficheros

-rite(int) A este m+todo ,rite le pasamos un inte"er que escribe un 9nico car5cter. -rite(char234 int4 int) #ste m+todo se le pasa un array de caracteres y los n9meros inte"er. #scribe los caracteres de ese array, especificando con los inte"er el punto de inicio y la cantidad de caracteres a escribir. -rite(Strin64 int4 int) A este m+todo se le pasa un Strin" y se le especifica el punto de inicio y el n9mero de caracteres con los inte"er. #ste ejemplo escribe las letras del alfabeto en el archivo especificado. Fi*eCriter *etras , ne- Fi*eCriter(.a*7abeto/t t0)155a* constructor se *e pasa e* archivo 55+on+e se va a escribir *a in7ormaciEn/ 7or(int i,FG1 iHI"1 iJJ)55recuperamos *os va*ores int correspon+ientes a *as *etras +e* 55a*7abeto/ *etras/-rite((char)i)155con un cast convertimos *os int en char/ *etras/c*ose()1 55cerramos e* obKeto *etras/ La clase %uffered7riter la podemos utili4ar para escribir un Stream de caracteres que "uardamos en un buffer. Los objetos de esta clase se crean con los constructores si"uientes. 8u77ere+Criter(Criter) 8u77ere+Criter(Criter4 int) #l ar"umento ,riter puede ser cualquiera de las clases Stream car5cter de salida como &ile7riter. #l se"undo ar"umento, opcional, es un entero que indica el tama:o del buffer. Los m+todos de salida son. -rite(int) -rite(char234 int4 int) -rite(Strin64 int4 int) ne-#ine() Los tres primeros funcionan i"ual que los correspondientes en los m+todos read)*. #l m+todo ne,Line)* env a el car5cter o caracteres que indican el final de una l nea. el eol. #sto es importante porque se"9n el sistema operativo que estemos utili4ando, los caracteres de l nea
!L!

JAVA

nueva o retorno de carro pueden variar. Por esto, en lu"ar de usar <=n< para nueva l nea, podemos utili4ar ne,Line)* que env a en cada caso, dependiendo del sistema operativo, el car5cter necesario. ;asta ahora pasamos un Strin" con el nombre del archivo o la ruta para referirnos al archivo donde se iba a escribir la informaci2n o de donde se iba a leer. Sin embar"o, si lo que queremos es copiar archivos, renombrarlos o manejar otro tipo de tareas, puede que ser necesario tener que usar otro tipo de objeto. el objeto Fi*e. La clase &ile es una herramienta para obtener informaci2n acerca de los archivos. >?u+ tipo de informaci2n@ si es de solo lectura, si se puede modificar, su tama:o, su nombre, su carpeta, la fecha de su 9ltima modificaci2n, si es que e$iste, entre otros datos. -ambi+n permite crear o borrar archivos, pero no sirve para escribir o leer. &ile forma parte del paquete java.io y representa un archivo o un directorio de referencia. Los constructores con los que cuenta son. Fi*e(Strin6) Fi*e(Strin64 Strin6) Fi*e(Fi*e4 Strin6) Se le pasa un Strin" y crea un objeto &ile en el directorio especificado. 3o se le pasa nombre de archivo, sino que se hace referencia al directorio al que queremos hacer referencia. #n el se"undo caso, s se le pasa el nombre del archivo especificado en el se"undo Strin". #n el tercer constructor, el primer ar"umento, &ile, es un objeto &ile con la ruta representada por el archivo especificado. #l se"undo ar"umento es un Strin" donde se le especifica su nombre. Los m+todos m5s importantes con los que cuenta son los si"uientes. e ists() 3os devuelve un valor booleno indicando el archivo e$iste con el nombre y la ruta que le pasamos como ar"umento. Devuelve true si e$iste y false si no e$iste o no est5 en esa ruta. *en6th() Si el archivo e$iste, podemos utili4ar el m+todo len"th)* que nos devuelve un inte"er indicando el tama:o del archivo en bytes. ranameTo(Fi*e) 6enombra el archivo al nombre que se especifica en el ar"umento &ile. Devuelve un valor booleano indicando si la operaci2n se hi4o correctamente o no. +e*ete() +e*eteOnE it() %orra un archivo o un directorio. #l primero inmediatamente y el se"undo espera a intentar borrarlo cuando el resto del pro"rama ha terminado de ejecutarse. #l primero devuelve un valor booleano indicando que la operaci2n se llev2 a cabo con +$ito o no, mientras que el se"undo no devuelve nada, puesto que la aplicaci2n ya se cerr2. MetName() 6et'ath()

!G!

-ratamiento de ficheros

Devuelven Strin"s conteniendo el nombre y la ruta del archivo. mN+ir() /rea el directorio especificado por el objeto &ile que es llamado. Devuelve un valor booleano indicando si se ha llevado a cabo o no con +$ito la operaci2n. isDirector9() Devuelve un valor booleno true cuando el objeto &ile es un directorio y false cuando no lo es. *istFi*es() Devuelve un array de objetos &ile que representan los contenidos del directorio, tanto los archivos como los subdirectorios. 3o contamos con un m+todo de deshacer un borrado, por lo que hay que tener mucho cuidado al utili4ar el m+todo delete. #stos m+todos lan4an la e$cepci2n securit9E ception si el pro"rama no tiene la se"uridad de ejecutar la operaci2n del archivo en cuesti2n. /omo ejemplo de todo lo e$plicado para los archivos, crearemos una aplicaci2n que lea un archivo y convierta todos sus caracteres a may9sculas. Se crear5 un archivo temporal que almacenar5 en un buffer por medio de un Stream(utput%uffered. Se utili4ar5n objetos &ile para indicarnos los archivos que necesitamos y permitir crear uno y eliminar otro, as como poder renombrar y modificar archivos cuando sea necesario.

!F!

JAVA

FICHEROS A#EATORIOS
La clase RandomAccessFile permite utili4ar un fichero de acceso aleatorio en el que el pro"ramador define el formato de los re"istros y acceder al fichero como si fuera una base de datos, donde se accede a un re"istro concreto del fichero.
RandomAccessFile objFile = new RandomAccessFile( ruta, modo );

Donde ruta es la direcci2n f sica en el sistema de archivos y modo puede ser. ArA para s2lo lectura. Ar,A para lectura y escritura. La clase RandomAccessFile implementa los interfaces DataInput y DataOutput. Para abrir un archivo en modo lectura har amos.
RandomAccessFile in = new RandomAccessFile(input.dat , r );

Para abrirlo en modo lectura y escritura.


RandomAccessFile inOut = new RandomAccessFile(input.dat , rw );

#sta clase permite leer y escribir sobre el fichero, no se necesitan dos clases diferentes. ;ay que especificar el modo de acceso al construir un objeto de esta clase. s2lo lectura o lecturaBescritura. Dispone de m+todos espec ficos de despla4amiento como see! y s!ip"#tes para poder moverse de un re"istro a otro del fichero, o posicionarse directamente en una posici2n concreta del fichero. 3o est5 basada en el concepto de flujos o streams. #$isten dos constructores que permiten abrir un fichero aleatorio. Cediante el nombre del fichero. miFichero,ne- Ran+omAccessFi*e (Strin6 nombre4 Strin6 mo+o) Cediante un objeto. miFichero,ne- Ran+omAccessFi*e (Fi*e 7ichero4 Strin6 mo+o) #l par5metro modo determina si se tiene acceso de s2lo lectura ) r * o bien de lectura y escritura ) r, *. Por ejemplo, se puede abrir un fichero para lectura de la si"uiente manera. Ran+omAccessFi*e miraFi*e,ne- Ran+omAccessFi*e (.5usr5bin5pepe/t t4 .r-0)1 /on un objeto 6andomAccess&ile se tiene acceso a todas las operaciones read)* y ,rite)* de las clases DataInputStream y DataOutputStream. #ntre otros, est5n disponibles los si"uientes m+todos para ubicarse dentro de un fichero. *on6 6etFi*e'ointer() Devuelve la posici2n actual del puntero del fichero.

!O!

-ratamiento de ficheros

voi+ seeN(*on6 pos) Sit9a el puntero del fichero en una posici2n determinada. La posici2n se da como despla4amiento en bytes desde el comien4o del fichero. La posici2n D marca el comien4o de ese fichero. *on6 *en6th() Devuelve la lon"itud del fichero. La posici2n len"th)* marca el final de ese fichero. int sNip89tes(int +esp*aPamiento) Despla4a el puntero desde la posici2n actual, el n9mero de bytes indicado por despla4amiento. voi+ c*ose() /ierra el archivo de acceso aleatorio y libera todos los recursos del sistema asociados con este archivo. boo*ean rea+8oo*ean() Lee un dato bolean de este archivo. char rea+Char() Lee un caracter unicode de este archivo )una letra*. +oub*e rea+Doub*e() Lee un double de ese archivo. int rea+Int() Lee un entero de este archivo. Strin6 rea+&TF() Lee una cadena de este archivo. voi+ -rite8oo*ean(boo*ean v) #scribe un valor bolean. voi+ -riteChar(int v) #scribe un car5cter. voi+ -riteChars(Strin6 s) #scribe una serie de caracteres. voi+ -riteDoub*e(+oub*e v) #scribe un double voi+ -riteInt(int v) #scribe un int. voi+ -rite&TF(Strin6 str) #scribe una cadena. s/trim() #limina los espacios al principio y al final de la cadena )cadena s en este caso*.

!Q!

JAVA

/on los ficheros de acceso aleatorio se puede a:adir informaci2n a un fichero aleatorio e$istente. Para ir al final del fichero har amos lo si"uiente. miFR,ne- Ran+omAccessFi*e (.CRBBa*eatoriosBprueba/+at04 .r-0)1 miFR/seeN(miFR *en6th())1 Los ficheros de acceso aleatorio o directo permiten situar el puntero del fichero en una posici2n determinada sin tener que recorrer previamente el contenido del fichero como ocurre con los ficheros de acceso secuencial vistos anteriormente. Para trabajar con ficheros aleatorios, 9nicamente es necesaria la clase 6andomAccess&ile, que proporciona directamente )no heredados* todos los m+todos para leer y escribir datos del fichero )los indicados en las interfaces Data!nput y Data(utput*. #l si"uiente pro"rama solicita que le sea proporcionado el nombre de un fichero. Despu+s pre"unta el byte a modificar, muestra su valor y solicita el nuevo valor. #ste proceso se repite hasta pulsar EF )final de fichero*. A la hora de modificar un byte en el fichero de acceso directo, hay que tener en cuenta que primero se lee el byte mediante read%yte)*. #ste m+todo, adem5s de reali4ar la lectura, avan4a el puntero de fichero un byte adelante, por lo que antes de reali4ar la escritura con ,rite%yte)*, habr5 que retrocederlo 1 byte. -ambi+n puede reali4arse este proceso de la forma en que se ha hecho en el ejemploG "uardando la posici2n del puntero del fichero mediante "et&ilePointer)* antes de reali4ar la lectura y restaur5ndolo mediante seeH)* antes de escribir )ver proyecto 3et%eans Aleatorio*. (tro buen ejemplo de archivo aleatorio es IProbandoAleatorioJ. TamaSo +e campos /har 0 K bytes !nt 0 L bytes Strin" 0 tama:o del Strin" M K bytes Double 0 N bytes %oolean 0 1 byte

M;to+os +e acceso a) M;to+o mapeo +irecto /uando la clave O numero de re"istro. #jemplos para posicionar en el re"istro -amre"M)clave 01* -amre"Mclave Ptamre" b) Meto+o +e* resi+uo )/laveQdivisor*R1
!I!

-ratamiento de ficheros

#l divisor es un numero primo inmediatamente menor o mayor al total de re"istros del archivo. #l residuo es el numero hash buscado.

! "T !

Вам также может понравиться