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

TEMA6

INDICE
1.Introduccin.......................................................................................................................................4
1.1.Excepciones. ................................................................................................................................................4

2.Conceptodeflujo............................................................................................................................... 6
Sockets.............................................................................................................................................................................. 6
Quesunsocket?..............................................................................................................................................................................6 Tiposdesocket..................................................................................................................................................................................6 ClaseSocket.......................................................................................................................................................................................7 ServiciosdelaclaseSocket................................................................................................................................................................7 ClaseServerSocket.............................................................................................................................................................................7 ServiciosdelaclaseServerSocket......................................................................................................................................................7 Comunicacinentreclienteservidor.................................................................................................................................................8 ClaseDatagramSocket.......................................................................................................................................................................8 ServiciosdelaclaseDatagramSocket................................................................................................................................................8 ClaseDatagramPacket.......................................................................................................................................................................8

Threads.............................................................................................................................................................................. 9
Quesunthread?............................................................................................................................................................................9 Quganamos?.................................................................................................................................................................................9 AtributosdeunthreadenJAVA .........................................................................................................................................................9 ClaseThread......................................................................................................................................................................................9 ServiciosdelaclaseThread.............................................................................................................................................................10 EstadosdeunThread......................................................................................................................................................................10 Sincronizacin..................................................................................................................................................................................10

Ejemplo:Unchat.............................................................................................................................................................. 11
Servidor.java....................................................................................................................................................................................11 Flujo.java.........................................................................................................................................................................................11 Cliente.java......................................................................................................................................................................................12

3.Clasesrelativasaflujos.................................................................................................................... 14
3.1.Ejemplocomentadodeunaclaseconflujos. ............................................................................................ 15

4.Flujos................................................................................................................................................16
4.1.Flujospredefinidos.Entradaysalidaestndar......................................................................................... 16 4.2.Flujospredefinidos.Entradaysalidaestndar.Ejemplo..........................................................................17 4.3.Flujosbasadosenbytes............................................................................................................................ 18 4.4.Flujosbasadosencaracteres.................................................................................................................... 19 4.5.Rutasdelosficheros.................................................................................................................................20

5.Trabajandoconficheros................................................................................................................... 21
5.1.Escrituraylecturadeinformacinenficheros......................................................................................... 21 5.2.Ficherosbinariosyficherosdetexto(I).................................................................................................... 22
5.2.1.Ficherosbinariosyficherosdetexto(II).............................................................................................................. 23

5.3.Modosdeacceso.Registros. ..................................................................................................................... 25 5.4.Accesosecuencial.....................................................................................................................................25 5.5.Accesoaleatorio. .......................................................................................................................................27

6.Aplicacionesdelalmacenamientodeinformacinenficheros.......................................................29 7.Utilizacindelossistemasdeficheros............................................................................................ 30
7.1.ClaseFile...................................................................................................................................................30 7.2.InterfaceFilenameFilter............................................................................................................................ 31 7.3.Creacinyeliminacindeficherosydirectorios...................................................................................... 32

8.Almacenamientodeobjetosenficheros.Persistencia.Serializacin..............................................34
8.1.Serializacin:utilidad................................................................................................................................ 34

Almacenandodatos

DAW

DesarrollodeAplicacionesWeb

Tema6

Almacenandodatos.
Caso prctico Ada est repasando los requisitos de la aplicacin informtica que estn desarrollando para la clnica veterinaria. En particular, ahora mismo se est centrando en estudiar las necesidades respecto al almacenamiento de datos. Ada piensa que hay ciertas partes de la aplicacin que no necesitan una base de datos para guardar los datos, y sera suficiente con emplear ficheros. Por ejemplo, para guardar datos de configuracin de la aplicacin. Tras repasar, se rene con Mara y Juan para planificar adecuadamente el tema de los ficheros que van a usar en la aplicacin, ya que es un asunto muy importante, que no deben dejar aparcado por ms tiempo. Precisamente Antonio, que cada vez est ms entusiasmado con la idea de estudiar algn ciclo, de momento, est matriculado y cursando el mdulo de Programacin, y est repasando para el examen que tiene la semana que viene, uno de los temas que le "cae" es precisamente el de almacenamiento de informacin en ficheros.

Almacenandodatos

DAW

1.Introduccin.
Cuandodesarrollasprogramas,enlamayoradeelloslosusuariospueden pedirlealaaplicacinque realice cosas y pueda suministrarle datos con los que se quiere hacer algo. Una vez introducidos los datos y las rdenes, se espera que el programa manipule de alguna forma esos datos, para proporcionarunarespuestaalosolicitado. Adems, normalmente interesa que el programa guarde los datos que se le han introducido, de forma que si el programa termina, los datos no se pierdan y puedan ser recuperados en una sesin posterior. La forma ms normal de hacer esto es mediante la utilizacin de ficheros, que se guardarnenundispositivodememorianovoltil(normalmenteundisco). Portanto,sabemosqueelalmacenamientoenvariablesovectores(arrays)estemporal,losdatosse pierden en las variables cuando estn fuera de su mbito o cuando el programa termina. Las computadoras utilizan ficheros para guardar los datos, incluso despus de que el programa termine su ejecucin. Se suele denominar a los datos que se guardan en ficheros datos persistentes, porque existen, persisten ms all de la ejecucin de la aplicacin. Los ordenadores almacenan los ficheros en unidades de almacenamiento secundario como discos duros, discos pticos, etc. En esta unidad veremoscmohacerconJavaestasoperacionesdecrear,actualizaryprocesarficheros. A todas estas operaciones, que constituyen un flujo de informacin del programa con el exterior, se lesconocecomoEntrada/Salida(E/S). Distinguimos dos tipos de E/S: la E/S estndar que se realiza con el terminal del usuario y la E/S a travsdeficheros,enlaquesetrabajaconficherosdedisco. Todas las operaciones de E/S en Java vienen proporcionadas por el paquete estndar del API de Java denominado java.io que incorpora interfaces, clases y excepciones para acceder a todo tipo de ficheros. El contenido de un archivo puede interpretarse como campos y registros (grupos de campos), dndoleunsignificadoalconjuntodebitsqueenrealidadposee.

Parasaberms A continuacin puedes ampliar tus conocimientos sobre Entrada y Salida en general, en el mundodelainformtica.Versqueesunbastotemaloqueabarca.
EntradaySalida. http://exa.unne.edu.ar/depar/areas/informatica/SistemasOperativos/SO5.htm

1.1.Excepciones.
Cuando se trabaja con archivos, es normal que pueda haber errores, por ejemplo: podramos intentar leer un archivo que no existe, o podramos intentar escribir en un archivo para el que no tenemos permisos de escritura. Para manejar todos estos errores debemos utilizar excepciones. Las dosexcepcionesmscomunesalmanejararchivosson: FileNotFoundException:Sinosepuedeencontrarelarchivo. IOException:Sinosetienenpermisosdelecturaoescrituraosielarchivoestdaado. Un esquema bsico de uso de la captura y tratamiento de excepciones en un programa, podra ser este,importandoelpaquetejava.io.IOException:
importjava.io.IOException; // ... public static void main(String[] args) {

DesarrollodeAplicacionesWeb

Tema6

try { // Se ejecuta algo que puede producir una excepcin } catch (FileNotFoundException e) { // manejo de una excepcin por no encontrar un archivo } catch (IOException e) { // manejo de una excepcin de entrada/salida } catch (Exception e) { // manejo de una excepcin cualquiera } finally { // cdigo a ejecutar haya o no excepcin } }

Seala la opcin correcta: Java no ofrece soporte para excepciones. Un campo y un archivo es lo mismo. Si se intenta abrir un archivo que no existe, entonces saltar una excepcin. Ninguna es correcta.

En el siguiente enlace hay un manual muy interesante de Java. Puedes consultar desde el ndice,msinformacinsobrelasexcepcionesenJava. ExcepcionesenJava.http://www.webtaller.com/manual-java/indice_manual_java.php

Almacenandodatos

DAW

2.Conceptodeflujo.
Caso prctico Antonio est estudiando un poco antes de irse a dormir. Se ha tomado un vaso de leche con cacao y est repasando el concepto de flujo. Entenderlo al principio, cuando lo estudi por primera vez, le cost un poco, pero ya lo entiende a la perfeccin y piensa que si le sale alguna pregunta en el examen de la semana que viene, sobre esto, seguro que la va a acertar.

LaclaseStreamrepresentaunflujoocorrientededatos, es decir, un conjunto secuencial de bytes, como puede ser un archivo, un dispositivo de entrada/salida (en adelante E/S), memoria, un conector TCP/IP (Protocolo deControldeTransmisin/ProtocolodeInternet),etc. Cualquier programa realizado en Java que necesite llevar a cabo una operacin de entrada salida lo har a travs deunstream. Un flujo es una abstraccin de aquello que produzca o consumainformacin.Esunaentidadlgica. Las clases y mtodos de E/S que necesitamos emplear son las mismas independientemente del dispositivo con el que estemos actuando, luego, el ncleo de Java, sabr si tiene que tratar con el teclado, el monitor, un sistema de archivos o un socket de red liberando al programador de tener quesaberconquinestinteractuando. LavinculacindeunflujoaldispositivofsicolahaceelsistemadeentradaysalidadeJava. En resumen, ser el flujo el que tenga que comunicarse con el sistema operativo concreto y "entendrselas" con l. De esta manera, no tenemos que cambiar absolutamente nada en nuestra aplicacin, que va a ser independiente tanto de los dispositivos fsicos de almacenamiento como del sistema operativo sobre el que se ejecuta. Esto es primordial en un lenguaje multiplataforma y tan altamenteportablecomoJava.

Seala la opcin correcta: La clase Stream puede representar, al instanciarse, a un archivo. Si programamos en Java, hay que tener en cuenta el sistema operativo cuando tratemos con flujos, pues vara su tratamiento debido a la diferencia de plataformas. La clase keyboard es la clase a utilizar al leer flujos de teclado. La vinculacin de un flujo al dispositivo fsico la hace el hardware de la mquina. Parasaberms EnlasiguientepresentacinpuedesaprendermssobresocketsenJava. Sockets
Quesunsocket? Definicin: Un socket es un punto final de un enlace de comunicacin de dos vas entre dos programasqueseejecutanatravsdelared. Elclienteyelservidordebenponersedeacuerdosobreelprotocoloqueutilizarn. Tiposdesocket Haydostiposdesocket: Orientadoaconexin:

DesarrollodeAplicacionesWeb

Tema6

Establece un camino virtual entre servidor y cliente, fiable, sin prdidas de informacin ni duplicados,lainformacinllegaenelmismoordenqueseenva. Elclienteabreunasesinenelservidoryesteguardaunestadodelcliente. ElclienteutilizalaclaseSocket ElservidorutilizalaclaseServerSocket Noorientadoaconexin: Envo de datagramas de tamao fijo. No es fiable, puede haber prdidas de informacin y duplicados,ylainformacinpuedellegarendistintoordendelqueseenva. Noseguardaningnestadodelcliente enelservidor,porello,esmstoleranteafallosdel sistema. TantoelclientecomoelservidorutilizanlaclaseDatagramSocket. Todasestasclases(Socket,ServerSocketyDatagramSocket)seencuentranenelpaquetejava.net ClaseSocket Constructores: publicSocket() publicSocket(InetAddressaddress,intport) publicSocket(Stringhost,intport) publicSocket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort) publicSocket(Stringhost,intport,InetAddresslocalAddr,intlocalPort) address/localAddr:direccinIPdelamquinaremota/local. port/localPort:puertodelamquinaremota/local. host:nombredelamquinaremota Enelcasodelprimerconstructorcreaunsocketsinconexin. ServiciosdelaclaseSocket publicInetAddressgetInetAddress(): DevuelveladireccinIPdelamquinaenlaqueestamosconectados. publicintgetPort(): Devuelveelpuertodelamquinaremota. publicvoidclose() Cierraelcanaldecomunicacin. publicInputStreamgetInputStream(): Devuelveelcanaldelecturadelsocket. publicOutputStreamgetOutputStream(): Devuelveelcanaldeescrituradelsocket. Ademas JAVA proporciona dos llamadas para saber la @IP y puerto local (getLocalAddress() y getLocalPort()) ClaseServerSocket Constructores: publicServerSocket(intport) publicServerSocket(intport,intbacklog) publicServerSocket(intport,intbacklog,InetAddressbindAddr) port:puertodelamquinaservidora. backlog:tamaodelacoladeespera,enelprimeroes50. bindAddr:direccinIPlocalqueseharpblicamedianteelbind. ElconstructorServerSocketseencargadehacerelbindyellisten. ServiciosdelaclaseServerSocket publicSocketaccept():

Almacenandodatos

DAW

Devuelve el socket resultado de aceptar una peticin, para llevar a cabo la comunicacin conelcliente. publicvoidclose() Cierraelcanaldecomunicacin. publicInetAddressgetInetAddress(): DevuelveladireccinIPdelamquinalocal. publicintgetLocalPort(): Devuelveelpuertodelamquinalocal. Comunicacinentreclienteservidor Para la transmisin de datos entre cliente y servidor se utilizarn las clases DataInputStream (recibirdatos)yDataOutputStream(enviardatos) Estasclasesdisponendemtodosparaleeryescribirdatosenelsocket: read/writeBoolean read/writeChar read/writeDouble,read/writeFloat,read/writeInt,read/writeLong,read/writeShort read/writeUTF(leer/escribircadenasdecaracteres) Paraenviarlosdatosseutilizaelmtodoflush()delaclaseDataOutputStream. ClaseDatagramSocket Constructores: publicDatagramSocket() publicDatagramSocket(intport) publicDatagramSocket(intport,InetAddressladdr) port:puertodelamquina. laddr:direccinIPlocalqueseharpblicamedianteelbind. ElconstructorDatagramSocketseencargadehacerelbind. Elprimerconstructorcogeunpuertolibre. ServiciosdelaclaseDatagramSocket publicvoidconnect(InetAddressaddress,intport): Conectaelsocketalamquinaremotaconla@IPaddressypuertoport. publicvoidclose() Cierraelcanaldecomunicacin. publicvoiddisconnect(): Desconectaelsocket. publicInetAddressgetInetAddress(): Devuelvela@IPdelamquinaremota. publicintgetPort(): Devuelveelpuertodelamquinaremota. Tambinhaydosllamadasparasaberla@IPypuertolocal(getLocalAddress()ygetLocalPort()). publicvoidsend(DatagramPacketp): Envaundatagramaalamquinaremota,porelsocketasociado. publicvoidreceive(DatagramPacketp): Recibeundatagramadeotramquina,porelsocketasociado. ClaseDatagramPacket Constructores: publicDatagramPacket(byte[]buff,intlength) Construye un DatagramPacket para recibir paquetes en el buffer buff, de longitud length

DesarrollodeAplicacionesWeb

Tema6

publicDatagramPacket(byte[]buff,intlength,InetAddressaddress,intport) Construye un DatagramPacket para envar paquetes con datos del buffer buff, de longitudlength,ala@IPaddressyelpuertoport. Servicios: Para la actualizacin y consulta de los diferentes campos de un DatagramPacket disponemos de los siguientes mtodos: set/getAddress, set/getData, set/getLength, set/getPort

Threads
Quesunthread? Definicin:Unthreadesunflujosecuencialdecontroldentrodeunprograma. Estdefinidoporuncontadordeprograma(PC)yunpunteroalapila(SP) Unthreadnopuedeejecutarseporsmismo,hadehacerlodentrodeunprograma. Todoslosthreadsdeunprocesocompartenlosrecursos(Ej:canalesE/S,memoria,...) Quganamos? Conseguimosconcurrenciaentreprocesosytambindentrodeunmismoproceso. Tambinpodemosconseguirparalelismosidisponemosdeunaarquitecturamultiprocesador. El cambio de contexto entre threads no es tan costoso al sistema como el cambio de contexto entreprocesos. AtributosdeunthreadenJAVA Unthreadtiene: Nombre Prioridad Hadeseguirlasiguienterelacin: MIN_PRIORITY<=Prioridad<=MAX_PRIORITY LaprioridadpordefectoesNORM_PRIORITY Valores: MIN_PRIORITY=1 NORM_PRIORITY=5 MAX_PRIORITY=10 ClaseThread Constructores: publicThread() Creaunthreadestndar. publicThread(Runnabletarget) CreaunthreadenbaseaunaclasequeimplementalainterfazRunnable. publicThread(Runnabletarget,Stringname) Equivalentealanteriorconstructordndoleelnombrenamealthread. publicThread(Stringname) Creaunthreadestndarconelnombrename. publicThread(ThreadGroupgroup,Runnabletarget) Crea un thread en base a una clase que implementa la interfaz Runnable dentro del ThreadGroup. publicThread(ThreadGroupgroup,Runnabletarget,Stringname) Equivalentealanteriorconstructordndoleelnombrenamealthread. publicThread(ThreadGroupgroup,Stringname) CreaunthreadestndarconelnombrenamedentrodelThreadGroup

Almacenand dodatos

DAW

Cuando osecreaunthreadnose eponeenmarcha,selohemosdeindicarexplcit tamente. UnThr readGroupesunconjunt todethreads s,loscualestienenacces soainformacinentreellos. Serviciosde elaclaseThr read publicS StringgetNam me(): De evuelveelno ombrequeid dentificaalthread. t publicStringsetName(Stringname): n Ca ambiaelnom mbredelthre ead. publicintgetPriority y() De evuelvelapr rioridaddelthread. t publicvoidsetPrior rity(intnewP Priority) ambialaprio oridaddelthread Ca publicT ThreadGroup pgetThreadG Group(): De evuelveelgr rupodedond deprocedeel e thread. voidrun() Es selmtodoque q ejecutar runthreadcuandoeste esepongaen nmarcha. voidsta art() Inicialaejecuc cindelthre ead. voidjoin() Es speraaqueun u threadterminesueje ecucin. Po odemosespe ecificareltie empodeespe eramximo. . voidsle eep(longmili is) Bloqueaelthr readmilismilisegundos. Ha ayotroparmetroquepermite p afina armseltiem mpodebloqueoennano osegundos. voidstop/destroy() ) De estruyeelthreadsinelim minarestruct turas,estoestareadelmtodo m join. staticThreadcurren ntThread() De evuelveelth hreadqueseestejecuta andoactualm mente. boolea anisAlive() Mira M siunthre eadnohaterminadosuejecucin e staticvoidyield() rovocaelcam mbiodecont textoentreflujos. f Pr EstadosdeunThread

Sincronizac cin Aqu se pre esenta el pro oblema de que q varios th hreads inten nten acceder r a los mismos datos y que q el resultadofinalseaincor rrecto. Por eje emplo: Acce eso a una va ariable global x con val lor inicial 0, , y dos thre eads que int tentan increm mentarsuvalorenunaun nidad. Silosthreadsnoes stnsincronizadosunre esultadoposi ibleseraquelavariablextengaelvalor v 1 recto) (incorr

10

DesarrollodeAplicacionesWeb

Tema6

Solucin: Para resolver el problema anterior se utiliza la etiqueta synchronized junto con el objetoquesequieresincronizar. Enelcasoanteriorsesolucionaradelasiguienteforma: synchronized(this){x++;} thiseslaclasequecontienelavariableglobal Conestosegarantizaelaccesoenexclusinmutua. Siqueremosaccederaunmtodoenexclusinmutuatenemoslassiguientesopciones: Igualqueelejemploanterior: synchronized(this){this.incrementar()} Declarandoelmtodocomosincronizado: synchronizedvoidincrementar() Tambin se pueden sincronizar varios threads mediante los mtodos: wait(), notify() y notifyAll()

Ejemplo:Unchat
Servidor.java
import java.io.*; import java.net.*; importjava.util.*; public class Servidor extends Thread{ public static Vector usuarios = new Vector(); public static void main (String args[]){ ServerSocket sfd = null; try{ sfd = new ServerSocket(7000); }catch (IOException ioe){ System.out.println("Comunicacin rechazada."+ioe); System.exit(1); }while (true){ try{ Socket nsfd = sfd.accept(); System.out.println("Conexion aceptada de: "+nsfd.getInetAddress()); Flujoflujo = new Flujo(nsfd); Thread t = new Thread(flujo); t.start(); }catch(IOException ioe){ System.out.println("Error: "+ioe); } } } }

Flujo.java
import java.net.*; import java.io.*; importjava.util.*; public class Flujo extends Thread{ Socket nsfd; DataInputStreamFlujoLectura; DataOutputStreamFlujoEscritura; publicFlujo (Socket sfd){ nsfd = sfd; try{ Flujo Lectura = new DataInputStream(new BufferedInputStream(sfd.getInputStream())); Flujo Escritura = new DataOutputStream(new BufferedOutputStream(sfd.getOutputStream())); }catch(IOExceptionioe){ System.out.println("IOException(Flujo): "+ioe); } } publicvoidrun(){ broadcast(nsfd.getInetAddress()+> se ha conectado"); Servidor.usuarios.add ((Object) this); while(true){ try{ String linea = FlujoLectura.readUTF();

11

Almacenandodatos

DAW

if (!linea.equals("")){ linea = nsfd.getInetAddress() +> + linea; broadcast(linea); } } catch(IOException ioe){ Servidor.usuarios.removeElement(this); broadcast(nsfd.getInetAddress()+> se ha desconectado"); break; } } } public void broadcast(String mensaje){ synchronized (Servidor.usuarios){ Enumeration e = Servidor.usuarios.elements(); while (e.hasMoreElements()){ Flujo f = (Flujo) e.nextElement(); try{ synchronized(f.FlujoEscritura){ f.FlujoEscritura.writeUTF(mensaje); f.FlujoEscritura.flush(); } } catch(IOException ioe){ System.out.println("Error: "+ioe); } } } } }

Cliente.java
import java.io.*; import java.net.*; importjava.awt.*; importjava.awt.event.*; public class Cliente extends Frame implements ActionListener { static Socket sfd = null; staticDataInputStream EntradaSocket; staticDataOutputStream SalidaSocket; staticTextField salida; staticTextArea entrada; String texto; publicCliente() { setTitle("Chat"); setSize(350,200); salida = new TextField(30); salida.addActionListener(this); entrada = new TextArea(); entrada.setEditable(false); add("South",salida); add("Center", entrada); setVisible(true); } public static void main(String[] args){ Cliente cliente = new Cliente(); try { sfd = new Socket("192.168.0.1",7000); EntradaSocket = new DataInputStream(new BufferedInputStream(sfd.getInputStream())); SalidaSocket = new DataOutputStream(new BufferedOutputStream(sfd.getOutputStream())); } catch (UnknownHostExceptionuhe) { System.out.println("No se puede acceder al servidor."); System.exit(1); } catch (IOException ioe) { System.out.println("Comunicacin rechazada.");

12

DesarrollodeAplicacionesWeb

Tema6

System.exit(1); } while (true) { try { String linea = EntradaSocket.readUTF(); entrada.append(linea+"\n"); } catch(IOException ioe) { System.exit(1); } } } public void actionPerformed (ActionEvent e) { texto = salida.getText(); salida.setText(""); try { SalidaSocket.writeUTF(texto); SalidaSocket.flush(); } catch (IOException ioe) { System.out.println("Error: "+ioe); } } publicbooleanhandleEvent(Event e) { if ((e.target == this) && (e.id == Event.WINDOW_DESTROY)){ if (sfd != null){ try{ sfd.close(); }catch (IOException ioe) { System.out.println("Error: "+ioe); } this.dispose(); } } return true; } }

13

Almacenandodatos

DAW

3.Clasesrelativasaflujos.
Caso prctico Otro aspecto importante que Ada trata con Mara y Juan, acerca de los ficheros para la aplicacin de la clnica, es el tipo de ficheros a usar. Es decir, deben estudiar si es conveniente utilizar ficheros para almacenar datos en ficheros de texto, o si deben utilizar ficheros binarios. Mara comenta Quizs debemos usar los dos tipos de ficheros, depender de qu se vaya a guardar, -Juan le contesta -tienes razn Mara, pero debemos pensar entonces cmo va el programa a leer y a escribir la informacin, tendremos que utilizar las clases Java adecuadas segn los ficheros que decidamos usar.

Existen dos tipos de flujos, flujos de bytes (byte streams) y flujos de caracteres (characterstreams).

Los flujos de caracteres (16 bits) se usan para manipular datos legibles por humanos (por ejemplo un fichero de texto). Vienen determinados por dos clases abstractas: Reader y Writer. Dichas clases manejan flujos de caracteres Unicode. De ellas derivan subclases concretas que implementan los mtodos definidos destacados los mtodos read() y write() que, en este caso, leen y escriben caracteres de datos respectivamente. Los flujos de bytes (8 bits) se usan para manipular datos binarios, legibles solo por la maquina (por ejemplo un fichero de programa). Su uso est orientado a la lectura y escritura de datos binarios. El tratamiento del flujo de bytes viene determinadopordosclasesabstractasque son InputStream y OutputStream. Estas dos clases son las que definen los mtodos que sus subclases tendrn implementados y, de entre todos, destacan read() y write()queleenyescribenbytesdedatosrespectivamente. Las clases del paquete java.io se pueden ver en la ilustracin. Destacamos las clases relativas a flujos:
BufferedInputStream:permiteleerdatosatravsdeunflujoconunbufferintermedio. BufferedOutputStream:implementalosmtodosparaescribirenunflujoatravsdeun

buffer.
FileInputStream:permiteleerbytesdeunfichero. FileOutputStream:permiteescribirbytesenunficheroodescriptor. StreamTokenizer:estaclaserecibeunflujodeentrada,loanaliza(parse)ydivideen

diversospedazos(tokens),permitiendoleerunoencadamomento.
StringReader:esunflujodecaracterescuyafuenteesunacadenadecaracteresostring. StringWriter:esunflujodecaracterescuyasalidaesunbufferdecadenadecaracteres,

quepuedeutilizarseparaconstruirunstring.

14

DesarrollodeAplicacionesWeb

Tema6

Destacarquehayclasesquese"montan"sobreotrosflujosparamodificarlaformadetrabajarcon ellos. Por ejemplo, con BufferedInputStream podemos aadir un buffer a un flujo FileInputStream, de manera que se mejore la eficiencia de los accesos a los dispositivos en los quesealmacenaelficheroconelqueconectaelflujo.

3.1.Ejemplocomentadodeunaclaseconflujos.
Vamosaverunejemploconunadelasclasescomentadas,enconcreto,conStreamTokenizer. La clase StreamTokenizer obtiene un flujo de entrada y lo divide en "tokens". El flujo tokenizerpuedereconoceridentificadores,nmerosyotrascadenas. El ejemplo que puedes descargarte en el siguiente recurso, muestra cmo utilizar la clase StreamTokenizer para contar nmeros y palabras de un fichero de texto. Se abre el flujo con ayuda de la clase FileReader, y puedes ver cmo se "monta" el flujo StreamTokenizer sobre el FileReader, es decir, que se construye el objeto StreamTokenizer con el flujo FileReader como argumento,yentoncesseempiezaaiterarsobrel.
packagetokenizer; importjava.io.FileNotFoundException; importjava.io.FileReader; importjava.io.IOException; importjava.io.StreamTokenizer;

public class token { public void contarPalabrasyNumeros(String nombre_fichero) { StreamTokenizersTokenizer = null; intcontapal = 0, numNumeros = 0; try { sTokenizer = new StreamTokenizer(new FileReader(nombre_fichero)); while (sTokenizer.nextToken() != StreamTokenizer.TT_EOF) { if (sTokenizer.ttype == StreamTokenizer.TT_WORD) contapal++; else if (sTokenizer.ttype == StreamTokenizer.TT_NUMBER) numNumeros++; } System.out.println("Nmero de palabras en el fichero: " + contapal); System.out.println("Nmero de nmeros en el fichero: " + numNumeros); } catch (FileNotFoundException ex) { System.out.println(ex.getMessage()) ; } catch (IOException ex) { System.out.println(ex.getMessage()) ; } } /** * @paramargs the command line arguments */ public static void main(String[] args) { new Main().countWordsAndNumbers("c:\\datos.txt"); } }

ElmtodonextTokendevuelveunintqueindicaeltipodetokenledo.Hayunaseriedeconstantes definidasparadeterminareltipodetoken:
TT_WORDindicaqueeltokenesunapalabra. TT_NUMBERindicaqueeltokenesunnmero. TT_EOLindicaquesehaledoelfindelnea. TT_EOFindicaquesehallegadoalfindelflujodeentrada.

15

Almacenandodatos

DAW

En el cdigo de la clase, apreciamos que se iterar hasta llegar al fin del fichero. Para cada token, se mirasutipo,ysegneltiposeincrementaelcontadordepalabrasodenmeros.

Indica si la siguiente afirmacin es verdadera o falsa. Segn el sistema operativo que utilicemos, habr que utilizar un flujo u otro. Verdadero. Falso.

4.Flujos.
Caso prctico Ana y Antonio salen de clase. Antonio ha quedado con una amiga y Ana va camino de casa pensando en lo que le explicaron en clase hace unos das. Como se qued con dudas, tambin le consult a Mara. En concreto, le asaltaban dudas sobre cmo leer y escribir datos por teclado en un programa, y tambin varias dudas sobre lectura y escritura de informacin en ficheros. Mara le solvent las dudas hablndole sobre el tema, pero an as, tena que probarlo tranquilamente en casa, hacindose unos pequeos ejemplos, para comprobar toda la nueva informacin aprendida. -Antes de irte, -dice Antonio a Ana, -sintate a hablar con nosotros un rato. -Bueno, pero me voy a ir enseguida, -contesta Ana-.

Hemos visto qu es un flujo y que existe un rbol de clases amplio para su manejo. Ahora vamos a ver en primer lugar los flujos predefinidos, tambin conocidos como de entrada y salida, y despus veremoslosflujosbasadosenbytesylosflujosbasadosencarcter. "Loescuchyloolvid,loviyloentend,lohiceyloaprend".Confucio.

Parasaberms Antes, hemos mencionado Unicode. Puedes consultar el origen y ms cosas sobre Unicode, enelenlacedelaWikipedia: http://www.juntadeandalucia.es/educacion/adistancia/cursos/mod/scorm/player.php?id=7 4601&currentorg=eXeContenidos4df9bd3a1eeeacaecb3a&mode=normal&scoid=145047

4.1.Flujospredefinidos.Entradaysalidaestndar.
Tradicionalmente,losusuariosdelsistemaoperativoUnix,LinuxytambinMSDOS,hanutilizadoun tipo de entrada/salida conocida comnmente por entrada/salida estndar. El fichero de entrada estndar (stdin) es tpicamente el teclado. El fichero de salida estndar (stdout) es tpicamente la pantalla(olaventanadelterminal).Elficherodesalidadeerrorestndar(stderr)tambinsedirige normalmente a la pantalla, pero se implementa como otro fichero de forma que se pueda distinguir entrelasalidanormaly(siesnecesario)losmensajesdeerror. Java tiene acceso a la entrada/salida estndar a travs de la clase System. En concreto, los tres ficherosqueseimplementanson:
Stdin.EsunobjetodetipoInputStream,yestdefinidoenlaclaseSystemcomoflujode

entradaestndar.Pordefectoeselteclado,peropuederedirigirseparacadahostocada usuario,deformaquesecorrespondaconcualquierotrodispositivodeentrada. Stdout. System.outimplementastdoutcomounainstanciadelaclasePrintStream.Se puedenutilizarlosmtodosprint()yprintln()concualquiertipobsicoJavacomo argumento. Stderr.EsunobjetodetipoPrintStream.EsunflujodesalidadefinidoenlaclaseSystemy representalasalidadeerrorestndar.Pordefecto,eselmonitor,aunqueesposible redireccionarloaotrodispositivodesalida. Paralaentrada,seusaelmtodoreadparaleerdelaentradaestndar: intSystem.in.read(); Leeelsiguiente byte (char)delaentradaestndar.

16

DesarrollodeAplicacionesWeb

Tema6

intSystem.in.read(byte[] b); Leerunconjuntodebytesdelaentradaestndaryloalmacenaenelvectorb. System.out.print(String); Muestraeltextoenlaconsola. System.out.println(String); Muestraeltextoenlaconsolayseguidamenteefectaunsaltodelnea.

Para la salida, se usa el mtodo print para escribir en la salida estndar:


Normalmente, para leer valores numricos, lo que se hace es tomar el valor de la entrada estndar en forma de cadena y entonces usar mtodos que permiten transformar el texto a nmeros (int, float,double,etc.)segnserequiera. Funcionesdeconversin. Mtodo Funcionamiento Convierteunacadenaenunnmeroenterodeun byte Byte.parseByte(String) byte short Short.parseShort(String) Convierteunacadenaenunnmeroenterocorto intInteger.parseInt(String) Convierteunacadenaenunnmeroentero longLong.parseLong(String) Convierteunacadenaenunnmeroenterolargo floatFloat.parseInt(String) Convierteunacadenaenunnmerorealsimple doubleDouble.parseInt(String) Convierteunacadenaenunnmerorealdoble booleanBoolean.parseBoolean(String) Convierteunacadenaenunvalorlgico

4.2.Flujospredefinidos.Entradaysalidaestndar.Ejemplo.
Veamos un ejemplo en el que se lee por teclado hasta pulsar la tecla de retorno, en ese momento el programaacabarimprimiendoporlasalidaestndarlacadenaleda. ParairconstruyendolacadenaconloscaracteresledospodramosusarlaclaseStringBufferola StringBuilder. La clase StringBuffer permite almacenar cadenas que cambiarn en la ejecucin del programa. StringBuilder es similar, pero no es sncrona. De este modo, para la mayora de las aplicaciones, donde se ejecuta un solo hilo, supone una mejora de rendimiento sobre StringBuffer. Elprocesodelecturahadeestarenunbloquetry..catch.
Import java.io.IOException; public class leeEestandar { public static void main(String[] args) { // Cadena donde iremos almacenando los caracteres que se escriban StringBuilder str = new StringBuilder(); char c; // Por si ocurre una excepcin ponemos el bloque try-cath try{ // Mientras la entrada de terclado no sea Intro while ((c=(char)System.in.read())!='\n'){ // Aadir el character ledo a la cadena str str.append(c); } }catch(IOException ex){ System.out.println(ex.getMessage()); } // Escribir la cadena que se ha ido tecleando System.out.println("Cadena introducida: " + str); } }

Seala la opcin correcta: Read es una clase de System que permite leer caracteres.
StringBuffer permite leer y StringBuilder escribir en la salida estndar.

La clase keyboard tambin permite leer flujos de teclado.

17

Almacenandodatos

DAW

Stderr por defecto dirige al monitor pero se puede direccionar a otro dispositivo. Debesconocer Debemos procesar las excepciones que la propia mquina virtual va a lanzar. Existen dos mecanismos bsicos para gestionar los errores que se pueden producir en una aplicacin: el primeroconsiste en utilizar la estructura try-catch, que permite intentar capturarun error que se pueda producir. Se pone el try, el cdigo en cuestin y se finaliza con el catch. En esa seccin del catch es donde pondremos las operaciones a realizar cuando se detecte un error.Sepuedenponervariosbloquescatch:unagenricayotrasmsdetalladas. El otro mecanismo consiste en declarar que nuestro mtodo puede lanzar una excepcin, pero no gestionarla en ese mtodo, sino tratarla, por ejemplo, en el mtodo main() en el queseestllamandoaesemtodo.

4.3.Flujosbasadosenbytes.
Estetipodeflujoseselidneoparaelmanejodeentradasysalidasdebytes,ysuusoportantoest orientadoalalecturayescrituradedatosbinarios. Para el tratamiento de los flujos de bytes, Java tiene dos clases abstractas que son InputStreamy OutputStream. Cada una de estas clases abstractas tiene varias subclases concretas, que controlan lasdiferenciasentrelosdistintosdispositivosdeE/Squesepuedenutilizar.
classFileInputStreamextandsInputStream { FileInputStream (String fichero) throws FileNotFoundException; FileInputStream (File fichero) throws FileNotFoundException; ... ... ... } classFileOutputStream extends OutputStream { FileOutputStream (String fichero) throws FileNotFoundException; FileOutputStream (File fichero) throws FileNotFoundException; ... ... ... } OutputStream y el InputStream y todas sus subclases, reciben en el constructor el objeto que

representaelflujodedatosparaeldispositivodeentradaosalida. Porejemplo,podemoscopiarelcontenidodeunficheroenotro:
voidcopia (String origen, String destino) throws IOException { try{ // Obtener los nombres de los ficheros de origen y destino // y abrir la conexin a los ficheros. InputStreamfentrada = new FileInputStream(origen); OutputStreamfsalida = new FileOutputStream(destino); // Crear una variable para leer el flujo de bytes del origen byte[] buffer= new byte[256]; while (true) { // Leer el flujo de bytes int n = fentrada.read(buffer); // Si no queda nada por leer, salir delwhile if (n < 0) break; // Escribir el flujo de bytes ledos al fichero destino fsalida.write(buffer, 0, n); } // Cerrar los ficheros fentrada.close(); fsalida.close(); }catch(IOException ex){ System.out.println(ex.getMessage()); }

Recomendacin En los enlaces siguientes puedes ver la documentacin oficial de Oracle sobre FileInputStreamysobreFileOutputStream.

18

DesarrollodeAplicacionesWeb
FileInputStream. FileOutputStream.

Tema6

http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileInputStream.html http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileOutputStream.html

4.4.Flujosbasadosencaracteres.
Las clases orientadas al flujo de bytes nos proporcionan la suficiente funcionalidad para realizar cualquier tipo de operacin de entrada o salida, pero no pueden trabajar directamente con caracteres Unicode, los cuales estn representados por dos bytes. Por eso, se consider necesarialacreacindelasclasesorientadasalflujodecaracterespara ofrecernoselsoportenecesarioparaeltratamientodecaracteres. Para los flujos de caracteres, Java dispone de dos clases abstractas: ReaderyWriter. Reader, Writer, y todas sus subclases, reciben en el constructor el objetoquerepresentaelflujodedatosparaeldispositivodeentradao salida. Hay que recordar que cada vez que se llama a un constructor se abre el flujo de datos y es necesariocerrarlocuandonolonecesitemos. Existen muchos tipos de flujos dependiendo de la utilidad que le vayamos a dar a los datos que extraemosdelosdispositivos. Un flujo puede ser envuelto por otro flujo para tratar el flujo de datos de forma cmoda. As, un bufferWriternospermitemanipularelflujodedatoscomounbuffer,perosiloenvolvemosenun PrintWriter lo podemos escribir con muchas ms funcionalidades adicionales para diferentes tiposdedatos. En este ejemplo de cdigo, se ve cmo podemos escribir la salida estndar a un fichero. Cuando se tecleelapalabra"salir",sedejardeleeryentoncessesaldrdelbucledelectura. Podemos ver cmo se usa InputStreamReader que es un puente de flujos de bytes a flujos de caracteres:leebytesylosdecodificaacaracteres.BufferedReaderleetextodeunflujodeentrada decaracteres,permitiendoefectuarunalecturaeficientedecaracteres,vectoresylneas. Como vemos en el cdigo, usamos FileWriter para flujos de caracteres, pues para datos binarios seutilizaFileOutputStream.
try{ PrintWriter out = null; out = new PrintWriter(new FileWriter("c:\\salida.txt", true)); BufferedReaderbr = new BufferedReader( newInputStreamReader(System.in)); String s; while (!(s = br.readLine()).equals("salir")){ out.println(s); } out.close(); } catch(IOException ex){ System.out.println(ex.getMessage()); }

Indica si es verdadera o falsa la siguiente afirmacin: Para flujos de caracteres es mejor usar las clases Reader y Writer en vez de InputStream y OutputStream. Verdadero.

Falso.

19

Almacenandodatos

DAW

4.5.Rutasdelosficheros.
Enlosejemplosquevemoseneltema estamosusandolarutade los ficheros tal y como se usan en MSDOS, o Windows, es decir, porejemplo:
c:\\datos\Programacion\fichero.txt

Cuando operamos con rutas de ficheros, el carcter separador entre directorios o carpetas suele cambiar dependiendo del sistemaoperativoenelqueseestejecutandoelprograma. Para evitar problemas en la ejecucin de los programas cuando seejecutenenunouotrosistemaoperativo,yportantopersiguiendoquenuestrasaplicacionessean lomsportablesposibles,serecomiendausarenJava:File.separator. Podramos hacer una funcin que al pasarle una ruta nos devolviera la adecuada segn el separador delsistemaactual,delsiguientemodo:
String substFileSeparator(String ruta){ String separador = "\\"; try{ // Si estamos en Windows if ( File.separator.equals(separador) ) separador = "/" ; // Reemplaza todas las cadenas que coinciden con la expresin // regular dada oldSep por la cadena File.separator returnruta.replaceAll(separador, File.separator); }catch(Exception e){ // Por si ocurre una java.util.regex.PatternSyntaxException returnruta.replaceAll(separador + separador, File.separator); } }

Indica si es verdadera o falsa la siguiente afirmacin. Cuando trabajamos con fichero en Java, no es necesario capturar las excepciones, el sistema se ocupa automticamente de ellas. Verdadero o Falso? Verdadero.

Falso.

20

DesarrollodeAplicacionesWeb

Tema6

5.Trabajandoconficheros.
Caso prctico Juan le comenta a Mara -Tenemos que programar una copia de seguridad diaria de los datos del ficheros de texto plano que utiliza el programa para guardar la informacin. -Mientras Mara escucha a Juan, recuerda que para copias de seguridad, siempre ha comprobado que la mejor opcin es utilizar ficheros secuenciales.

CreesqueesunabuenaopcinlaquepiensaMaraoutilizarasotraensulugar? En este apartado vas a ver muchas cosas sobre los ficheros: cmo leer y escribir en ellos, aunque ya hemos visto algo sobre eso, hablaremos de las formas de acceso a los ficheros: secuencial o de maneraaleatoria. Siemprehemosdetenerencuentaquelamaneradeprocederconficherosdebeser: Abrirobiencrearsinoexisteelfichero. Hacerlasoperacionesquenecesitemos. Cerrarelfichero,paranoperderlainformacinquesehayamodificadooaadido. Tambin es muy importante el control de las excepciones, para evitar que se produzcan fallos en tiempodeejecucin.Siintentamosabrirsinmsunfichero,sincomprobarsiexisteono,ynoexiste, saltarunaexcepcin.

Parasaberms En el siguiente enlace a la wikipedia podrs ver la descripcin de varias extensiones que puedenpresentarlosarchivos. Extensindeunarchivo. http://es.wikipedia.org/wiki/Extensi%C3%B3n_de_archivo

5.1.Escrituraylecturadeinformacinenficheros.
Acabamosdemencionarlospasosfundamentalesparaprocederconficheros:abrir,operar,cerrar. Adems de esas consideraciones, debemos tener en cuenta tambin las clases Java a emplear, es decir, recuerda que hemos comentado que si vamos a tratar con ficheros de texto, es ms eficiente emplear las clases de ReaderWriter, frente a las clases de InputStreamy OutputStream que estnindicadasparaflujosdebytes. Otra cosa a considerar, cuando se va a hacer uso de ficheros, es la forma de acceso al fichero que se vaautilizar,sivaaserdemanerasecuencialobien aleatoria.En unficherosecuencial,paraacceder a un dato debemos recorrer todo el fichero desde el principio hasta llegar a su posicin. Sin embargo,enunficherodeaccesoaleatorio(Eslaposibilidaddeaccederaunelementoarbitrariodeunasecuenciadedatos en el mismo tiempo) podemos posicionarnos directamente en una posicin del fichero, y ah leer o escribir. AunqueyahasvistounejemploqueusaBufferedReader,insistimosaqusobrelafilosofadeestas clases,queusanlaideadeunbuffer. La idea es que cuando una aplicacin necesita leer datos de un fichero, tiene que estar esperando a queeldiscoenelqueestelficheroleproporcionelainformacin. Undispositivocualquieradememoriamasiva(Consisteenuntipodealmacenamientopermanente,novoltil,adiferencia
de la memoriaprincipal delordenadorquesesvoltil, pero posee mayor capacidad de almacenamiento que la memoria principal,aunque esmslentaquesta),pormuyrpidoquesea,esmuchomslentoquelaCPUdelordenador.

As que, es fundamental reducir el nmero de accesos al fichero a fin de mejorar la eficiencia de la aplicacin,yparaelloseasociaalficherounamemoriaintermedia,elbuffer,demodoquecuandose necesitaleer unbyte delarchivo,enrealidadse traenhastaelbufferasociado alflujo,yaqueesuna memoriamuchomsrpidaquecualquierotrodispositivodememoriamasiva. Cualquier operacin de Entrada/Salida a ficheros puede generar una IOException, es decir, un error de Entrada/Salida. Puede ser por ejemplo, que el fichero no exista, o que el dispositivo no funcione correctamente, o que nuestra aplicacin no tenga permisos de lectura o escritura sobre el

21

Almacenandodatos

DAW

ficheroencuestin.Poreso,lassentenciasqueinvolucranoperacionessobreficheros,debenirenun bloquetry.

Seala si es verdadera o es falsa la siguiente afirmacin: La idea de usar buffers con los ficheros es incrementar los accesos fsicos a disco. Verdadero. Falso.

5.2.Ficherosbinariosyficherosdetexto(I).
Ya comentamos anteriormente que los ficheros se utilizan para guardar la informacin en un soporte: disco duro, disquetes, memorias usb, dvd, etc., y posteriormente poder recuperarla. Tambindistinguimosdostiposdeficheros:losdetextoylosbinarios. En los ficheros de texto la informacin se guarda como caracteres. Esos caracteres estn codificados enUnicode,oenASCIIuotrascodificacionesdetexto. En la siguiente porcin de cdigo puedes ver cmo para un fichero existente, que en este caso es texto.txt,averiguamoslacodificacinqueposee,usandoelmtodogetEncoding()
FileInputStream fichero; try { // Elegimos fichero para leer flujos de bytes "crudos" fichero = new FileInputStream("c:\\texto.txt"); // InputStreamReader sirve de puente de flujos de byte a caracteres InputStreamReaderunReader = new InputStreamReader(fichero); // Vemos la codificacin actual System.out.println(unReader.getEncoding()); } catch (FileNotFoundException ex) { Logger.getLogger(textos.class.getName()).log(Level.SEVERE, null, ex); }

Para archivos de texto, se puede abrir el fichero para leer usando la clase FileReader. Esta clase nos proporciona mtodos para leer caracteres. Cuando nos interese no leer carcter a carcter, sino leer lneas completas, podemos usar la clase BufferedReader a partir de FileReader. Lo podemoshacerdelasiguienteforma:
File arch = new File ("C:\\fich.txt"); FileReaderfr = new FileReader (arch); BufferedReaderbr = new BufferedReader(fr); ... String linea = br.readLine();

Paraescribirenarchivosdetextolopodramoshacer,teniendoencuenta:
FileWriterfich = null; PrintWriter pw = null; fich = new FileWriter("c:/fich2.txt"); pw = new PrintWriter(fichero); pw.println("Linea de texto"); ...

Si el fichero al que queremos escribir existe y lo que queremos es aadir informacin, entonces pasaremoselsegundoparmetrocomotrue:
FileWriter("c:/fich2.txt",true);

22

DesarrollodeAplicacionesWeb

Tema6

Parasaberms EnelsiguienteenlaceawikipediapuedesverelcdigoASCII.

Binario 00100000 00100001 00100010 00100011 00100100 00100101 00100110 00100111 00101000 00101001 00101010 00101011 00101100 00101101 00101110 00101111 00110000 00110001 00110010 00110011 00110100 00110101 00110110 00110111 00111000 00111001 00111010 00111011 00111100 00111101 00111110 00111111

Dec 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

Hex 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F

Repre senta espacio () ! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?

Binario 0100 0000 0100 0001 0100 0010 0100 0011 0100 0100 0100 0101 0100 0110 0100 0111 0100 1000 0100 1001 0100 1010 0100 1011 0100 1100 0100 1101 0100 1110 0100 1111 0101 0000 0101 0001 0101 0010 0101 0011 0101 0100 0101 0101 0101 0110 0101 0111 0101 1000 0101 1001 0101 1010 0101 1011 0101 1100 0101 1101 0101 1110 0101 1111

Dec 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

Hex 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F

Repre senta @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _

Binario 0110 0000 0110 0001 0110 0010 0110 0011 0110 0100 0110 0101 0110 0110 0110 0111 0110 1000 0110 1001 0110 1010 0110 1011 0110 1100 0110 1101 0110 1110 0110 1111 0111 0000 0111 0001 0111 0010 0111 0011 0111 0100 0111 0101 0111 0110 0111 0111 0111 1000 0111 1001 0111 1010 0111 1011 0111 1100 0111 1101 0111 1110

Dec 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126

Hex 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E

Repres enta ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~

5.2.1.Ficherosbinariosyficherosdetexto(II). Los ficheros binarios almacenan la informacin en bytes, codificada en binario, pudiendo ser de cualquiertipo:fotografas,nmeros,letras,archivosejecutables,etc. Los archivos binarios guardan una representacin de los datos en el fichero. O sea que, cuando se guarda texto no se guarda el texto en s, sino que se guarda su representacin en cdigo UTF8 (Es un formatodecodificacindecaracteresUnicodeusandosmbolosdelongitudvariable). Para leer datos de un fichero binario, Java proporciona la clase FileInputStream. Dicha clase trabaja conbytesqueseleendesdeelflujoasociadoaunfichero.Aqupuedesverunejemplocomentado.
packagefileinputconbuffer; importjava.io.BufferedInputStream; importjava.io.File; importjava.io.FileInputStream; importjava.io.IOException; public class leerConBuffer { public static void main(String[] args) { int tama ; try{ // Creamos un nuevo objeto File, que es la ruta hasta el fichero desde File f = new File("C:\\apuntes\\test.bin"); // Construimosunflujo de tipo FileInputStream (un flujo de entrada desde

23

Almacenandodatos

DAW

// fichero) sobre el objeto File. Estamos conectando nuestra aplicacin // a un extremo del flujo, por donde van a salir los datos, y "pidiendo" // al Sistema Operativo que conecte el otro extremo al fichero que indica // la ruta establecida por el objeto File f que habamos creado antes. De FileInputStreamflujoEntrada = new FileInputStream(f); BufferedInputStreamfEntradaConBuffer = new BufferedInputStream(flujoEntrada); // Escribimos el tamaodel fichero en bytes. tama = fEntradaConBuffer.available(); System.out.println("Bytes disponibles: " + tama); // Indicamos que vamos a intentar leer 50 bytes del fichero. System.out.println("Leyendo 50 bytes...."); // Creamos unarray de 50 bytes para llenarlo con los 50 bytes // que leamos del flujo (realmente del fichero)*/ bytebytearray[] = new byte[50]; // El mtodo read() de la clase FileInputStream recibe como parmetro un // array de byte, y lo llena leyendo bytes desde el flujo. // Devuelve un nmero entero, que es el nmero de bytes que realmente se // han ledo desde el flujo. Si el fichero tiene menos de 50 bytes, no // podr leer los 50 bytes, y escribir un mensaje indicndolo. if (fEntradaConBuffer.read(bytearray) != 50) System.out.println("No se pudieron leer 50 bytes"); // Usamos un constructor adecuado de la clase String, que crea un nuevo // String a partir de los bytes ledos desde el flujo, que se almacenaron // en el arraybytearray, y escribimos eseString. System.out.println(new String(bytearray, 0, 50)); // Finalmentecerramos el flujo.Es importante cerrar los flujos // para liberar ese recurso. Al cerrar el flujo, se comprueba que no // haya quedado ningn dato en el flujo sin que se haya ledo por la aplicacin. */ fEntradaConBuffer.close(); // Capturamos la excepcin de // producirse en este caso es // es el mensaje que enviamos }catch (IOException e){ System.err.println("No se encuentra } } } Entrada/Salida. El error que puede que el fichero no est accesible, y en tal caso. el fichero");

Para escribir datos a un fichero binario, la clase nos permite usar un fichero para escritura de bytes en l, es la claseFileOutputStream. La filosofa es la misma que para la lectura de datos, pero ahora el flujo es en direccin contraria, desde la aplicacin que hace de fuente de datos hasta el fichero,quelosconsume. Enlasiguientepresentacinpuedesverunesquemadecmoutilizarbufferparaoptimizarlalectura de teclado desde consola, por medio de las envolturas, podemos usar mtodos como readline(), delaclaseBufferedReader,queenvuelveaunobjetodelaclaseInputStreamReader. EnvolturasoWrappers Leerdesdeconsola
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in);

Buf es un flujo de caracteres que se enlaza a la consola a travs de la clase System.in. Esta seenvuelveparapasardebyteachar InputStreamReader (InputStream inp):clasequeconviertedebyteacarcter. BufferedReader (Reader input):clasequerecibeunflujodecaracteresdeentrada.


24

BufferedReader InputStreamReader System.in


(ImputStream)

readLine() intread() read(char[])

Bytes

read() read(byte[])

DesarrollodeAplicacionesWeb Resumentextualalternativo

Tema6

Seala si es verdadera o falsa la siguiente afirmacin: Para leer datos desde un fichero codificados en binario empleamos la clase FileOutputStream. Verdadero.

Falso.

5.3.Modosdeacceso.Registros.
En Java no se impone una estructura en un fichero, por lo que conceptos como el de registro que si existen en otros lenguajes, en principionoexisten enlosarchivosquesecreanconJava.Portanto,los programadores deben estructurar los ficheros de modo que cumplan con los requerimientos de sus aplicaciones. As, el programador definir su registro con el nmero de bytes que le interesen, movindose luego porelficheroteniendoencuentaesetamaoquehadefinido. Se dice que un fichero es de acceso directo o de organizacin directa cuando para acceder a un registro n cualquiera, no se tiene que pasar por los n1 registros anteriores. En caso contrario, estamoshablandodeficherossecuenciales. ConJavasepuedetrabajarconficherossecuencialesyconficherosdeaccesoaleatorio. En los ficheros secuenciales, la informacin se almacena de manera secuencial, de manera que para recuperarla se debe hacer en el mismo orden en que la informacin se ha introducido en el archivo. Siporejemploqueremosleerelregistrodelficheroqueocupala posicintres(enlailustracinsera el nmero 5), tendremos que abrir el fichero y leer los primeros tres registros, hasta que finalmente leamoselregistronmerotres. Porelcontrario,sisetrataradeunficherodeaccesoaleatorio,podramosaccederdirectamenteala posicintresdelfichero,oalaquenosinteresara.

Seala la opcin correcta: Java slo admite el uso de ficheros aleatorios. Con los ficheros de acceso aleatorio se puede acceder a un registro determinado directamente. Los ficheros secuenciales se deben leer de tres en tres registros. Todas son falsas.

5.4.Accesosecuencial.
En el siguiente ejemplo vemos cmo se escriben datos en un fichero secuencial: el nombre y apellidos de una persona utilizando el mtodo writeUTF() que proporciona DataOutputStream, seguidodesuedadquelaescribimosconel mtodowriteInt()de lamismaclase.Acontinuacin escribimos lo mismo para una segunda persona y de nuevo para una tercera. Despus cerramos el fichero. Y ahora lo abrimos de nuevo para ir leyendo de manera secuencial los datos almacenados enelfichero,yescribindolosaconsola.
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package escylecsecuen; import java.io.DataInputStream; import java.io.DataOutputStream;

25

Almacenandodatos
import import import import java.io.FileInputStream; java.io.FileNotFoundException; java.io.FileOutputStream; java.io.IOException;

DAW

/** * * @author JJBH */ public class escylee { /** * @param args the command line arguments */ public static void main(String[] args) { // Declarar un objeto de tipo archivo DataOutputStream archivo = null ; DataInputStream fich = null ; String nombre = null ; int edad = 0 ; try { // Creando o abriendo para aadir el archivo archivo = new DataOutputStream( new FileOutputStream("c:\\secuencial.dat",true) ); // Escribir el nombre y los apellidos archivo.writeUTF( "Antonio Lpez Prez " ); archivo.writeInt(33) ; archivo.writeUTF( "Pedro Piqueras Pearanda" ); archivo.writeInt(45) ; archivo.writeUTF( "Jos Antonio Ruiz Prez " ) ; archivo.writeInt(51) ; // Cerrar fichero archivo.close(); // Abrir para leer fich = new DataInputStream( new FileInputStream("c:\\secuencial.dat") ); nombre = fich.readUTF() ; System.out.println(nombre) ; edad = fich.readInt() ; System.out.println(edad) ; nombre = fich.readUTF() ; System.out.println(nombre) ; edad = fich.readInt() ; System.out.println(edad) ; nombre = fich.readUTF() ; System.out.println(nombre) ; edad = fich.readInt() ; System.out.println(edad) ; fich.close();

} catch(FileNotFoundException fnfe) { /* Archivo no encontrado */ } catch (IOException ioe) { /* Error al escribir */ } catch (Exception e) { /* Error de otro tipo*/ System.out.println(e.getMessage());} } }

Fjate al ver el cdigo, que hemos tenido la precaucin de ir escribiendo las cadenas de caracteres conelmismotamao,demaneraquesepamosluegoeltamaodelregistroquetenemosqueleer. Por tanto para buscar informacin en un fichero secuencial, tendremos que abrir el fichero e ir leyendoregistroshastaencontrarelregistroquebuscamos. Y si queremos eliminar un registro en un fichero secuencial, qu hacemos? Esta operacin es un problema, puesto que no podemos quitar el registro y reordenar el resto. Una opcin, aunque costosa,seracrearunnuevofichero.Recorremoselficherooriginalyvamoscopiandoregistrosenel nuevo hasta llegar al registro que queremos borrar. Ese no lo copiamos al nuevo, y seguimos copiandohastaelfinal,el restoderegistrosalnuevofichero.De estemodo,obtendramosunnuevo fichero que sera el mismo que tenamos pero sin el registro que queramos borrar. Por tanto, si se

26

DesarrollodeAplicacionesWeb

Tema6

prev que se va a borrar en el fichero, no es recomendable usar un fichero de este tipo, o sea, secuencial.

Seala si es verdadera o es falsa la siguiente afirmacin: Para encontrar una informacin almacenada en la mitad de un fichero secuencial, podemos acceder directamente a esa posicin sin pasar por los datos anteriores a esa informacin. Verdadero. Falso.

5.5.Accesoaleatorio.
A veces no necesitamos leer un fichero de principio a fin, sino acceder al fichero como si fuera una base de datos, donde se accede a un registro concreto del fichero. Java proporciona la clase RandomAccessFileparaestetipodeentrada/salida. La clase RandomAccessFile permite utilizar un fichero de acceso aleatorio en el que el programadordefineelformatodelosregistros.
RandomAccessFile objFile = new RandomAccessFile( ruta, modo );

Donderutaesladireccinfsicaenelsistemadearchivosymodopuedeser:

"r"paraslolectura. "rw"paralecturayescritura.

La clase RandomAccessFile implementa los interfaces DataInput y DataOutput. Para abrir un archivoenmodolecturaharamos:
RandomAccessFile in = new RandomAccessFile(input.dat, r);

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

Estaclasepermiteleeryescribirsobreelfichero,nosenecesitandosclasesdiferentes. Hay que especificar el modo de acceso al construir un objeto de esta clase: slo lectura o lectura/escritura. Dispone de mtodos especficos de desplazamiento como seek y skipBytes para poder moverse deunregistroaotrodelfichero,oposicionarsedirectamenteenunaposicinconcretadelfichero. Noestbasadaenelconceptodeflujosostreams. En la siguiente presentacin vemos cmo crear un fichero, cmo podemos acceder, y actualizar informacinenl. Ficherosdeaccesoaleatorio Crearfichero: Debido a la existencia de dos constructores, tenemos dos posibilidades de abrir un fichero de acceso aleatorio: Medianteelnombredelfichero:
miFichero = new RandomAccessFile(String nombre, String modo);

Medianteunobjetofile:

miFichero = new RandomAccessFile(File fichero, String modo);

27

Almacenandodatos

DAW

El parmetro modo determina si se tiene acceso de slo lectura (r) o bien de lectura/escritura (rw). Porejemplo,sepuedeabrirunficherodeslolectura:
RandomAccessFile miRAFile; miRAFile = new RandomAccessFile(/usr/bin/pepe.txt,rw);

Accederalainformacin: Con un objeto RandomAccessFile se tiene acceso a todas las operaciones read() y write() de las clasesDataInputStreamyDataOutputStream Sedisponedemuchosmtodosparaubicarsedentrodeunfichero:
long getFilePointer()

Devuelvelaposicinactualdelpunterdelfichero

void seek(long pos)

Sita el puntero del fichero en una posicin determinada. La posicin se da como un desplazamiento en bytes desde el comienzo del fichero. La posicin 0 marca el comienzo de esefichero
long length()

Devuelvelalongituddelfichero.Laposicinlength()marcaelfinaldeesefichero.

int skipBytes(int desplazamiento)

Desplaza el puntero desde la posicin actual, el nmero de bytes indicado por desplazamiento Actualizarlainformacin: Con los ficheros de acceso aleatorio se puede aadir informacin a un fichero aleatorio existente. Aqunosiramosalfinaldelfichero:
miFR = new RandomAccessFile(c:\\aleatorios\prueba.dat,rw); miFR.seek(miFR.length());

Cualquierwrite()quehagamosapartirdeestepuntodelcdigoaadirinformacinalfichero.

Indica si es verdadera o es falsa la siguiente afirmacin: Para decirle el modo de lectura y escritura a un objeto RandomAccessFile debemos pasar como parmetro "rw". Verdadero.

Falso.

28

DesarrollodeApl licacionesWeb W

Tema6

6.Aplicacio A onesdelalmacena a amientodeinform macine enfichero os.


Caso o prctico Anto onio ha qued dado con Ana a para estud diar sobre el tema de fich heros. De cam mino a la bib blioteca, Ana a le pre egunta a Ant tonio -Crees que los fic cheros se util lizan realmen nte, o ya est tn desfasad dos y slo se e utiliza an las bases s de datos? -Antonio tras s pensarlo un n momento le e dice a Ana a -Yo creo qu ue s, piensa a en el mp3 que us sas muchas veces, v la m sica va grab bada en ese tipo t de ficher ros.

Has pensado la diversidad de ficheros que existe, segn la inf formacin quese s guarda? otos que haces con tu cmara c digital, o con el mvil, se gu uardan en Las fo ficheros. As, existe una gran cantidad de ficheros de imagen, segn el mto odo que usen n para guard dar la inform macin. Por ejemplo, e ten nemos los ficherosdeexten nsin:.jpg,.ti iff,gif,.bmp, ,etc. sica que oy yes en tu mp p3 o en el rep productor de e mp3 de tu coche, est almacenada a en ficheros s La m quealmacenan a la ainformacinenformato omp3. Los sistemas s op perativos, co omo Linux, Windows, etc., estn constituido os por un montn de e instru uccionesein nformacinque q seguardaenficheros s. El pro opio cdigo fuente de lo os lenguajes de program macin, como o Java, C, etc c., se guarda a en ficheros s detextoplanolamayoradeveces. Tamb binseguard daenfichero oslaspelcula asenformat to.avi,.mp4,etc. Y por r supuesto, se s usan muc cho actualmente los fich heros XML, que q al fin y al cabo son ficheros de e texto oplano,pero oquesiguenunaestructu uradetermin nada.XMLse eempleamu uchoparaelintercambio o deinf formacinestructuradaentrediferentesplataformas.

Parasaberms Enel lsiguienteenlace e alawikipedia w puedessabermssobre eelformato oMp3. http://es.wikipedia.org/wiki/M MP3 Indic ca si es ver rdadera o fa alsa la sigu uiente afirm macin: Un fichero fi .bmp p guarda inf formacin de d msica co odificada. Verdadero o o falso? Verd dadero.

Falso.

29

Almacenandodatos

DAW

7.Utilizacindelossistemasdeficheros.
Caso prctico Ana est estudiando en la biblioteca, junto a Antonio. Est repasando lo que le explicaron en clase sobre las operaciones relativas a ficheros en Java. En concreto, est mirando lo relativo a crear carpetas o directorios, listar directorios, borrarlos, operar en definitiva con ellos. Va a repasar ahora en la biblioteca, para tener claros los conceptos y cuando llegue de vuelta a casa, probar a compilar algunos ejemplos que a ella misma se le ocurran.

Has visto en los apartados anteriores cmo operar en ficheros: abrirlos, cerrarlos, escribir en ellos, etc. Lo que no hemos visto es lo relativo a crear y borrar directorios, poder filtrar archivos, es decir, buscarsloaquellosquetengandeterminadacaracterstica,porejemplo,quesuextensinsea:.txt. Ahora veremos cmo hacer estas cosas, y tambin como borrar ficheros, y crearlos, aunque crearlos yalohemosvistoenalgunosejemplosanteriores.

Parasaberms Accediendoaesteenlace,tendrsunavisindetalladasobrelaorganizacindeficheros. OrganizacindeFicherosyMtodosdeEnlacehttp://www.um.es/docencia/barzana/IAGP/Iagp7.html

7.1.ClaseFile.
LaclaseFileproporcionaunarepresentacinabstractadeficherosydirectorios. Esta clase, permite examinar y manipular archivos y directorios, independientemente de la plataformaenlaqueseesttrabajando:Linux,Windows,etc. LasinstanciasdelaclaseFilerepresentannombresdearchivo,nolosarchivosensmismos. El archivo correspondiente a un nombre dado podra ser que no existiera, por ello, habr que controlarlasposiblesexcepciones. AltrabajarconFile,lasrutaspuedenser:

Relativasaldirectorioactual. Absolutassilarutaquelepasamoscomoparmetroempiezapor Labarra"/"enUnix,Linux. Letradeunidad(C:,D:,etc.)enWindows. UNC(universalnamingconvention)enwindows,comoporejemplo:

File miFile=new File("\\\\mimaquina\\download\\prueba.txt");

AtravsdelobjetoFile,unprogramapuedeexaminarlosatributosdelarchivo,cambiarsunombre, borrarlo o cambiar sus permisos. Dado un objeto file, podemos hacer las siguientes operaciones conl:

Renombrarelarchivo,conelmtodorenameTo() (Consisteenunaseriedesentenciasparallevaracabouna accin. Un mtodo est asociado a una clase. Puede tener parmetros de entrada y puede devolver un valor de retorno). El objeto File dejar de referirse al archivo renombrado, ya que el String con el nombre del archivoenelobjetoFilenocambia.

30

DesarrollodeAplicacionesWeb

Tema6

Borrar el archivo, con el mtodo delete(). Tambin, con deleteOnExit() se borra cuando finalizalaejecucindelamquinavirtualJava. Crear un nuevo fichero con un nombre nico. El mtodo esttico createTempFile() crea un fichero temporal y devuelve un objeto File que apunta a l. Es til para crear archivos temporales,queluegoseborran,asegurndonostenerunnombredearchivonorepetido. Establecer la fecha y la hora de modificacin del archivo con setLastModified(). Por File("prueba.txt").setLastModified(new ejemplo, se podra hacer: new Date().getTime()); para establecerle la fecha actual al fichero que se le pasa como parmetro,enestecasoprueba.txt. Crear un directorio con el mtodo mkdir(). Tambin existe mkdirs(), que crea los directoriossuperioressinoexisten. Listar el contenido de un directorio. Los mtodos list() y listFiles() listan el contenido de un directorio list() devuelve un vector de String con los nombres de los archivos, listFiles()devuelveunvectordeobjetosFile. Listar los nombres de archivo de la raz del sistema de archivos, mediante el mtodo esttico listRoots().

Un objeto de la clase File representa un fichero en s mismo. Verdadero o falso? Verdadero.

Falso.

7.2.InterfaceFilenameFilter.
Enocasionesnosinteresaverlalistadelosarchivosqueencajanconundeterminadocriterio. As, nos puede interesar un filtro para ver los ficheros modificados despus de una fecha, o los que tienenuntamaomayordelqueindiquemos,etc. El interface FilenameFilter se puede usar para crear filtros que establezcan criterios de filtrado relativos al nombre de los ficheros. Una clase que lo implemente debe definir e implementar el mtodo:
boolean accept(File dir, String nombre)

Este mtodo devolver verdadero (true), en el caso de que el fichero cuyo nombre se indica en el parmetronombreaparezcaenlalistadelosficherosdeldirectorioindicadoporelparmetrodir. En el siguiente ejemplo vemos cmo se listan los ficheros de la carpeta c:\datos que tengan la extensin .odt. Usamos try y catch para capturar las posibles excepciones, como que no exista dichacarpeta.
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package filtrarficheros; import java.io.File; import java.io.FilenameFilter; public class Filtro implements FilenameFilter { String extension; Filtro(String extension){ this.extension=extension; } public boolean accept(File dir, String name){ return name.endsWith(extension); }

31

Almacenandodatos

DAW

public static void main(String[] args) { try { File fichero=new File("c:\\datos\\."); String[] listadeArchivos = fichero.list(); listadeArchivos = fichero.list(new Filtrar(".odt")); int numarchivos = listadeArchivos.length ; if (numarchivos < 1) System.out.println("No hay archivos que listar"); else { for(int conta = 0; conta < listadeArchivos.length; conta++) System.out.println(listadeArchivos[conta]); } } catch (Exception ex) { System.out.println("Error al buscar en la ruta indicada"); } } }

Una clase que implemente FileNameFilter puede o no implementar el mtodo accept. Verdadero.

Falso.

7.3.Creacinyeliminacindeficherosydirectorios.
Podemoscrearunficherodelsiguientemodo:

Creamoselobjetoqueencapsulaelfichero,porejemplo,suponiendoquevamosacrearun ficherollamadomiFichero.txt,enlacarpetaC:\\prueba,haramos:

File fichero = new File("c:\\prueba\\miFichero.txt");

ApartirdelobjetoFile creamoselficherofsicamente,conlasiguienteinstruccin,que devuelveunbooleanconvalortruesisecrecorrectamente,ofalsesinosepudocrear:

fichero.createNewFile()

Para borrar un fichero, podemos usar la clase File, comprobando previamente si existe, del siguientemodo:

Fijamoselnombredelacarpetaydelficherocon:

File fichero = new File("C:\\prueba", "agenda.txt");

Comprobamossiexisteelficheroconexists()ysiesasloborramoscon:

fichero.delete();

Paracreardirectorios,podramoshacer:
package crearcarpetas; import java.io.File; /** * * @author JJBH */ public class CrearDirec { public static void main(String[] args) { try { // Declaracin de variables

32

DesarrollodeAplicacionesWeb

Tema6

String directorio = "C:\\micarpeta"; String varios = "carpeta1/carpeta2/carpeta3"; // Crear un directorio boolean exito = (new File(directorio)).mkdir(); if (exito) System.out.println("Directorio: " + directorio + " creado"); // Crear varios directorios exito = (new File(varios)).mkdirs(); if (exito) System.out.println("Directorios: " + varios + " creados"); }catch (Exception e){ System.err.println("Error: " + e.getMessage()); } } }

Para borrar un directorio con Java tenemos que borrar cada uno de los ficheros y directorios que ste contenga. Al poder almacenar otros directorios, se podra recorrer recursivamente el directorio parairborrandotodoslosficheros. Sepuedelistarelcontenidodeldirectoriocon:
File[] ficheros = directorio.listFiles();

y entonces poder ir borrando. Si el elemento es un directorio, lo sabemos mediante el mtodo isDirectory,


33

Almacenandodatos

DAW

8.Almacenamientodeobjetosenficheros.Persistencia.Serializacin.
Caso prctico Para la aplicacin de la clnica veterinaria Mara le propone a Juan emplear un fichero para guardar los datos de los clientes de la clnica. -Como vamos a guardar datos de la clase Cliente, tendremos que serializar los datos.

Queslaserializacin?Esunprocesoporelqueunobjetoseconvierteenunasecuenciadebytes con la que ms tarde se podr reconstruir el valor de sus variables. Esto permite guardar un objeto enunarchivo. Paraserializarunobjeto:

ste debe implementar el interface java.io.Serializable. Este interface no tiene mtodos, slo se usa para informar a la JVM (Java Virtual Machine) que un objeto va a ser serializado. TodoslosobjetosincluidosenltienenqueimplementarelinterfazSerializable. Todos los tipos primitivos en Java son serializables por defecto. (Al igual que los arrays y otros muchostiposestndar). Paraleeryescribirobjetosserializablesaunstreamseutilizanlasclasesjava:ObjectInputStream yObjectOutputStream. En el siguiente ejemplo se puede ver cmo leer un objeto serializado que se guard antes. En este caso,setratadeunStringserializado:
FileInputStream fich = new FileInputStream(str.out); ObjectInputStream os = new ObjectInputStream(fich); Object o = os.readObject();

As vemos que readObject lee un objeto desde el flujo de entrada fich. Cuando se leen objetos desdeunflujo,sedebetenerencuentaqutipodeobjetosseesperanenelflujo,ysehandeleeren elmismoordenenqueseguardaron.

Para serializar un fichero basta con implementar el interface Serializable. Verdadero. Falso. Parasaberms Enelsiguienteenlaceapuedesverunpocomssobreserializacin. SerializacinenJava.http://nereida.deioc.ull.es/~cleon/psd/0405/prct/p5/pspdf/p5.ps MssobreserializacinenJava.http://www2.uah.es/jcaceres/cursos/java/archivos/capsulas/capsula_serializable.pdf

8.1.Serializacin:utilidad.
La serializacin en Java se desarroll para utilizarse con RMI. RMI necesitaba un modo de convertir los parmetros necesarios a enviar a un objeto en una mquina remota, y tambin para devolver valores desde ella, en forma de flujos de bytes. Para datos primitivos es fcil, pero para objetos ms complejosnotanto,yesemecanismoesprecisamenteloqueproporcionalaserializacin. El mtodo writeObject se utiliza para guardar un objeto a travs de un flujo de salida. El objeto pasadoawriteObjectdebeimplementarelinterfazSerializable.

34

DesarrollodeAplicacionesWeb

Tema6

FileOutputStream fisal = new FileOutputStream(cadenas.out); ObjectOutputStream oos = new ObjectOutputStream(fisal); Oos.writeObject();

LaserializacindeobjetosseempleatambinenlaarquitecturadecomponentessoftwareJavaBean. Las clases bean se cargan en herramientas de construccin de software visual, como NetBeans. Con la paleta de diseo se puede personalizar el bean asignando fuentes, tamaos, texto y otras propiedades. Una vez que se ha personalizado el bean, para guardarlo, se emplea la serializacin: se almacena el objeto con el valor de sus campos en un fichero con extensin .ser, que suele emplazarse dentro de unfichero.jar.

Parasaberms Enesteenlaceapuedesverunvdeoenelquesecreaunaaplicacinsobreserializacin.No esthechaconNetBeans,sinoconEclipse,peroesonopresentaningninconveniente. http://www.youtube.com/watch?v=4eU6WMOVMh4&feature=player_embedded


35

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