You are on page 1of 58

1

INDICE DEL MANUAL DE JAVA


Introduccin a Java - Introduccin al lenguaje de programacin Java Origen de Java - Como empez y porque se dise este lenguaje. Caractersticas de Java - Propiedades que caracterizan a este lenguaje. Instalacin del JSDK - Preparando nuestro PC para desarrollar en Java Conceptos Bsicos - Antes de empezar. Programacin - Empezando a ver la programacin en Java Control de Flujo - El nucleo de todo programa est en el control de flujo. Clases - En Java todo forma parte de una clase Variables y Mtodos de Instancia - Gracias a estos elmentos podremos guardar datos y ejecutar varias instrucciones. Alcance de Objetos y Reciclado de Memoria - Como Java gestiona la memoria Herencia - Esta propiedad de las clases agilizar nuestra tarea como programadores. Control de Acceso - Esta caracterstica es muy util a la hora de publicar clases. Variables y Mtodos Estticos - Permite compartir variables entre instancias this y super - Variables especiales para referirnos a la propia clase o una clase padre. Clases Abstractas - Con ellas es posible definir una especie de plantillas para clases. Interfaces - Similares a las clases abstractas, pero no provocan interferencias. Mtodos Nativos Paquetes - La bibliotecas de Java pueden distribuirse en paquetes. Referencias - Son muy tiles para recorrer vectores de objetos Referencias y Arrays - Creacin de arrays de referencias Referencias y Listas - Las listas enlazadas permiten insertar y eliminar elementos en cualquier posicin. Una mnima aplicacin - Empezando a programar en Java. Compilacin y Ejecucin de Hola Mundo - Haciendo funcionar el primer ejemplo. Un Applet Bsico - Los Applets son aplicaciones Java que se pueden poner en una pgina web. La Clase Math - Sern muy tiles en cualquier tipo de programa, sobre todo en programas que trabajen con grficos. La Clase Character - Funciones relacionadas con los caracteres. La Clase Float - Nmeros en coma flotante (Decimales). La Clase Double - Muy til cuando se trabaja con nmeros grandes. La Clase Integer - Funciones relacionadas con los nmeros enteros La Clase Long - Funciones relacionadas con este tipo de datos numricos. La Clase Boolean - til para sentencias de control, if, while, for. La Clase String - Necesaria para trabajar con textos. La Clase StringBuffer - Parecia a la clase String, pero permite muchas ms manipulaciones Uso de Conversiones - En muchos casos necesitamos pasar de un tipo de variable a otro. Manejo de Excepciones - Ideales para controlar los posibles errores de ejecucin. Generar Excepciones - Como lanzar una excepcin cuando ocurre un error. Excepciones Predefinidas - Excepciones que proporciona Java. Crear Excepciones - Java nos permite crear nuestras propias excepciones. Capturar Excepciones - Como marcar y manejar las zonas con un posible error. Propagacin de Excepciones - Propiedad a tener en cuenta de las excepciones. Entrada/Salida Estndar - La Entrada/Salida estandar permite que los programas se comuniquen con el teclado y la pantalla. Ficheros - Creacin, acceso, edicin, de Ficheros. Streams de Entrada - Gracias a ellos es posible abrir y leer archivos. Streams de Salida - Igual que la anterior, pero en este caso se utiliza para escribir. Ficheros de Acceso Aleatorio - Acceso simultneo de escritura y lectura a un archivo

MANUAL DE JAVA

INTRODUCCION A JAVA
El uso principal que se hace de Internet e incluso de las redes internas (corporativas) es correo electrnico (e-mail), aunque actualmente hay un auge sorprendente de la navegacin web . Los documentos web pueden contener variedad de texto, grficos de todas clases y proporcionar enlaces hipertexto hacia cualquier lugar de la red. Los navegadores utilizan documentos escritos en lenguaje HTML. La combinacin actual de navegadores HTML/WWW estn limitados pues, a texto y grficos. Si se quiere reproducir un sonido o ejecutar un programa de demostracin, primero hemos de bajarnos (download) el fichero en cuestin y luego utilizar un programa en nuestro ordenador capaz de entender el formato de ese fichero, o bien cargar un mdulo ( plug-in ) en nuestro navegador para que pueda interpretar el fichero que hemos bajado. Hasta ahora, la nica forma de realizar una pgina web con contenido interactivo, era mediante la interfaz CGI (Common Gateway Interface), que permite pasar parmetros entre formularios definidos en lenguaje HTML y programas escritos en Perl o en C. Esta interfaz resulta muy incmoda de programar y es pobre en sus posibilidades. El lenguaje Java y los navegadores con soporte Java, proporcionan una forma diferente de hacer que ese navegador sea capaz de ejecutar programas. Con Java se puede reproducir sonido directamente desde el navegador, se pueden visitar home pages con animaciones, se puede ensear al navegador a manejar nuevos formatos de ficheros, e incluso, cuando se pueda transmitir video por las lneas telefnicas, nuestro navegador estar preparado para mostrar esas imgenes. Utilizando Java, se pueden eliminar los inconvenientes de la interfaz CGI y tambin se pueden aadir aplicaciones que vayan desde experimentos cientficos interactivos de propsito educativo a juegos o aplicaciones especializadas para la televenta. Es posible implementar publicidad interactiva y peridicos personalizados. Por ejemplo, alguien podra escribir un programa Java que implementara una simulacin qumica interactiva (una cadena de adn). Utilizando un navegador con soporte Java, un usuario podra recibir fcilmente esa simulacin e interaccionar con ella, en lugar de conseguir simplemente un dibujo esttico y algo de texto. Lo recibido cobra vida . Adems, con Java podemos estar seguros de que el cdigo que hace funcionar el experimento qumico no contiene ningn trozo de cdigo malicioso que dae al sistema. El cdigo que intente actuar destructivamente o que contenga errores, no podr traspasar los muros defensivos colocados por las caractersticas de seguridad y robustez de Java. Adems, Java proporciona una nueva forma de acceder a las aplicaciones. El software viaja transparentemente a travs de la red. No hay necesidad de instalar las aplicaciones, ellas mismas vienen cuando se necesitan. Por ejemplo, la mayora de los navegadores del Web pueden procesar un reducido nmero de formatos grficos (tpicamente GIF y JPEG). Si se encuentran con otro tipo de formato, el navegador estndar no tiene capacidad para procesarlo, tendra que ser actualizado para poder aprovechar las ventajas del nuevo formato. Sin embargo, un navegador con soporte Java puede enlazar con el servidor que contiene el algoritmo que procesa ese nuevo formato y mostrar la imagen. Por lo tanto, si alguien inventa un nuevo algoritmo de compresin para imgenes, el inventor slo necesita estar seguro de que hay una copia en cdigo Java de ese algoritmo instalada en el servidor que contiene las imgenes que quiere publicar. Es decir, los navegadores con soporte Java se actualizan a s mismos sobre la marcha, cuando encuentran un nuevo tipo de fichero o algoritmo.

MANUAL DE JAVA

ORIGEN DE JAVA
El uso principal que se hace de Internet e incluso de las redes internas (corporativas) es correo electrnico (e-mail), aunque actualmente hay un auge sorprendente de la navegacin web . Los documentos web pueden contener variedad de texto, grficos de todas clases y proporcionar enlaces hipertexto hacia cualquier lugar de la red. Los navegadores utilizan documentos escritos en lenguaje HTML. La combinacin actual de navegadores HTML/WWW estn limitados pues, a texto y grficos. Si se quiere reproducir un sonido o ejecutar un programa de demostracin, primero hemos de bajarnos (download) el fichero en cuestin y luego utilizar un programa en nuestro ordenador capaz de entender el formato de ese fichero, o bien cargar un mdulo ( plug-in ) en nuestro navegador para que pueda interpretar el fichero que hemos bajado. Hasta ahora, la nica forma de realizar una pgina web con contenido interactivo, era mediante la interfaz CGI ( Common Gateway Interface ), que permite pasar parmetros entre formularios definidos en lenguaje HTML y programas escritos en Perl o en C. Esta interfaz resulta muy incmoda de programar y es pobre en sus posibilidades. El lenguaje Java y los navegadores con soporte Java, proporcionan una forma diferente de hacer que ese navegador sea capaz de ejecutar programas. Con Java se puede reproducir sonido directamente desde el navegador, se pueden visitar home pages con animaciones, se puede ensear al navegador a manejar nuevos formatos de ficheros, e incluso, cuando se pueda transmitir video por las lneas telefnicas, nuestro navegador estar preparado para mostrar esas imgenes. Utilizando Java, se pueden eliminar los inconvenientes de la interfaz CGI y tambin se pueden aadir aplicaciones que vayan desde experimentos cientficos interactivos de propsito educativo a juegos o aplicaciones especializadas para la televenta. Es posible implementar publicidad interactiva y peridicos personalizados. Por ejemplo, alguien podra escribir un programa Java que implementara una simulacin qumica interactiva (una cadena de adn). Utilizando un navegador con soporte Java, un usuario podra recibir fcilmente esa simulacin e interaccionar con ella, en lugar de conseguir simplemente un dibujo esttico y algo de texto. Lo recibido cobra vida . Adems, con Java podemos estar seguros de que el cdigo que hace funcionar el experimento qumico no contiene ningn trozo de cdigo malicioso que dae al sistema. El cdigo que intente actuar destructivamente o que contenga errores, no podr traspasar los muros defensivos colocados por las caractersticas de seguridad y robustez de Java. Adems, Java proporciona una nueva forma de acceder a las aplicaciones. El software viaja transparentemente a travs de la red. No hay necesidad de instalar las aplicaciones, ellas mismas vienen cuando se necesitan. Por ejemplo, la mayora de los navegadores del Web pueden procesar un reducido nmero de formatos grficos (tpicamente GIF y JPEG). Si se encuentran con otro tipo de formato, el navegador estndar no tiene capacidad para procesarlo, tendra que ser actualizado para poder aprovechar las ventajas del nuevo formato. Sin embargo, un navegador con soporte Java puede enlazar con el servidor que contiene el algoritmo que procesa ese nuevo formato y mostrar la imagen. Por lo tanto, si alguien inventa un nuevo algoritmo de compresin para imgenes, el inventor slo necesita estar seguro de que hay una copia en cdigo Java de ese algoritmo instalada en el servidor que contiene las imgenes que quiere publicar. Es decir, los navegadores con soporte Java se actualizan a s mismos sobre la marcha, cuando encuentran un nuevo tipo de fichero o algoritmo.

MANUAL DE JAVA

CARACTERISTICAS DE JAVA
Las caractersticas principales que nos ofrece Java respecto a cualquier otro lenguaje de programacin, son: Es SIMPLE : Java ofrece toda la funcionalidad de un lenguaje potente, pero sin las caractersticas menos usadas y ms confusas de stos. C++ es un lenguaje que adolece de falta de seguridad, pero C y C++ son lenguajes ms difundidos, por ello Java se dise para ser parecido a C++ y as facilitar un rpido y fcil aprendizaje. Java elimina muchas de las caractersticas de otros lenguajes como C++, para mantener reducidas las especificaciones del lenguaje y aadir caractersticas muy tiles como el garbage collector (reciclador de memoria dinmica). No es necesario preocuparse de liberar memoria, el reciclador se encarga de ello y como es un thread de baja prioridad, cuando entra en accin, permite liberar bloques de memoria muy grandes, lo que reduce la fragmentacin de la memoria. Java reduce en un 50% los errores ms comunes de programacin con lenguajes como C y C++ al eliminar muchas de las caractersticas de stos, entre las que destacan:
y y y y y y

aritmtica de punteros no existen referencias registros (struct) definicin de tipos (typedef) macros (#define) necesidad de liberar memoria (free)

Aunque, en realidad, lo que hace es eliminar las palabras reservadas (struct, typedef), ya que las clases son algo parecido. Adems, el intrprete completo de Java que hay en este momento es muy pequeo, solamente ocupa 215 Kb de RAM. Es ORIENTADO A OBJETOS : Java implementa la tecnologa bsica de C++ con algunas mejoras y elimina algunas cosas para mantener el objetivo de la simplicidad del lenguaje. Java trabaja con sus datos como objetos y con interfaces a esos objetos. Soporta las tres caractersticas propias del paradigma de la orientacin a objetos: encapsulacin, herencia y polimorfismo. Las plantillas de objetos son llamadas, como en C++, clases y sus copias, instancias . Estas instancias, como en C++, necesitan ser construidas y destruidas en espacios de memoria. Java incorpora funcionalidades inexistentes en C++ como por ejemplo, la resolucin dinmica de mtodos. Esta caracterstica deriva del lenguaje Objective C, propietario del sistema operativo Next. En C++ se suele trabajar con libreras dinmicas (DLLs) que obligan a recompilar la aplicacin cuando se retocan las funciones que se encuentran en su interior. Este inconveniente es resuelto por Java mediante una interfaz especfica llamada RTTI ( RunTime Type Identification ) que define la interaccin entre objetos excluyendo variables de instancias o implementacin de mtodos. Las clases en Java tienen una representacin en el runtime que permite a los programadores interrogar por el tipo de clase y enlazar dinmicamente la clase con el resultado de la bsqueda.
MANUAL DE JAVA

Es DISTRIBUIDO : Java se ha construido con extensas capacidades de interconexin TCP/IP. Existen libreras de rutinas para acceder e interactuar con protocolos como http y ftp . Esto permite a los programadores acceder a la informacin a travs de la red con tanta facilidad como a los ficheros locales. La verdad es que Java en s no es distribuido, sino que proporciona las libreras y herramientas para que los programas puedan ser distribuidos, es decir, que se corran en varias mquinas, interactuando. Es ROBUSTO : Java realiza verificaciones en busca de problemas tanto en tiempo de compilacin como en tiempo de ejecucin. La comprobacin de tipos en Java ayuda a detectar errores, lo antes posible, en el ciclo de desarrollo. Java obliga a la declaracin explcita de mtodos, reduciendo as las posibilidades de error. Maneja la memoria para eliminar las preocupaciones por parte del programador de la liberacin o corrupcin de memoria. Tambin implementa los arrays autnticos , en vez de listas enlazadas de punteros, con comprobacin de lmites, para evitar la posibilidad de sobreescribir o corromper memoria resultado de punteros que sealan a zonas equivocadas. Estas caractersticas reducen drsticamente el tiempo de desarrollo de aplicaciones en Java. Adems, para asegurar el funcionamiento de la aplicacin, realiza una verificacin de los bytecodes , que son el resultado de la compilacin de un programa Java. Es un cdigo de mquina virtual que es interpretado por el intrprete Java. No es el cdigo mquina directamente entendible por el hardware, pero ya ha pasado todas las fases del compilador: anlisis de instrucciones, orden de operadores, etc., y ya tiene generada la pila de ejecucin de rdenes. Java proporciona, pues:
y y y y

Comprobacin de punteros Comprobacin de lmites de arrays Excepciones Verificacin de byte-codes

Es de ARQUITECTURA NEUTRAL : Para establecer Java como parte integral de la red, el compilador Java compila su cdigo a un fichero objeto de formato independiente de la arquitectura de la mquina en que se ejecutar. Cualquier mquina que tenga el sistema de ejecucin ( run-time ) puede ejecutar ese cdigo objeto, sin importar en modo alguno la mquina en que ha sido generado. Actualmente existen sistemas run-time para Solaris 2.x, SunOs 4.1.x, Windows 95, Windows NT, Linux, Irix, Aix, Mac, Apple y probablemente haya grupos de desarrollo trabajando en el porting a otras plataformas.

MANUAL DE JAVA

El cdigo fuente Java se "compila" a un cdigo de bytes de alto nivel independiente de la mquina. Este cdigo (byte-codes) est diseado para ejecutarse en una mquina hipottica que es implementada por un sistema run-time, que s es dependiente de la mquina. En una representacin en que tuvisemos que indicar todos los elementos que forman parte de la arquitectura de Java sobre una plataforma genrica, obtendramos una figura como la siguiente:

En ella podemos ver que lo verdaderamente dependiente del sistema es la Mquina Virtual Java (JVM) y las libreras fundamentales, que tambin nos permitiran acceder directamente al hardware de la mquina. Adems, habr APIs de Java que tambin entren en contacto directo con el hardware y sern dependientes de la mquina, como ejemplo de este tipo de APIs podemos citar:
y

Java 2D: grficos 2D y manipulacin de imgenes


MANUAL DE JAVA

7
y y y y y

Java Media Framework : Elementos crticos en el tiempo: audio, video... Java Animation: Animacin de objetos en 2D Java Telephony: Integracin con telefona Java Share: Interaccin entre aplicaciones multiusuario Java 3D: Grficos 3D y su manipulacin

Es SEGURO : La seguridad en Java tiene dos facetas. En el lenguaje, caractersticas como los punteros o el casting implcito que hacen los compiladores de C y C++ se eliminan para prevenir el acceso ilegal a la memoria. Cuando se usa Java para crear un navegador, se combinan las caractersticas del lenguaje con protecciones de sentido comn aplicadas al propio navegador. El lenguaje C, por ejemplo, tiene lagunas de seguridad importantes, como son los errores de alineacin . Los programadores de C utilizan punteros en conjuncin con operaciones aritmticas. Esto le permite al programador que un puntero referencie a un lugar conocido de la memoria y pueda sumar (o restar) algn valor, para referirse a otro lugar de la memoria. Si otros programadores conocen nuestras estructuras de datos pueden extraer informacin confidencial de nuestro sistema. Con un lenguaje como C, se pueden tomar nmeros enteros aleatorios y convertirlos en punteros para luego acceder a la memoria:
printf( "Escribe un valor entero: " ); scanf( "%u",&puntero ); printf( "Cadena de memoria: %sn",puntero );

Otra laguna de seguridad u otro tipo de ataque, es el Caballo de Troya . Se presenta un programa como una utilidad, resultando tener una funcionalidad destructiva. Por ejemplo, en UNIX se visualiza el contenido de un directorio con el comando ls . Si un programador deja un comando destructivo bajo esta referencia, se puede correr el riesgo de ejecutar cdigo malicioso, aunque el comando siga haciendo la funcionalidad que se le supone, despus de lanzar su carga destructiva. Por ejemplo, despus de que el caballo de Troya haya enviado por correo el /etc/shadow a su creador, ejecuta la funcionalidad de ls persentando el contenido del directorio. Se notar un retardo, pero nada inusual. El cdigo Java pasa muchos tests antes de ejecutarse en una mquina. El cdigo se pasa a travs de un verificador de byte-codes que comprueba el formato de los fragmentos de cdigo y aplica un probador de teoremas para detectar fragmentos de cdigo ilegal -cdigo que falsea punteros, viola derechos de acceso sobre objetos o intenta cambiar el tipo o clase de un objeto-. Si los byte-codes pasan la verificacin sin generar ningn mensaje de error, entonces sabemos que:
y y y y y

El cdigo no produce desbordamiento de operandos en la pila El tipo de los parmetros de todos los cdigos de operacin son conocidos y correctos No ha ocurrido ninguna conversin ilegal de datos, tal como convertir enteros en punteros El acceso a los campos de un objeto se sabe que es legal: public, private, protected No hay ningn intento de violar las reglas de acceso y seguridad establecidas

El Cargador de Clases tambin ayuda a Java a mantener su seguridad, separando el espacio de nombres del sistema de ficheros local, del de los recursos procedentes de la red. Esto limita cualquier aplicacin del tipo Caballo de Troya , ya que las clases se buscan primero entre las locales y luego entre las procedentes del exterior.

MANUAL DE JAVA

Las clases importadas de la red se almacenan en un espacio de nombres privado, asociado con el origen. Cuando una clase del espacio de nombres privado accede a otra clase, primero se busca en las clases predefinidas (del sistema local) y luego en el espacio de nombres de la clase que hace la referencia. Esto imposibilita que una clase suplante a una predefinida. En resumen, las aplicaciones de Java resultan extremadamente seguras, ya que no acceden a zonas delicadas de memoria o de sistema, con lo cual evitan la interaccin de ciertos virus. Java no posee una semntica especfica para modificar la pila de programa, la memoria libre o utilizar objetos y mtodos de un programa sin los privilegios del kernel del sistema operativo. Adems, para evitar modificaciones por parte de los crackers de la red, implementa un mtodo ultraseguro de autentificacin por clave pblica. El Cargador de Clases puede verificar una firma digital antes de realizar una instancia de un objeto. Por tanto, ningn objeto se crea y almacena en memoria, sin que se validen los privilegios de acceso. Es decir, la seguridad se integra en el momento de compilacin, con el nivel de detalle y de privilegio que sea necesario. Dada, pues la concepcin del lenguaje y si todos los elementos se mantienen dentro del estndar marcado por Sun, no hay peligro. Java imposibilita, tambin, abrir ningn fichero de la mquina local (siempre que se realizan operaciones con archivos, stas trabajan sobre el disco duro de la mquina de donde parti el applet), no permite ejecutar ninguna aplicacin nativa de una plataforma e impide que se utilicen otros ordenadores como puente, es decir, nadie puede utilizar nuestra mquina para hacer peticiones o realizar operaciones con otra. Adems, los intrpretes que incorporan los navegadores de la Web son an ms restrictivos. Bajo estas condiciones (y dentro de la filosofa de que el nico ordenador seguro es el que est apagado, desenchufado, dentro de una cmara acorazada en un bunker y rodeado por mil soldados de los cuerpos especiales del ejrcito), se puede considerar que Java es un lenguaje seguro y que los applets estn libres de virus. Respecto a la seguridad del cdigo fuente, no ya del lenguaje, JDK proporciona un desemsamblador de byte-code, que permite que cualquier programa pueda ser convertido a cdigo fuente, lo que para el programador significa una vulnerabilidad total a su cdigo. Utilizando javap no se obtiene el cdigo fuente original, pero s desmonta el programa mostrando el algoritmo que se utiliza, que es lo realmente interesante. La proteccin de los programadores ante esto es utilizar llamadas a programas nativos, externos (incluso en C o C++) de forma que no sea descompilable todo el cdigo; aunque as se pierda portabilidad. Esta es otra de las cuestiones que Java tiene pendientes. Es PORTABLE : Ms all de la portabilidad bsica por ser de arquitectura independiente, Java implementa otros estndares de portabilidad para facilitar el desarrollo. Los enteros son siempre enteros y adems, enteros de 32 bits en complemento a 2. Adems, Java construye sus interfaces de usuario a travs de un sistema abstracto de ventanas de forma que las ventanas puedan ser implantadas en entornos Unix, Pc o Mac. Es INTERPRETADO : El intrprete Java (sistema run-time) puede ejecutar directamente el cdigo objeto. Enlazar (linkar) un programa, normalmente, consume menos recursos que compilarlo, por lo que los desarrolladores con Java pasarn ms tiempo desarrollando y menos esperando por el ordenador. No obstante, el compilador actual del JDK es bastante lento. Por ahora, que todava no hay compiladores especficos de Java para las diversas plataformas, Java es ms lento que otros lenguajes de programacin, como C++, ya que debe ser interpretado y no ejecutado como sucede en cualquier programa tradicional.

MANUAL DE JAVA

Se dice que Java es de 10 a 30 veces ms lento que C, y que tampoco existen en Java proyectos de gran envergadura como en otros lenguajes. La verdad es que ya hay comparaciones ventajosas entre Java y el resto de los lenguajes de programacin, y una ingente cantidad de folletos electrnicos que supuran fanatismo en favor y en contra de los distintos lenguajes contendientes con Java. Lo que se suele dejar de lado en todo esto, es que primero habra que decidir hasta que punto Java, un lenguaje en pleno desarrollo y todava sin definicin definitiva, est maduro como lenguaje de programacin para ser comparado con otros; como por ejemplo con Smalltalk, que lleva ms de 20 aos en cancha. La verdad es que Java para conseguir ser un lenguaje independiente del sistema operativo y del procesador que incorpore la mquina utilizada, es tanto interpretado como compilado. Y esto no es ningn contrasentido, me explico, el cdigo fuente escrito con cualquier editor se compila generando el byte-code. Este cdigo intermedio es de muy bajo nivel, pero sin alcanzar las instrucciones mquina propias de cada plataforma y no tiene nada que ver con el p-code de Visual Basic. El byte-code corresponde al 80% de las instrucciones de la aplicacin. Ese mismo cdigo es el que se puede ejecutar sobre cualquier plataforma. Para ello hace falta el run-time, que s es completamente dependiente de la mquina y del sistema operativo, que interpreta dinmicamente el byte-code y aade el 20% de instrucciones que faltaban para su ejecucin. Con este sistema es fcil crear aplicaciones multiplataforma, pero para ejecutarlas es necesario que exista el run-time correspondiente al sistema operativo utilizado. Es MULTITHREADED : Al ser multithreaded (multihilvanado, en mala traduccin), Java permite muchas actividades simultneas en un programa. Los threads (a veces llamados, procesos ligeros), son bsicamente pequeos procesos o piezas independientes de un gran proceso. Al estar los threads contruidos en el lenguaje, son ms fciles de usar y ms robustos que sus homlogos en C o C++. El beneficio de ser miltithreaded consiste en un mejor rendimiento interactivo y mejor comportamiento en tiempo real. Aunque el comportamiento en tiempo real est limitado a las capacidades del sistema operativo subyacente (Unix, Windows, etc.), an supera a los entornos de flujo nico de programa (single-threaded) tanto en facilidad de desarrollo como en rendimiento. Cualquiera que haya utilizado la tecnologa de navegacin concurrente, sabe lo frustrante que puede ser esperar por una gran imagen que se est trayendo. En Java, las imgenes se pueden ir trayendo en un thread independiente, permitiendo que el usuario pueda acceder a la informacin en la pgina sin tener que esperar por el navegador. Es DINAMICO : Java se beneficia todo lo posible de la tecnologa orientada a objetos. Java no intenta conectar todos los mdulos que comprenden una aplicacin hasta el tiempo de ejecucin. Las librera nuevas o actualizadas no paralizarn las aplicaciones actuales (siempre que mantengan el API anterior).

MANUAL DE JAVA

10

Java tambin simplifica el uso de protocolos nuevos o actualizados. Si su sistema ejecuta una aplicacin Java sobre la red y encuentra una pieza de la aplicacin que no sabe manejar, tal como se ha explicado en prrafos anteriores, Java es capaz de traer automticamente cualquiera de esas piezas que el sistema necesita para funcionar.

Java, para evitar que los mdulos de byte-codes o los objetos o nuevas clases, haya que estar trayndolos de la red cada vez que se necesiten, implementa las opciones de persistencia, para que no se eliminen cuando de limpie la cach de la mquina.

INSTALACION DEL JSDK


El SDK de Java (JSDK) se proporciona gratuitamente desde la web de SUN. Para los ejemplos que aparecen en este manual la versin ms idnea es J2SE (Java 2 Standardad Edition). Es la distribucin base que cualquier kit de Java necesitar. Se puede obtener desde aqu http://java.sun.com/j2se/1.4.2/download.html Adems, en esa misma direccin podremos descargar el NetBeans, un potente editor de Java que nos facilitar la tarea de programar, compilar y resolver errores entre otras muchas cosas. Java es actualmente uno de los lenguajes ms populares y existen multitud de editores para l. Los ms conocidos son el JDeveloper, JBuilder, Visual J++ y por supuesto el propio NetBeans, de SUN. Sin embargo, aqu trataremos solo el uso del SDK, sin editor, ya que es lo ms recomendable. Si sabemos utilizar el SDK sin herramientas adicionales, tendremos mayor facilidad para usar cualquier editor y siempre que estemos faltos de algn editor, podremos salir del paso sin l. Las herramientas que trae el SDK y que ms utilizaremos son:
MANUAL DE JAVA

11

java (ejecutable): Ejecuta cualquier programa compilado de Java javac (compilador): Compilar el cdigo fuente escrito en Java. Java no se ofrece de forma gratuita. No todas las mquinas disponen de la versin del Java Development Kit para ejecutarse en ellas. Por ello, solamente comentar la instalacin de JDK en Solaris, Windows y Linux. Actualmente ya hay entornos de desarrollo integrados completos para Java, diferentes del JDK de Sun. Oracle dispone de un entorno de desarrollo de Java, la propia SUN ofrece el entorno NetBeans y Borland posee el JBuilder. Adems Microsoft ofrece soporte Java en su plataforma .NET. No obstante, trataremos solamente el JDK. El entorno bsico del JDK de Java que proporciona Sun est formado por herramientas en modo texto, que son: java, intrprete que ejecuta programas en byte-code. javac, compilador de Java que convierte el cdigo fuente en byte-code. javah, crea ficheros de cabecera para implementar mtodos para cualquier clase. javap, es un descompilador de byte-code a cdigo fuente Java. javadoc, es un generador automtico de documentos HTML a partir del cdigo fuente Java. javaprof, es un profiler para aplicaciones de un solo thread. El entorno habitual pues, consiste en un navegador que pueda ejecutar applets, un compilador que convierta el cdigo fuente Java a byte-code y el intrprete Java para ejecutar los programas. Estos son los componenetes bsicos para desarrollar algo en Java. No obstante se necesita un editor para escribir el cdigo fuente, y no son estrictamente necesarias otras herramientas como el debugger, un entorno visual, la documentacin o un visualizador de jerarqua de clases. Cualquier navegador actual servir para mostrar los Applets Java que realicemos. La instalacin en un principio es como la de cualquier otro programa, pero una vez lo hayamos instalado tenemos que incluir en el path del sistema operativo la ruta hacia el directorio bin. Por ejemplo si hemos instalado Java en: c:java En el PATH de nuestro sistema operativo debe estar presente la ruta: c:javabin

En Windows XP, para cambiar las variables del sistema, se debe ir a Inicio > Configuracin > Panel de Control > Sistema > Opciones Avanzadas > Variables de entorno. Una vez hecho esto, abrimos la consola, Inicio > Ejecutar > cmd y ya deberan estar disponibles los comandos "java" y "javac". En Linux la instalacin es muy similar.

MANUAL DE JAVA

12

CONCEPTOS BASICOS
Ahora que ya hemos visto a grandes rasgos lo que Java puede ofrecernos, y antes de entrar a saco en la generacin de nuestro primer cdigo Java, vamos a echar un vistazo al lenguaje Java en s. Lo bsico resultar muy familiar a los que tengan conocimientos de C/C++. Los programadores con experiencia en otros lenguajes procedurales reconocern la mayor parte de las construcciones. Esperemos que este captulo no resulte demasiado intenso, no obstante, s debe estar presente, porque ms de una vez recurriremos a l como referencia. En posteriores captulos profundizaremos sobre aspectos de la programacin en Java por los que aqu pasaremos de puntillas e iremos presentando ejemplos de cdigo de cada uno de esos aspectos de la programacin en Java.

PROGRAMACION
Cuando se programa en Java, se coloca todo el cdigo en mtodos, de la misma forma que se escriben funciones en lenguajes como C. Comentarios En Java hay tres tipos de comentarios:
// comentarios para una sola lnea /* comentarios de una o ms lneas */ /** comentario de documentacin, de una o ms lneas */

Los dos primeros tipos de comentarios son los que todo programador conoce y se utilizan del mismo modo. Los comentarios de documentacin, colocados inmediatamente antes de una declaracin (de variable o funcin), indican que ese comentario ha de ser colocado en la documentacin que se genera automticamente cuando se utiliza la herramienta de Java, javadoc. Dichos comentarios sirven como descripcin del elemento declarado permitiendo generar una documentacin de nuestras clases escrita al mismo tiempo que se genera el cdigo. En este tipo de comentario para documentacin, se permite la introduccin de algunos tokens o palabras clave, que harn que la informacin que les sigue aparezca de forma diferente al resto en la documentacin. Identificadores Los identificadores nombran variables, funciones, clases y objetos; cualquier cosa que el programador necesite identificar o usar. En Java, un identificador comienza con una letra, un subrayado (_) o un smbolo de dlar ($). Los siguientes caracteres pueden ser letras o dgitos. Se distinguen las maysculas de las minsculas y no hay longitud mxima. Seran identificadores vlidos:
identificador nombre_usuario Nombre_Usuario _variable_del_sistema $transaccion

y su uso sera, por ejemplo:


int contador_principal; char _lista_de_ficheros; float $cantidad_en_Ptas;

MANUAL DE JAVA

13

Palabras clave Las siguientes son las palabras clave que estn definidas en Java y que no se pueden utilizar como indentificadores:
abstract continue for new switch boolean default goto null synchronized break do if package this byte double implements private threadsafe byvalue else import protected throw case extends instanceof public transient catch false int return true char final interface short try class finally long static void const float native super while

Palabras Reservadas Adems, el lenguaje se reserva unas cuantas palabras ms, pero que hasta ahora no tienen un cometido especfico. Son:
cast future generic inner operator outer rest var

Literales Un valor constante en Java se crea utilizando una representacin literal de l. Java utiliza cinco tipos de elementos: enteros, reales en coma flotante, booleanos, caracteres y cadenas, que se pueden poner en cualquier lugar del cdigo fuente de Java. Cada uno de estos literales tiene un tipo correspondiente asociado con l. Enteros:
byte 8 bits complemento a dos short 16 bits complemento a dos int 32 bits complemento a dos long 64 bits complemento a dos Por ejemplo: 21 077 0xDC00

Reales en coma flotante:


float 32 bits IEEE 754 double 64 bits IEEE 754 Por ejemplo: 3.14 2e12 3.1E12

Booleanos:
true false

Caracteres:
Por ejemplo: a t u???? [????] es un nmero unicode

Cadenas: Por ejemplo: "Esto es una cadena literal" Arrays Se pueden declarar en Java arrays de cualquier tipo:
char s[]; int iArray[];

Incluso se pueden construir arrays de arrays:


int tabla[][] = new int[4][5];

MANUAL DE JAVA

14

Los lmites de los arrays se comprueban en tiempo de ejecucin para evitar desbordamientos y la corrupcin de memoria. En Java un array es realmente un objeto, porque tiene redefinido el operador []. Tiene una funcin miembro: length. Se puede utilizar este mtodo para conocer la longitud de cualquier array.
int a[][] = new int[10][3]; a.length; /* 10 */ a[0].length; /* 3 */

Para crear un array en Java hay dos mtodos bsicos. Crear un array vaco:
int lista[] = new int[50];

o se puede crear ya el array con sus valores iniciales:


String nombres[] = { "Juan","Pepe","Pedro","Maria" };

Esto que es equivalente a:


String nombres[]; nombres = new String[4]; nombres[0] = new String( "Juan" ); nombres[1] = new String( "Pepe" ); nombres[2] = new String( "Pedro" ); nombres[3] = new String( "Maria" );

No se pueden crear arrays estticos en tiempo de compilacin:


int lista[50]; // generar un error en tiempo de compilacin

Tampoco se puede rellenar un array sin declarar el tamao con el operador new:
int lista[]; for( int i=0; i < 9; i++ ) lista[i] = i;

Es decir, todos los arrays en Java son estticos. Para convertir un array en el equivalente a un array dinmico en C/C++, se usa la clase vector, que permite operaciones de insercin, borrado, etc. en el array. Operadores Los operadores de Java son muy parecidos en estilo y funcionamiento a los de C. En la siguiente tabla aparecen los operadores que se utilizan en Java, por orden de precedencia:
. [] () ++ -- ! ~ instanceof * / % + - << >> >>> < > <= >= == != & ^ | && || ? : = op= (*= /= %= += -= etc.) ,

Los operadores numricos se comportan como esperamos:


int + int = int

Los operadores relacionales devuelven un valor booleano. Para las cadenas, se pueden utilizar los operadores relacionales para comparaciones adems de + y += para la concatenacin:
String nombre = "nombre" + "Apellido";

El operador = siempre hace copias de objetos, marcando los antiguos para borrarlos, y ya se encargar el garbage collector de devolver al sistema la memoria ocupada por el objeto eliminado.
MANUAL DE JAVA

15

Separadores Slo hay un par de secuencias con otros caracteres que pueden aparecer en el cdigo Java; son los separadores simples, que van a definir la forma y funcin del cdigo. Los separadores admitidos en Java son: () - parntesis. Para contener listas de parmetros en la definicin y llamada a mtodos. Tambin se utiliza para definir precedencia en expresiones, contener expresiones para control de flujo y rodear las conversiones de tipo. {} - llaves. Para contener los valores de matrices inicializadas automticamente. Tambin se utiliza para definir un bloque de cdigo, para clases, mtodos y mbitos locales. [] - corchetes. Para declarar tipos matriz. Tambin se utiliza cuando se referencian valores de matriz. ; - punto y coma. Separa sentencias. , - coma. Separa identificadores consecutivos en una declaracin de variables. Tambin se utiliza para encadenar sentencias dentro de una sentencia for. . - punto. Para separar nombres de paquete de subpaquetes y clases. Tambin se utiliza para separar una variable o mtodo de una variable de referencia.

CONTROL DE FLUJO
Muchas de las sentencias de control del flujo del programa se han tomado del C: Sentencias de Salto if/else
if( Boolean ) { sentencias; } else { sentencias; }

switch
switch( expr1 ) { case expr2: sentencias; break; case expr3: sentencias; break; default: sentencias; break; }

Sentencias de Bucle Bucles for


for( expr1 inicio; expr2 test; expr3 incremento ) { sentencias; }

El siguiente trocito de cdigo Java que dibuja varias lneas en pantalla alternando sus colores entre rojo, azul y verde. Este fragmento sera parte de una funcin Java (mtodo):
int contador; for( contador=1; contador <= 12; contador++ ) { switch( contador % 3 ) { case 0: setColor( Color.red ); break; case 1: setColor( Color.blue ); break; case 2: setColor( Color.green ); break; } g.drawLine( 10,contador*10,80,contador*10 ); }

MANUAL DE JAVA

16

Tambin se soporta el operador coma (,) en los bucles for


for( a=0,b=0; a < 7; a++,b+=2 )

Bucles while
while( Boolean ) { sentencias; }

Bucles do/while
do { sentencias; }while( Boolean );

Excepciones try-catch-throw
try { sentencias; } catch( Exception ) { sentencias; }

Java implementa excepciones para facilitar la construccin de cdigo robusto. Cuando ocurre un error en un programa, el cdigo que encuentra el error lanza una excepcin, que se puede capturar y recuperarse de ella. Java proporciona muchas excepciones predefinidas. Control General del Flujo
break [etiqueta] continue [etiqueta] return expr; etiqueta: sentencia;

En caso de que nos encontremos con bucles anidados, se permite el uso de etiquetas para poder salirse de ellos, por ejemplo:
uno: for( ) { dos: for( ) { continue; // seguira en el bucle interno continue uno; // seguira en el bucle principal break uno; // se saldra del bucle principal } }

En el cdigo de una funcin siempre hay que ser consecuentes con la declaracin que se haya hecho de ella. Por ejemplo, si se declara una funcin para que devuelva un entero, es imprescindible que se coloque un return final para salir de esa funcin, independientemente de que haya otros en medio del cdigo que tambin provoquen la salida de la funcin. En caso de no hacerlo se generar un Warning, y el cdigo Java no se puede compilar con Warnings.
int func() { if( a == 0 ) return 1; return 0; // es imprescindible porque se retorna un entero }

CLASES
MANUAL DE JAVA

17

Las clases son lo ms simple de Java. Todo en Java forma parte de una clase, es una clase o describe como funciona una clase. El conocimiento de las clases es fundamental para poder entender los programas Java. Todas las acciones de los programas Java se colocan dentro del bloque de una clase o un objeto. Todos los mtodos se definen dentro del bloque de la clase, Java no soporta funciones o variables globales. Esto puede despistar a los programadores de C++, que pueden definir mtodos fuera del bloque de la clase, pero esta posibilidad es ms un intento de no separarse mucho y ser compatible con C, que un buen diseo orientado a objetos. As pues, el esqueleto de cualquier aplicacin Java se basa en la definicin de una clase. Todos los datos bsicos, como los enteros, se deben declarar en las clases antes de hacer uso de ellos. En C la unidad fundamental son los ficheros con cdigo fuente, en Java son las clases. De hecho son pocas las sentencias que se pueden colocar fuera del bloque de una clase. La palabra clave import (equivalente al #include) puede colocarse al principio de un fichero, fuera del bloque de la clase. Sin embargo, el compilador reemplazar esa sentencia con el contenido del fichero que se indique, que consistir, como es de suponer, en ms clases. Tipos de Clases Hasta ahora slo se ha utilizado la palabra clave public para calificar el nombre de las clases que hemos visto, pero hay tres modificadores ms. Los tipos de clases que podemos definir son: abstract Una clase abstract tiene al menos un mtodo abstracto. Una clase abstracta no se instancia, sino que se utiliza como clase base para la herencia. final Una clase final se declara como la clase que termina una cadena de herencia. No se puede heredar de una clase final. Por ejemplo, la clase Math es una clase final. public Las clases public son accesibles desde otras clases, bien sea directamente o por herencia. Son accesibles dentro del mismo paquete en el que se han declarado. Para acceder desde otros paquetes, primero tienen que ser importadas. synchronizable Este modificador especifica que todos los mtodos definidos en la clase son sincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desde distintos threads; el sistema se encarga de colocar los flags necesarios para evitarlo. Este mecanismo hace que desde threads diferentes se puedan modificar las mismas variables sin que haya problemas de que se sobreescriban.

VARIABLES Y METODOS DE INSTANCIA


MANUAL DE JAVA

18

Una clase en Java puede contener variables y mtodos. Las variables pueden ser tipos primitivos como int, char, etc. Los mtodos son funciones. Por ejemplo, en el siguiente trozo de cdigo podemos observarlo:
public MiClase { int i; public MiClase() { i = 10; } public void Suma_a_i( int j ) { i = i + j; } }

La clase MiClase contiene una variable (i) y dos mtodos, MiClase que es el constructor de la clase y Suma_a_i( int j ). Ambito de una variable Los bloques de sentencias compuestas en Java se delimitan con dos llaves. Las variables de Java slo son vlidas desde el punto donde estn declaradas hasta el final de la sentencia compuesta que la engloba. Se pueden anidar estas sentencias compuestas, y cada una puede contener su propio conjunto de declaraciones de variables locales. Sin embargo, no se puede declarar una variable con el mismo nombre que una de mbito exterior. El siguiente ejemplo intenta declarar dos variables separadas con el mismo nombre. En C y C++ son distintas, porque estn declaradas dentro de mbitos diferentes. En Java, esto es ilegal.
Class Ambito { int i = 1; // mbito exterior { // crea un nuevo mbito int i = 2; // error de compilacin } }

Mtodos y Constructores Los mtodos son funciones que pueden ser llamadas dentro de la clase o por otras clases. El constructor es un tipo especfico de mtodo que siempre tiene el mismo nombre que la clase. Cuando se declara una clase en Java, se pueden declarar uno o ms constructores opcionales que realizan la inicializacin cuando se instancia (se crea una ocurrencia) un objeto de dicha clase. Utilizando el cdigo de ejemplo anterior, cuando se crea una nueva instancia de MiClase, se crean (instancian) todos los mtodos y variables, y se llama al constructor de la clase:
MiClase mc; mc = new MiClase();

La palabra clave new se usa para crear una instancia de la clase. Antes de ser instanciada con new no consume memoria, simplemente es una declaracin de tipo. Despus de ser instanciado un nuevo objeto mc, el valor de i en el objeto mc ser igual a 10. Se puede referenciar la variable (de instancia) i con el nombre del objeto:
mc.i++; // incrementa la instancia de i de mc

Al tener mc todas las variables y mtodos de MiClase, se puede usar la primera sintaxis para llamar al mtodo Suma_a_i() utilizando el nuevo nombre de clase mc:
mc.Suma_a_i( 10 );

y ahora la variable mc.i vale 21. Finalizadores

MANUAL DE JAVA

19

Java no utiliza destructores (al contrario que C++) ya que tiene una forma de recoger automticamente todos los objetos que se salen del alcance. No obstante proporciona un mtodo que, cuando se especifique en el cdigo de la clase, el reciclador de memoria (garbage collector) llamar:
// Cierra el canal cuando este objeto es reciclado protected void finalize() { close(); }

ALCANCE DE OBJETOS Y RECICLADO DE MEMORIA


Los objetos tienen un tiempo de vida y consumen recursos durante el mismo. Cuando un objeto no se va a utilizar ms, debera liberar el espacio que ocupaba en la memoria de forma que las aplicaciones no la agoten (especialmente las grandes). En Java, la recoleccin y liberacin de memoria es responsabilidad de un thread llamado automatic garbage collector (recolector automtico de basura). Este thread monitoriza el alcance de los objetos y marca los objetos que se han salido de alcance. Veamos un ejemplo:
String s; // no se ha asignado todavia s = new String( "abc" ); // memoria asignada s = "def"; // se ha asignado nueva memoria // (nuevo objeto)

Ms adelante veremos en detalle la clase String , pero una breve descripcin de lo que hace esto es; crear un objeto String y rellenarlo con los caracteres "abc" y crear otro (nuevo) String y colocarle los caracteres "def". En esencia se crean dos objetos:
Objeto String "abc" Objeto String "def"

Al final de la tercera sentencia, el primer objeto creado de nombre s que contiene "abc" se ha salido de alcance. No hay forma de acceder a l. Ahora se tiene un nuevo objeto llamado s y contiene "def". Es marcado y eliminado en la siguiente iteracin del thread reciclador de memoria.

HERENCIA
La Herencia es el mecanismo por el que se crean nuevos objetos definidos en trminos de objetos ya existentes. Por ejemplo, si se tiene la clase Ave, se puede crear la subclase Pato, que es una especializacin de Ave.
class Pato extends Ave { int numero_de_patas; }

La palabra clave extends se usa para generar una subclase (especializacin) de un objeto. Una Pato es una subclase de Ave. Cualquier cosa que contenga la definicin de Ave ser copiada a la clase Pato, adems, en Pato se pueden definir sus propios mtodos y variables de instancia. Se dice que Pato deriva o hereda de Ave. Adems, se pueden sustituir los mtodos proporcionados por la clase base. Utilizando nuestro anterior ejemplo de MiClase, aqu hay un ejemplo de una clase derivada sustituyendo a la funcin Suma_a_i() :
import MiClase; public class MiNuevaClase Suma_a_i( int j ) { i = i + ( j/2 ); } } extends MiClase { public void

MANUAL DE JAVA

20

Ahora cuando se crea una instancia de MiNuevaClase, el valor de i tambin se inicializa a 10, pero la llamada al mtodo Suma_a_i() produce un resultado diferente:
MiNuevaClase mnc; mnc = new MiNuevaClase(); mnc.Suma_a_i( 10 );

En Java no se puede hacer herencia mltiple. Por ejemplo, de la claseaparato con motor y de la clase animal no se puede derivar nada, sera como obtener el objeto toro mecnico a partir de una mquina motorizada (aparato con motor) y un toro (aminal). En realidad, lo que se pretende es copiar los mtodos, es decir, pasar la funcionalidad del toro de verdad al toro mecnico, con lo cual no sera necesaria la herencia mltiple sino simplemente la comparticin de funcionalidad que se encuentra implementada en Java a travs de interface.

CONTROL DE ACCESO
Cuando se crea una nueva clase en Java, se puede especificar el nivel de acceso que se quiere para las variables de instancia y los mtodos definidos en la clase: public
public void CualquieraPuedeAcceder(){}

Cualquier clase desde cualquier lugar puede acceder a las variables y mtodos de instacia pblicos. protected
protected void SoloSubClases(){}

Slo las subclases de la clase y nadie ms puede acceder a las variables y mtodos de instancia protegidos. private
private String NumeroDelCarnetDeIdentidad;

Las variables y mtodos de instancia privados slo pueden ser accedidos desde dentro de la clase. No son accesibles desde las subclases. friendly (sin declaracin especfica)
void MetodoDeMiPaquete(){}

Por defecto, si no se especifica el control de acceso, las variables y mtodos de instancia se declaranfriendly (amigas), lo que significa que son accesibles por todos los objetos dentro del mismo paquete, pero no por los externos al paquete. Es lo mismo que protected. Los mtodos protegidos (protected) pueden ser vistos por las clases derivadas, como en C++, y tambin, en Java, por los paquetes (packages). Todas las clases de un paquete pueden ver los mtodos protegidos de ese paquete. Para evitarlo, se deben declarar como private protected , lo que hace que ya funcione como en C++ en donde slo se puede acceder a las variables y mtodos protegidos de las clases derivadas.

MANUAL DE JAVA

21

VARIABLES Y METODOS ESTATICOS


En un momento determinado se puede querer crear una clase en la que el valor de una variable de instancia sea el mismo (y de hecho sea la misma variable) para todos los objetos instanciados a partir de esa clase. Es decir, que exista una nica copia de la variable de instancia. Se usar para ello la palabra clave static .
class Documento extends Pagina { static int version = 10; }

El valor de la variable version ser el mismo para cualquier objeto instanciado de la clase Documento . Siempre que un objeto instanciado de Documento cambie la variable version , sta cambiar para todos los objetos. De la misma forma se puede declarar un mtodo como esttico, lo que evita que el mtodo pueda acceder a las variables de instancia no estticas:
class Documento extends Pagina { static int version = 10; int numero_de_capitulos; static void annade_un_capitulo() { numero_de_capitulos++; // esto no funciona } static void modifica_version( int i ) { version++; // esto si funciona } }

La modificacin de la variable numero_de_capitulos no funciona porque se est violando una de las reglas de acceso al intentar acceder desde un mtodo esttico a una variable no esttica. Todas las clases que se derivan, cuando se declaran estticas, comparten la misma pgina de variables; es decir, todos los objetos que se generen comparten la misma zona de memoria. Las funciones estticas se usan para acceder solamente a variables estticas.
class UnaClase { int var; UnaClase() { var = 5; } UnaFuncion() { var += 5; } }

En el cdigo anterior, si se llama a la funcin UnaFuncion a travs de un puntero a funcin, no se podra acceder a var , porque al utilizar un puntero a funcin no se pasa implcitamente el puntero al propio objeto ( this ). Sin embargo, s se podra acceder a var si fuese esttica, porque siempre estara en la misma posicin de memoria para todos los objetos que se creasen de UnaClase.

THIS Y SUPER
Al acceder a variables de instancia de una clase, la palabra clave this hace referencia a los miembros de la propia clase. Volviendo al ejemplo de MiClase, se puede aadir otro constructor de la forma siguiente:
public class MiClase { int i; public MiClase() { i = 10; } // Este constructor establece el valor de i public MiClase( int valor ) { this.i = valor; // i = valor } public void Suma_a_i( int j ) { i = i + j; } }

Aqu this.i se refiere al entero i en la clase MiClase . Si se necesita llamar al mtodo padre dentro de una clase que ha reemplazado ese mtodo, se puede hacer referencia al mtodo padre con la palabra clave super :
import MiClase; public class MiNuevaClase extends MiClase Suma_a_i( int j ) { i = i + ( j/2 ); super.Suma_a_i( j ); } } { public void

MANUAL DE JAVA

22

En el siguiente cdigo, el constructor establecer el valor de i a 10, despus lo cambiar a 15 y finalmente el mtodo Suma_a_i() de la clase padre (MiClase) lo dejar en 25: MiNuevaClase mnc; mnc = new MiNuevaClase(); mnc.Suma_a_i( 10 );

CLASES ABSTRACTAS
Una de las caractersticas ms tiles de cualquier lenguaje orientado a objetos es la posibilidad de declarar clases que definen como se utiliza solamente, sin tener que implementar mtodos. Esto es muy til cuando la implementacin es especfica para cada usuario, pero todos los usuarios tienen que utilizar los mismos mtodos. Un ejemplo de clase abstracta en Java es la clase Graphics :
public abstract class Graphics { public abstract void drawLine( int x1,int y1,int x2, int y2 ); public abstract void drawOval( int x,int y,int width, int height ); public abstract void drawArc( int x,int y,int width, int height,int startAngle,int arcAngle ); . . . }

Los mtodos se declaran en la clase Graphics , pero el cdigo que ejecutar el mtodo est en algn otro sitio:
public class MiClase extends Graphics { public void drawLine( int x1,int y1,int x2,int y2 ) { <cdigo para pintar lneas -especfico de la arquitectura-> } }

Cuando una clase contiene un mtodo abstracto tiene que declararse abstracta. No obstante, no todos los mtodos de una clase abstracta tienen que ser abstractos. Las clases abstractas no pueden tener mtodos privados (no se podran implementar) ni tampoco estticos. Una clase abstracta tiene que derivarse obligatoriamente, no se puede hacer un new de una clase abstracta. Una clase abstracta en Java es lo mismo que en C++ virtual func() = 0; lo que obliga a que al derivar de la clase haya que implementar forzosamente los mtodos de esa clase abstracta.

INTERFACES
Los mtodos abstractos son tiles cuando se quiere que cada implementacin de la clase parezca y funcione igual, pero necesita que se cree una nueva clase para utilizar los mtodos abstractos. Los interfaces proporcionan un mecanismo para abstraer los mtodos a un nivel superior. Un interface contiene una coleccin de mtodos que se implementan en otro lugar. Los mtodos de una clase son public , static y final . La principal diferencia entre interface y abstract es que un interface proporciona un mecanismo de encapsulacin de los protocolos de los mtodos sin forzar al usuario a utilizar la herencia. Por ejemplo:
public interface VideoClip { // comienza la reproduccion del video void play(); // reproduce el clip en un bucle void bucle(); // detiene la reproduccion void stop(); }

MANUAL DE JAVA

23

Las clases que quieran utilizar el interface VideoClip utilizarn la palabra implements y proporcionarn el cdigo necesario para implementar los mtodos que se han definido para el interface:
class MiClase implements VideoClip { void play() { <cdigo> } void bucle() { <cdigo> } void stop() { <cdigo> }

Al utilizar implements para el interface es como si se hiciese una accin de copiar-y-pegar del cdigo del interface, con lo cual no se hereda nada, solamente se pueden usar los mtodos. La ventaja principal del uso de interfaces es que una clase interface puede ser implementada por cualquier nmero de clases, permitiendo a cada clase compartir el interfaz de programacin sin tener que ser consciente de la implementacin que hagan las otras clases que implementen el interface .
class MiOtraClase implements VideoClip { void play() { <cdigo nuevo> } void bucle() { <cdigo nuevo> } void stop() { <cdigo nuevo> }

METODOS NATIVOS
Java proporciona un mecanismo para la llamada a funciones C y C++ desde nuestro cdigo fuente Java. Para definir mtodos como funciones C o C++ se utiliza la palabra clave native .
public class Fecha { int ahora; public Fecha() { ahora = time(); } private native int time(); static { System.loadLibrary( "time" ); } }

Una vez escrito el cdigo Java, se necesitan ejecutar los pasos siguientes para poder integrar el cdigo C o C++:
y y y y y

Utilizar javah para crear un fichero de cabecera (.h) Utilizar javah para crear un fichero de stubs , es decir, que contiene la declaracin de las funciones Escribir el cdigo del mtodo nativo en C o C++, es decir, rellenar el cdigo de la funcin, completando el trabajo de javah al crear el fichero de stubs Compilar el fichero de stubs y el fichero .c en una librera de carga dinmica ( DLL en Windows '95 o libXX.so en Unix) Ejecutar la aplicacin con el appletviewer

Ms adelante trataremos en profundidad los mtodos nativos, porque aaden una gran potencia a Java, al permitirle integrar a travs de librera dinmica cualquier algoritmo desarrollado en C o C++, lo cual, entre otras cosas, se utiliza como mtodo de proteccin contra la descompilacin completa del cdigo Java.

MANUAL DE JAVA

24

PAQUETES
La palabra clave package permite agrupar clases e interfaces. Los nombres de los paquetes son palabras separadas por puntos y se almacenan en directorios que coinciden con esos nombres. Por ejemplo, los ficheros siguientes, que contienen cdigo fuente Java: Applet.java, AppletContext.java, AppletStub.java, AudioClip.java contienen en su cdigo la lnea: package java.applet; Y las clases que se obtienen de la compilacin de los ficheros anteriores, se encuentran con el nombre nombre_de_clase.class, en el directorio: java/applet Import Los paquetes de clases se cargan con la palabra clave import, especificando el nombre del paquete como ruta y nombre de clase (es lo mismo que #include de C/C++). Se pueden cargar varias clases utilizando un asterisco. import import java.awt.*; java.Date;

Si un fichero fuente Java no contiene ningn package, se coloca en el paquete por defecto sin nombre. Es decir, en el mismo directorio que el fichero fuente, y la clase puede ser cargada con la sentencia import: import MiClase; Paquetes de Java El lenguaje Java proporciona una serie de paquetes que incluyen ventanas, utilidades, un sistema de entrada/salida general, herramientas y comunicaciones. En la versin actual del JDK, los paquetes Java que se incluyen son: java.applet Este paquete contiene clases diseadas para usar con applets. Hay una clase Applet y tres interfaces: AppletContext, AppletStub y AudioClip. java.awt El paquete Abstract Windowing Toolkit (awt) contiene clases para generar widgets y componentes GUI (Interfaz Grfico de Usuario). Incluye las clases Button, Checkbox, Choice, Component, Graphics, Menu, Panel, TextArea y TextField. java.io El paquete de entrada/salida contiene las clases de acceso a ficheros: FileInputStream y FileOutputStream.
MANUAL DE JAVA

25

java.lang Este paquete incluye las clases del lenguaje Java propiamente dicho: Object, Thread, Exception, System, Integer, Float, Math, String, etc. java.net Este paquete da soporte a las conexiones del protocolo TCP/IP y, adems, incluye las clases Socket, URL y URLConnection. java.util Este paquete es una miscelnea de clases tiles para muchas cosas en programacin. Se incluyen, entre otras, Date (fecha), Dictionary (diccionario), Random (nmeros aleatorios) y Stack (pila FIFO).

REFERENCIAS
Las referencias en Java no son punteros ni referencias como en C++. Este hecho crea un poco de confusin entre los programadores que llegan por primera vez a Java. Las referencias en Java son identificadores de instancias de las clases Java. Una referencia dirige la atencin a un objeto de un tipo especfico. No tenemos por qu saber cmo lo hace ni necesitamos saber qu hace ni, por supuesto, su implementacin. Pensemos en una referencia como si se tratase de la llave electrnica de la habitacin de un hotel. Vamos a utilizar precisamente este ejemplo del Hotel para demostrar el uso y la utilizacin que podemos hacer de las referencias en Java. Primero crearemos la clase Habitacion , implementada en el fichero Habitacion.java , mediante instancias de la cual construiremos nuestro Hotel:
public class Habitacion { private int numHabitacion; private int numCamas; public Habitacion() { habitacion( 0 ); } public Habitacion( int numeroHab ) { habitacion( numeroHab ); } public Habitacion( int numeroHab,int camas ) { habitacion( numeroHab ); camas( camas ); } public synchornized int habitacion() { return( numHabitacion ); } public synchronized void habitacion( int numeroHab ) { numHabitacion = numeroHab; } public synchronized int camas() { return( camas ); } public syncronized void camas( int camas ) { numCamas = camas; } }

El cdigo anterior sera el corazn de la aplicacin. Vamos pues a construir nuestro Hotel creando Habitaciones y asignndole a cada una de ellas su llave electrnica; tal como muestra el cdigo siguiente, Hotel1.java :
public class Hotel1 { public static void main( String args[] ) { Habitacion llaveHab1; // paso 1 Habitacion llaveHab2; llaveHab1 = new Habitacion( 222 ); llaveHab2 = new Habitacion( 1144,3 ); ^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^ A B y D C } } // pasos 2, 3, 4 y 5

// //

MANUAL DE JAVA

26

Para explicar el proceso, dividimos las acciones en los cinco pasos necesarios para poder entrar en nuestra habitacin. Aunque no se incluye, podemos tambin considerar el caso de que necesitemos un cerrajero, para que cuando perdamos la llave, nos abra la puerta; y que en nuestro caso sera el garbage collector , que recicla la habitacin una vez que se hayan perdido todas las llaves. El primer paso es la creacin de la llave, es decir, definir la variable referencia, por defecto nula . El resto de los pasos se agrupan en una sola sentencia Java. La parte B en el cdigo anterior indica al gerente del Hotel que ya dispone de una nueva habitacin. La parte C llama al decorador de interiores para que " vista " la habitacin segn un patrn determinado, para que no desentonen unas habitaciones con otras y no se pierdan las seas de identidad del hotel. El cdigo electrnico que nos permitir acceder a la habitacin se genera en la parte D, una vez conocido el interior de la habitacin y se programa en la llave en la parte A. Si dejamos el ejemplo real a un lado y nos vamos a lo que ocurre en la ejecucin del cdigo, vemos que el operador new busca espacio para una instancia de un objeto de una clase determinada e inicializa la memoria a los valores adecuados. Luego invoca al mtodo constructor de la clase, proporcionndole los argumentos adecuados. El operador new devuelve una referencia a s mismo, que es inmediatamente asignada a la variable referencia. Podemos tener mltiples llaves para una misma habitacin:
. . . Habitacion llaveHab3,llaveHab4; llaveHab3 = llaveHab1; llaveHab4 = llavehab2;

De este modo conseguimos copias de las llaves. Las habitaciones en s mismas no se han tocado en este proceso. As que, ya tenemos dos llaves para la habitacin 222 y otras dos para la habitacin 1144. Una llave puede ser programada para que funcione solamente con una habitacin en cualquier momento, pero podemos cambiar su cdigo electrnico para que funcione con alguna otra habitacin; por ejemplo, para cambiar una habitacin anteriormente utilizada por un empedernido fumador por otra limpia de olores y con vistas al mar. Cambiemos pues la llave duplicada de la habitacin del fumador (la 222) por la habitacin con olor a sal marina, 1144:
. . . llaveHab3 = llaveHab2;

Ahora tenemos una llave para la habitacin 222 y tres para la habitacin 1144. Mantendremos una llave para cada habitacin en la conserjera, para poder utilizarla como llave maestra, en el caso de que alguien pierda su llave propia. Alguien con la llave de una habitacin puede hacer cambios en ella, y los compaeros que tengan llave de esa misma habitacin, no tendrn conocimiento de esos cambios hasta que vuelvan a entrar en la habitacin. Por ejemplo, vamos a quitar una de las camas de la habitacin, entrando en ella con la llave maestra:
. . . llaveHab2.camas( 2 );

Ahora cuando los inquilinos entren en la habitacin podrn comprobar el cambio realizado:
. . . llaveHab4.printData();

MANUAL DE JAVA

27

REFERENCIAS Y ARRAYS
Como en C y C++, Java dispone de arrays de tipos primitivos o de clases. Los arrays en C y C++ son bsicamente un acompaante para los punteros. En Java, sin embargo, son ciudadanos de primera clase. Vamos a expandir nuestro hotel creando todo un ala de habitaciones, Hotel2.java . Crearemos un juego de llaves maestras y luego construiremos las habitaciones:
public class Hotel2 { // Nmero de habitaciones por ala public static final int habPorAla = 12; public static void main( String args[] ) { Habitacion llavesMaestras[]; // paso 1 llavesMaestras = new Habitacion[ habPorAla ]; // pasos 2-5 // ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ // A B, C, D y E int numPiso = 1; for( int i=0; i < habPorAla; i++ ) // pasos 6-9 llavesMaestras[ i ] = new Habitacion( numPiso * 100 + i, ( 0 == (i%2)) ? 2 : 1 ); for( int i=0; i < habPorAla; i++ ) // pasos 10-11 llavesMaestras[i].printData(); } }

Cada paso en el ejemplo es semejante al que ya vimos antes. El paso 1 especifica que el juego de llaves maestras es un grupo de llaves de habitaciones. Los pasos 2 a 5 son, en este caso, la parte principal. En lugar de crear una habitacin, el gerente ordena construir un grupo contiguo de habitaciones. El nmero de llaves se especifica entre corchetes y todas se crean en blanco. Los pasos 6 a 9 son idnticos a los pasos 2 a 5 del ejemplo anterior, excepto en que en este caso todas las llaves pasan a formar parte del juego maestro. Los nmeros de piso se dan en miles para que cuando se creen las habitaciones, todas tengan el mismo formato. Tambin todas las habitaciones de nmero par tienen una sola cama, mientras que las habitaciones impares tendrn dos camas. Los pasos 10 y 11 nos permiten obtener informacin de cada una de las habitaciones.

REFERENCIAS Y LISTAS
Hay gente que piensa que como Java no dispone de punteros, resulta demasiado complejo construir listas enlazadas, rboles binarios y grafos. Vamos a demostrar que quien as piense est bastante equivocado. Retomemos el ejemplo de los arrays, y en vez de stos vamos a usar una lista doblemente enlazada. El paquete de la lista simple se compone de dos clases. Cada elemento de la lista es un NodoListaEnlazada , NodoListaEnlazada.java :
public class NodoListaEnlazada { private NodoListaEnlazada siguiente; NodoListaEnlazada anterior; private Object datos; // . . . } private

MANUAL DE JAVA

28

Cada NodoListaEnlazada contiene una referencia a su nodo precedente en la lista y una referencia al nodo que le sigue. Tambin contiene una referencia genrica a cualquier clase que se use para proporcionar acceso a los datos que el usuario proporcione. La lista enlazada, ListaEnlazada.java , contiene un nodo principio-fin y un contador para el nmero de nodos en la lista:
public class ListaEnlazada { public NodoListaEnlazada PrincipioFin; private int numNodos; // . . . }

El nodo especial PrincipioFin es sencillo, para simplificar el cdigo. El contador se usa para optimizar los casos ms habituales. Revisemos pues el cdigo de nuestro Hotel, ahora Hotel3.java , que ser prcticamente el mismo que en el caso de los arrays:
public class Hotel3 { // Nmero de habitaciones por ala public static final int habPorAla = 12; public static void main( String args[] ) { ListaEnlazada llaveMaestra; // paso 1 llaveMaestra = new ListaEnlazada(); // pasos 2-5 int numPiso = 1; for( int i=0; i < habPorAla; i++ ) // pasos 6-9 llaveMaestra.insertAt( i, new Habitacion( numPiso * 100 + i, ( 0 == (i%2)) ? 2 : 1 ); for( int i=0; i < habPorAla; i++ ) // pasos 10-12 ( (Habitacion)llaveMaestra.getAt(i) ).printData(); } }

El paso 1 es la llave maestra de la lista. Est representada por una lista genrica; es decir, una lista de llaves que cumple la convencin que nosotros hemos establecido. Podramos acelerar el tiempo de compilacin metiendo la lista genrica ListaEnlazada dentro de una ListaEnlazadaHabitacion . Los pasos 2 a 5 son equivalentes a los del primer ejemplo. Construimos e inicializamos una nueva ListaEnlazada , que usaremos como juego de llaves maestras. Los pasos 6 a 9 son funcionalmente idnticos a los del ejemplo anterior con arrays, pero con diferente sintaxis. En Java, los arrays y el operador [] son internos del lenguaje. Como Java no soporta la sobrecarga de operadores por parte del usuario, tenemos que usarlo siempre en su forma normal. La ListaEnlazada proporciona el mtodo insertAt() que coge el ndice en la lista, donde el nuevo nodo ha de ser insertado, como primer argumento. El segundo argumento es el objeto que ser almacenado en la lista. Obsrvese que no es necesario colocar moldeo alguno para hacer algo a una clase descendiente que depende de uno de sus padres. Los pasos 10 a 12 provocan la misma salida que los pasos 10 y 11 del ejemplo con arrays. El paso 10 coge la llave del juego que se indica en el mtodo getAt() . En este momento, el sistema no sabe qu datos contiene la llave, porque el contenido de la habitacin es genrico. Pero nosotros s sabemos lo que hay en la lista, as que informamos al sistema haciendo un moldeado a la llave de la habitacin (este casting generar un chequeo en tiempo de ejecucin por el compilador, para asegurarse de que se trata de una Habitacion ). El paso 12 usa la llave para imprimir la informacin.

MANUAL DE JAVA

29

UNA MINIMA APLICACION


La aplicacin ms pequea posible es la que simplemente imprimir un mensaje en la pantalla. Tradicionalmente, el mensaje suele ser "Hola Mundo!". Esto es justamente lo que hace el siguiente fragmento de cdigo:
// // Aplicacin HolaMundo de ejemplo // class HolaMundoApp { public static void main( String args[] ) { System.out.println( "Hola Mundo!" ) ; } }

HolaMundo
Vamos ver en detalle la aplicacin anterior, lnea a lnea. Esas lneas de cdigo contienen los componenetes mnimos para imprimir Hola Mundo! en la pantalla.
// // Aplicacin HolaMundo de ejemplo //

Estas tres primera lneas son comentarios. Hay tres tipos de comentarios en Java, // es un comentario orientado a lnea.
class HolaMundoApp {

Esta lnea declara la clase HolaMundoApp . El nombre de la clase especificado en el fichero fuente se utiliza para crear un fichero nombredeclase.class en el directorio en el que se compila la aplicacin. En nuestro caso, el compilador crear un fichero llamado HolaMundoApp.class.
public static void main( String args[] ) {

Esta lnea especifica un mtodo que el intrprete Java busca para ejecutar en primer lugar. Igual que en otros lenguajes, Java utiliza una palabra clave main para especificar la primera funcin a ejecutar. En este ejemplo tan simple no se pasan argumentos. public significa que el mtodo main puede ser llamado por cualquiera, incluyendo el intrprete Java. static es una palabra clave que le dice al compilador que main se refiere a la propia clase HolaMundoApp y no a ninguna instancia de la clase. De esta forma, si alguien intenta hacer otra instancia de la clase, el mtodo main no se instanciara. void indica que main no devuelve nada. Esto es importante ya que Java realiza una estricta comprobacin de tipos, incluyendo los tipos que se ha declarado que devuelven los mtodos. args[] es la declaracin de un array de Strings. Estos son los argumentos escritos tras el nombre de la clase en la lnea de comandos:
%java HolaMundoApp arg1 arg2 ... System.out.println( "Hola Mundo!" );

Esta es la funcionalidad de la aplicacin. Esta lnea muestra el uso de un nombre de clase y mtodo. Se usa el mtodo println() de la clase out que est en el paquete System .

MANUAL DE JAVA

30

El mtodo println() toma una cadena como argumento y la escribe en el stream de salida estndar; en este caso, la ventana donde se lanza la aplicacin.
} }

Finalmente, se cierran las llaves que limitan el mtodo main() y la clase HolaMundoApp.

COMPILACION Y EJECUCION DE HOLA MUNDO


Vamos a ver a continuacin como podemos ver el resultado de nuestra primera aplicacin Java en pantalla. Generaremos un fichero con el cdigo fuente de la aplicacin, lo compilaremos y utilizaremos el intrprete java para ejecutarlo. Ficheros Fuente Java Los ficheros fuente en Java terminan con la extensin " .java ". Crear un fichero utilizando cualquier editor de texto ascii que tenga como contenido el cdigo de las ocho lneas de nuestra mnima aplicacin, y salvarlo en un fichero con el nombre de HolaMundoApp.java . Para crear los ficheros con cdigo fuente Java no es necesario un procesador de textos, aunque puede utilizarse siempre que tenga salida a fichero de texto plano o ascii, sino que es suficiente con cualquier otro editor. Compilacin El compilador javac se encuentra en el directorio bin por debajo del directorio java , donde se haya instalado el JDK. Este directorio bin , si se han seguido las instrucciones de instalacin, debera formar parte de la variable de entorno PATH del sistema. Si no es as, tendra que revisar la Instalacin del JDK . El compilador de Java traslada el cdigo fuente Java a byte-codes, que son los componentes que entiende la Mquina Virtual Java que est incluida en los navegadores con soporte Java y en appletviewer. Una vez creado el fichero fuente HolaMundoApp.java, se puede compilar con la lnea siguiente:
%javac HolaMundoApp.java

Si no se han cometido errores al teclear ni se han tenido problemas con el path al fichero fuente ni al compilador, no debera aparecer mensaje alguno en la pantalla, y cuando vuelva a aparecer el prompt del sistema, se debera ver un fichero HolaMundoApp.class nuevo en el directorio donde se encuentra el fichero fuente. Si ha habido algn problema, en Problemas de compilacin al final de esta seccin, hemos intentado reproducir los que ms frecuentemente se suelen dar, se pueden consultar por si pueden aportar un poco de luz al error que haya aparecido. Ejecucin Para ejecutar la aplicacin HolaMundoApp, hemos de recurrir al intrprete java , que tambin se encuentra en el directorio bin , bajo el directorio java . Se ejecutar la aplicacin con la lnea: %java HolaMundoApp y debera aparecer en pantalla la respuesta de Java: %Hola Mundo!
MANUAL DE JAVA

31

El smbolo % representa al prompt del sistema, y lo utilizaremos para presentar las respuestas que nos ofrezca el sistema como resultado de la ejecucin de los comandos que se indiquen en pantalla o para indicar las lneas de comandos a introducir. Problemas de compilacin A continuacin presentamos una lista de los errores ms frecuentes que se presentan a la hora de compilar un fichero con cdigo fuente Java, nos basaremos en errores provocados sobre nuestra mnima aplicacin Java de la seccin anterior, pero podra generalizarse sin demasiados problemas. %javac: Command not found No se ha establecido correctamente la variable PATH del sistema para el compilador javac . El compilador javac se encuentra en el directorio bin , que cuelga del directorio java , que cuelga del directorio donde se haya instalado el JDK (Java Development Kit). %HolaMundoApp.java:3: Method printl(java.lang.String) not found in class java.io.PrintStream. System.out.printl( "HolaMundo!); ^ Error tipogrfico, el mtodo es println no printl. %In class HolaMundoApp: main must be public and static Error de ejecucin, se olvid colocar la palabra static en la declaracin del mtodo main de la aplicacin. %Cant find class HolaMundoApp Este es un error muy sutil. Generalmente significa que el nombre de la clase es distinto al del fichero que contiene el cdigo fuente, con lo cual el fichero nombre_fichero.class que se genera es diferente del que cabra esperar. Por ejemplo, si en nuestro fichero de cdigo fuente de nuestra aplicacin HolaMundoApp.java colocamos en vez de la declaracin actual de la clase HolaMundoApp , la lnea: class HolaMundoapp { se crear un fichero HolaMundoapp.class , que es diferente del HolaMundoApp.class , que es el nombre esperado de la clase; la diferencia se encuentra en la a minscula y mayscula.

UN APPLET BASICO
Vamos a comenzar la creacin del cdigo fuente del un applet que satisfaga nuestras necesidades. Recordamos que Java utiliza la extensin .java para designar los ficheros fuente.
HolaMundo

A continuacin est el cdigo fuente del applet HolaMundo, que es la versin applet de la mnima aplicacin Java que antes habamos escrito. Guardar este cdigo en un fichero fuente Java como HolaMundo.java .
// // Applet HolaMundo de ejemplo // import java.awt.Graphics; import java.applet.Applet; public class HolaMundo extends Applet { public void paint( Graphics g ) { g.drawString( "Hola Mundo!",25,25 ) ; } }

Componentes bsicos de un Applet

MANUAL DE JAVA

32

El lenguaje Java implementa un modelo de Programacin Orientada a Objetos. Los objetos sirven de bloques centrales de construccin de los programas Java. De la misma forma que otros lenguajes de programacin, Java tiene variables de estado y mtodos. Veamos como se descompone un applet en sus piezas/objetos:
/* Seccin de importaciones */ public class NombreDelNuevoApplet extends Applet { /* Aqu se declaran las variables de estado (public y private) */ /* Los mtodos para la interaccin con los objetos se declaran y definen aqu */ public void MetodoUno( parmetros ) { /* Aqu viene para cada mtodo, el cdigo Java que desempea la tarea. Qu cdigo se use depende del applet */ } }

Para HolaMundo, se importan las dos clases que necesita. No hay variables de estado, y slo se tiene que definir un mtodo para que el applet tenga el comportamiento esperado.
Clases incluidas

El comando import carga otras clases dentro de nuestro cdigo fuente. El importar una clase desde un paquete de Java hace que esa clase importada est disponible para todo el cdigo incluido en el fichero fuente Java que la importa. Por ejemplo, en el applet HolaMundo se importa la clase java.awt.Graphics , y podremos llamar a los mtodos de esta clase desde cualquier mtodo de nuestro programa que se encuentre en el fichero HolaMundo.java . Esta clase define una rea grfica y mtodos para poder dibujar dentro de ella. La funcin paint() declara a g como un objeto de tipo Graphics ; luego, paint() usa el mtodo drawString() de la clase Graphics para generar su salida.
La clase Applet

Se puede crear una nueva clase, en este caso HolaMundo , extendiendo la clase bsica de Java: Applet . De esta forma, se hereda todo lo necesario para crear un applet. Modificando determinados mtodos del applet, podemos lograr que lleve a cabo las funciones que deseamos.
import java.applet.Applet; . . . public class HolaMundo extends Applet {

Mtodos de Applet La parte del applet a modificar es el mtodo paint() . En la clase Applet , se llama al mtodo paint() cada vez que el mtodo arranca o necesita ser refrescado, pero no hace nada. En nuestro caso, lo que hacemos es:
public void paint( Graphics g ) { g.drawString( "Hola Mundo!",25,25 ); }

MANUAL DE JAVA

33

De acuerdo a las normas de sobrecarga, se ejecutar este ltimo paint() y no el paint() vaco de la clase Applet . Luego, aqu se ejecuta el mtodo drawString() , que le dice al applet cmo debe aparecer un texto en el rea de dibujo. Otros mtodos bsicos para dibujar son:
drawLine( int x1,int y1,int x2,int y2 ) drawRect( int x,int y,int ancho,int alto ) drawOval( int x,int y,int ancho,int alto )

Tanto para drawRect() como para drawOval() , las coordenadas ( x,y ) son la esquina superior izquierda del rectngulo (para drawOval, el valo es encajado en el rectngulo que lo circunscribe). Para saber como poner un Applet en una pgina web puedes mirar aqu

LA CLASE MATH
La clase Math representa la librera matemtica de Java. Las funciones que contiene son las de todos los lenguajes, parece que se han metido en una clase solamente a propsito de agrupacin, por eso se encapsulan en Math, y lo mismo sucede con las dems clases que corresponden a objetos que tienen un tipo equivalente (Character, Float, etc.). El constructor de la clase es privado, por los que no se pueden crear instancias de la clase. Sin embargo, Math es public para que se pueda llamar desde cualquier sitio y static para que no haya que inicializarla.
Funciones matemticas

Si se importa la clase, se tiene acceso al conjunto de funciones matemticas estndar: Math.abs( x ) para int, long, float y double Math.sin( double ) Math.cos( double ) Math.tan( double ) Math.asin( double ) Math.acos( double ) Math.atan( double ) Math.atan2( double,double ) Math.exp( double ) Math.log( double ) Math.sqrt( double ) Math.ceil( double ) Math.floor( double ) Math.rint( double ) Math.pow( a,b ) Math.round( x ) para double y float Math.random() devuelve un double Math.max( a,b ) para int, long, float y double Math.min( a,b ) para int, long, float y double Math.E para la base exponencial Math.PI para PI

MANUAL DE JAVA

34

He aqu un ejemplo, Mates.java , de uso de algunas funciones de la clase Math:


class Mates { public static void main( String args[] ) { int x; double rand,y,z; float max; rand = Math.random(); x = Math.abs( -123 ); y = Math.round( 123.567 ); z = Math.pow( 2,4 ); max = Math.max( (float)1e10,(float)3e9 ); System.out.println( rand ); System.out.println( x ); System.out.println( y ); System.out.println( z ); System.out.println( max ); } }

LA CLASE CHARACTER
Al trabajar con caracteres se necesitan muchas funciones de comprobacin y traslacin. Estas funciones estn empleadas en la clase Character . De esta clase s que se pueden crear instancias, al contrario que sucede con la clase Math . Declaraciones La primera sentencia crear una variable carcter y la segunda un objeto Character:
char c; Character C;

Comprobaciones booleanas
Character.isLowerCase( c ) Character.isUpperCase( c ) Character.isDigit( c ) Character.isSpace( c )

En este caso, si tuvisemos un objeto Character C , no se podra hacer C.isLowerCase , porque no se ha hecho un new de Character. Estas funciones son estticas y no conocen al objeto, por eso hay que crearlo antes. Traslaciones de caracteres
char c2 = Character.toLowerCase( c ); char c2 = Character.toUpperCase( c );

Traslaciones de carcter/dgito
int i = Character.digit( c,base ); char c = Character.forDigit( i,base );

Mtodos de la clase Character


C = new Character( 'J' ); char c = C.charValue(); String s = C.toString();

LA CLASE FLOAT
Cada tipo numrico tiene su propia clase de objetos. As el tipo float tiene el objeto Float . De la misma forma que con la clase Character , se han codificado muchas funciones tiles dentro de los mtodos de la clase Float . Declaraciones La primera sentencia crear una variable float y la segunda un objeto Float:
float f; Float F;

MANUAL DE JAVA

35

Valores de Float
Float.POSITIVE_INFINITY Float.MIN_VALUE Float.NEGATIVE_INFINITY Float.NaN Float.MAX_VALUE

Conversiones de Clase/Cadena
String s = Float.toString( f ); f = Float.valueOf( "3.14" );

Comprobaciones
boolean b = Float.isNaN( f ); boolean b = Float.isInfinite( f );

La funcin isNaN() comprueba si f es un No-Nmero . Un ejemplo de no-nmero es raiz cuadrada de -2. Conversiones de Objetos
Float F = new Float( Float.PI ); String s = F.toString(); int i = F.intValue(); long l = F.longValue(); float F = F.floatValue(); double d = F.doubleValue();

Otros Mtodos
int i = F.hashCode(); boolean b = F.equals( Object obj Float.floatToIntBits( f ); float f = Float.intBitsToFloat( i ); ); int i =

LA CLASE DOUBLE
Cada tipo numrico tiene su propia clase de objetos. As el tipo double tiene el objeto Double . De la misma forma que con la clase Character , se han codificado muchas funciones tiles dentro de los mtodos de la clase Double . Declaraciones La primera sentencia crear una variable double y la segunda un objeto Double:
double d; Double D;

Valores de Double
Double.POSITIVE_INFINITY Double.MIN_VALUE Double.NEGATIVE_INFINITY Double.NaN Double.MAX_VALUE

Mtodos de Double
D.isNaN(); Double.isNaN( d ); D.isInfinite(); Double.isInfinite( d ); boolean D.equals(); String D.toString(); int D.intValue(); long D.longValue(); float D.floatValue(); double D.doubleValue(); int i = D.hashCode(); Double V.valueOf( String s ); long l = Double.doubleToLongBits( d ); double d = Double.longBitsToDouble( l );

MANUAL DE JAVA

36

LA CLASE INTEGER
Cada tipo numrico tiene su propia clase de objetos. As el tipo int tiene el objeto Integer . De la misma forma que con la clase Character , se han codificado muchas funciones tiles dentro de los mtodos de la clase Integer . Declaraciones La primera sentencia crear una variable int y la segunda un objeto Integer:
Integer.MIN_VALUE; Integer.MAX_VALUE;

Valores de Integer
Integer.MIN_VALUE; Integer.MAX_VALUE;

Mtodos de Integer
String Integer.toString( int i,int base ); String Integer.toString( int i ); int I.parseInt( String s,int base ); int I.parseInt( String s ); Integer Integer.valueOf( String s,int base ); Integer Integer.valueOf( String s ); int I.intValue(); long I.longValue(); float I.floatValue(); double I.doubleValue(); String I.toString(); int I.hashCode(); boolean I.equals( Object obj );

LA CLASE LONG
Cada tipo numrico tiene su propia clase de objetos. As el tipo long tiene el objeto Long . De la misma forma que con la clase Character , se han codificado muchas funciones tiles dentro de los mtodos de la clase Long . Declaraciones La primera sentencia crear una variable long y la segunda un objeto Long:
long l; Long L;

Valores de Long
Long.MIN_VALUE; Long.MAX_VALUE;

Mtodos de Long
String Long.toString( long l,int base ); String Long.toString( long l ); long L.parseLong( String s,int base ); long L.parseLong( String s ); Long Long.valueOf( String s,int base ); Long Long.valueOf( String s ); int L.intValue(); long L.longValue(); float L.floatValue(); double L.doubleValue(); String L.toString(); int L.hashCode(); boolean L.equals( Object obj );

En los mtodostoString() , parseInt() y valueOf() que no se especifica la base sobre la que se trabaja, se asume que es base 10 .

MANUAL DE JAVA

37

LA CLASE BOOLEAN
Los valores boolean tambin tienen su tipo asociado Boolean , aunque en este caso hay menos mtodos implementados que para el resto de las clases numricas. Declaraciones La primera sentencia crear una variable boolean y la segunda un objeto Boolean:
boolean b; Boolean B;

Valores de Boolean
Boolean.TRUE; Boolean.FALSE;

Mtodos de Boolean
boolean B.booleanValue(); String B.toString(); boolean B.equals( Object obj );

LA CLASE STRING
Java posee gran capacidad para el manejo de cadenas dentro de sus clases String y StringBuffer . Un objeto String representa una cadena alfanumrica de un valor constante que no puede ser cambiada despus de haber sido creada. Un objeto StringBuffer representa una cadena cuyo tamao puede variar. Los Strings son objetos constantes y por lo tanto muy baratos para el sistema. La mayora de las funciones relacionadas con cadenas esperan valores String como argumentos y devuelven valores String. Hay que tener en cuenta que las funciones estticas no consumen memoria del objeto, con lo cual es ms conveniente usar Character que char. No obstante, char se usa, por ejemplo, para leer ficheros que estn escritos desde otro lenguaje. Existen muchos constructores para crear nuevas cadenas:
String(); String( String str ); String( char val[] ); String( char val[],int offset,int count ); String( byte val[],int hibyte ); String( byte val[],int hibyte,int offset,int count );

Tal como uno puede imaginarse, las cadenas pueden ser muy complejas, existiendo muchas funciones muy tiles para trabajar con ellas y, afortunadamente, la mayora estn codificadas en la clase String . Funciones Bsicas La primera devuelve la longitud de la cadena y la segunda devuelve el carcter que se encuentra en la posicin que se indica en indice :
int length(); char charAt( int indice );

MANUAL DE JAVA

38

Funciones de Comparacin de Strings


boolean equals( Object obj ); boolean equalsIgnoreCase( Object obj );

Lo mismo que equals() pero no tiene en cuenta maysculas o minsculas.


int compareTo( String str2 );

Devuelve un entero menor que cero si la cadena es lxicamente menor que str2 . Devuelve cero si las dos cadenas son lxicamente iguales y un entero mayor que cero si la cadena es lxicamente mayor que str2 . Funciones de Comparacin de Subcadenas
boolean regionMatch( int thisoffset,String s2,int s2offset,int len ); boolean regionMatch( boolean ignoreCase,int thisoffset,String s2, int s2offset,int 1 );

Comprueba si una regin de esta cadena es igual a una regin de otra cadena.
boolean startsWith( String prefix ); boolean startsWith( offset ); boolean endsWith( String suffix ); String prefix,int

Devuelve si esta cadena comienza o termina con un cierto prefijo o sufijo comenzando en un determinado desplazamiento.
int indexOf( int ch ); int indexOf( int ch,int fromindex ); int lastIndexOf( int ch ); int lastIndexOf( int ch,int fromindex ); int indexOf( String str ); int indexOf( String str,int fromindex ); int lastIndexOf( String str ); int lastIndexOf( String str,int fromindex );

Devuelve el primer/ltimo ndice de un carcter/cadena empezando la bsqueda a partir de un determinado desplazamiento.


String substring( int beginindex ); String substring( int beginindex,int endindex ); String concat( String str ); String replace( char oldchar,char newchar ); String toLowerCase(); String toUpperCase(); String trim();

Ajusta los espacios en blanco al comienzo y al final de la cadena.


void getChars( int srcBegin,int srcEnd,char dst[],int dstBegin ); void getBytes( int srcBegin,int srcEnd,byte dst[],int dstBegin ); String toString(); char toCharArray(); int hashCode();

Funciones ValueOf La clase String posee numerosas funciones para transformar valores de otros tipos de datos a su representacin como cadena. Todas estas funciones tienen el nombre de valueOf , estando el mtodo sobrecargado para todos los tipos de datos bsicos. Veamos un ejemplo de su utilizacin:
String Uno = new String( "Hola Mundo" ); float f = 3.141592; String PI = Uno.valueOf( f ); String PI = String.valueOf( f ); // Mucho ms correcto

MANUAL DE JAVA

39

Funciones de Conversin
String valueOf( boolean b ); String valueOf( int i ); String valueOf( long l ); String valueOf( float f ); String valueOf( double d ); String valueOf( Object obj ); String valueOf( char data[] ); String valueOf( char data[],int offset,int count );

Usa arrays de caracteres para la cadena.


String copyValueOf( char data[] ); String copyValueOf( char data[],int offset,int count );

Crea un nuevo array equivalente para la cadena.

LA CLASE STRINGBUFFER
Java posee gran capacidad para el manejo de cadenas dentro de sus clases String y StringBuffer . Un objeto String representa una cadena alfanumrica de un valor constante que no puede ser cambiada despus de haber sido creada. Un objeto StringBuffer representa una cadena cuyo tamao puede variar. La clase StringBuffer dispone de muchos mtodos para modificar el contenido de los objetos StringBuffer. Si el contenido de una cadena va a ser modificado en un programa, habr que sacrificar el uso de objetos String en beneficio de StringBuffer, que aunque consumen ms recursos del sistema, permiten ese tipo de manipulaciones. Al estar la mayora de las caractersticas de los StringBuffers basadas en su tamao variable, se necesita un nuevo mtodo de creacin:
StringBuffer(); StringBuffer( int len ); StringBuffer( String str );

Se puede crear un StringBuffer vaco de cualquier longitud y tambin se puede utilizar un String como punto de partida para un StringBuffer.
StringBuffer Dos = new StringBuffer( 20 ); StringBuffer Uno = new StringBuffer( "Hola Mundo" );

Cambio de Tamao

El cambio de tamao de un StringBuffer necesita varias funciones especficas para manipular el tamao de las cadenas:
int length(); char charAt( int index ); void getChars( int srcBegin,int srcEnd,char dst[],int dstBegin ); String toString(); void setLength( int newlength ); void setCharAt( int index,char ch ); int capacity(); void ensureCapacity( int minimum ); void copyWhenShared();

Obervar que una de las funciones devuelve una cadena constante normal de tipo String. Este objeto se puede usar con cualquier funcin String, como por ejemplo, en las funciones de comparacin.
Modificacin del Contenido

Para cambiar el contenido de un StringBuffer, se pueden utilizar dos mtodos: append() e insert() .

MANUAL DE JAVA

40

En el ejemplo CadAppend.java , vemos el uso de estos dos mtodos:


class CadAppend { public static void main( String args[] ) { StringBuffer str = new StringBuffer( "Hola" ); str.append( " Mundo" ); System.out.println( str ); } }

En este otro ejemplo, CadInversa.java , mostramos un mtodo muy simple que le da la vuelta a una cadena:
class CadInversa { public static String cadenaInversa( String fuente ) { int longitud = fuente.length(); StringBuffer destino = new StringBuffer( longitud ); for( int i=(longitud-1); i >= 0; i-- ) destino.append( fuente.charAt( i ) ); return( destino.toString() ); } public static void main( String args[] ) { System.out.println( cadenaInversa( "Hola Mundo" ) ); } }

Las funciones que cambian el tamao son pues:


StringBuffer append( Object obj ); StringBuffer append( String str ); StringBuffer append( char str[] ); StringBuffer append( char str[],int offset,int len ); StringBuffer append( boolean b ); StringBuffer append( int i ); StringBuffer append( long l ); StringBuffer append( float f ); StringBuffer append( double d ); StringBuffer append( char ch ); StringBuffer insert( int offset,Object obj ); StringBuffer insert( int offset,String str ); StringBuffer insert( int offset,char str[] ); StringBuffer insert( int offset,boolean b ); StringBuffer insert( int offset,int i ); StringBuffer insert( int offset,long l ); StringBuffer insert( int offset,float f ); StringBuffer insert( int offset,double d ); StringBuffer insert( int offset,char ch );

Operadores de Concatenacin

Hay que recordar que los operadores " + " y " += " tambin se pueden aplicar a cadenas. Ambos realizan una concatenacin y estn implementados con objetos StringBuffer. Por ejemplo, la sentencia:
String s = "Qu" + " tal ?";

es interpretada por el compilador como:


String s = new StringBuffer().append( "Qu" ).append( " tal ?" ).toString();

y se marcara el StringBuffer para borrarlo ya que el contenido pasa al objeto String. Tambin, la sentencia:
s += " por ah!";

MANUAL DE JAVA

41

sera interpretada por el sistema como:


String s = new StringBuffer().append( s ).append( " por ah!" ).toString();

y volvera a marcar para borrar el nuevo StringBuffer.

USO DE CONVERSIONES
Veamos un ejemplo de utilidad de estas funciones. En el applet Conversion.java , que se muestra en el cdigo que sigue, se usan estas funciones para producir una salida til en un programa, presentando las coordenadas en las que se ha hecho click con el botn del ratn.
public class Conversion extends Applet { int RatonX = 25; int RatonY = 25; String Status = "Haz click con el ratn"; public void paint( Graphics g ) { g.drawString( Status,RatonX,RatonY ); } public boolean mouseDown( Event evt,int x,int y ) { Integer X = new Integer( x ); Integer Y = new Integer( y ); RatonX = x; RatonY = y; Status = X.toString()+","+Y.toString(); repaint(); return true; } }

MANEJO DE EXCEPCIONES
Vamos a mostrar como se utilizan las excepciones, reconvirtiendo nuestro applet de saludo a partir de la versin iterativa de HolaIte.java :
import java.awt.*; import java.applet.Applet; public class HolaIte extends Applet { private int i = 0; private String Saludos[] = { "Hola Mundo!", "HOLA Mundo!", "HOLA MUNDO!!" }; public void paint( Graphics g ) { g.drawString( Saludos[i],25,25 ); i++; } }

Normalmente, un programa termina con un mensaje de error cuando se lanza una excepcin. Sin embargo, Java tiene mecanismos para excepciones que permiten ver qu excepcin se ha producido e intentar recuperarse de ella. Vamos a reescribir el mtodo paint() de nuestra versin iterativa del saludo:
public void paint( Graphics g ) { try { g.drawString( Saludos[i],25,25 ); } catch( ArrayIndexOutOfBoundsException e ) { g.drawString( "Saludos desbordado",25,25 ); } catch( Exception e ) { // Cualquier otra excepcin System.out.println( e.toString() ); } finally { System.out.println( "Esto se imprime siempre!" ); } i++; }

La palabra clave finally define un bloque de cdigo que se quiere que sea ejecutado siempre, de acuerdo a si se captur la excepcin o no. En el ejemplo anterior, la salida en la consola, con i=4 sera:
Saludos desbordado Esto se imprime siempre!

MANUAL DE JAVA

42

GENERAR EXCEPCIONES
Cuando se produce un error se debera generar, o lanzar, una excepcin. Para que un mtodo en Java, pueda lanzar excepciones, hay que indicarlo expresamente.
void MetodoAsesino() throws NullPointerException,CaidaException

Se pueden definir excepciones propias, no hay por qu limitarse a las predefinidas; bastar con extender la clase Exception y proporcionar la funcionalidad extra que requiera el tratamiento de esa excepcin. Tambin pueden producirse excepciones no de forma explcita como en el caso anterior, sino de forma implcita cuando se realiza alguna accin ilegal o no vlida. Las excepciones, pues, pueden originarse de dos modos: el programa hace algo ilegal (caso normal), o el programa explcitamente genera una excepcin ejecutando la sentencia throw (caso menos normal). La sentencia throw tiene la siguiente forma:
throw ObtejoExcepction;

El objeto ObjetoException es un objeto de una clase que extiende la clase Exception . El siguiente cdigo de ejemplo origina una excepcin de divisin por cero:
class melon { public static void main( String[] a ) { int i=0, j=0, k; k = i/j; // Origina un error de division-by-zero } }

Si compilamos y ejecutamos esta aplicacin Java, obtendremos la siguiente salida por pantalla:
> javac melon.java > java melon java.lang.ArithmeticException: / by zero at melon.main(melon.java:5)

Las excepciones predefinidas, como ArithmeticException , se conocen como excepciones runtime. Actualmente, como todas las excepciones son eventos runtime, sera mejor llamarlas excepciones irrecuperables. Esto contrasta con las excepciones que generamos explcitamente, que suelen ser mucho menos severas y en la mayora de los casos podemos recuperarnos de ellas. Por ejemplo, si un fichero no puede abrirse, preguntamos al usuario que nos indique otro fichero; o si una estructura de datos se encuentra completa, podremos sobreescribir algn elemento que ya no se necesite.

MANUAL DE JAVA

43

EXCEPCIONES PREDEFINIDAS
Las excepciones predefinidas y su jerarqua de clases es la que se muestra en la figura:

Los nombres de las excepciones indican la condicin de error que representan. Las siguientes son las excepciones predefinidas ms frecuentes que se pueden encontrar:
ArithmeticException

Las excepciones aritmticas son tpicamente el resultado de una divisin por 0:


int i = 12 / 0;

MANUAL DE JAVA

44 NullPointerException

Se produce cuando se intenta acceder a una variable o mtodo antes de ser definido:
class Hola extends Applet { Image img; paint( Graphics g ) { g.drawImage( img,25,25,this ); } }

IncompatibleClassChangeException

El intento de cambiar una clase afectada por referencias en otros objetos, especficamente cuando esos objetos todava no han sido recompilados.
ClassCastException

El intento de convertir un objeto a otra clase que no es vlida.


y = (Prueba)x; // donde x no es de tipo Prueba

NegativeArraySizeException

Puede ocurrir si hay un error aritmtico al intentar cambiar el tamao de un array.


OutOfMemoryException

No debera producirse nunca! El intento de crear un objeto con el operador new ha fallado por falta de memoria. Y siempre tendra que haber memoria suficiente porque el garbage collector se encarga de proporcionarla al ir liberando objetos que no se usan y devolviendo memoria al sistema.
NoClassDefFoundException

Se referenci una clase que el sistema es incapaz de encontrar.


ArrayIndexOutOfBoundsException

Es la excepcin que ms frecuentemente se produce. Se genera al intentar acceder a un elemento de un array ms all de los lmites definidos inicialmente para ese array.
UnsatisfiedLinkException

Se hizo el intento de acceder a un mtodo nativo que no existe. Aqu no existe un mtodo a.kk
class A { native void kk(); }

InternalException

Este error se reserva para eventos que no deberan ocurrir. Por definicin, el usuario nunca debera ver este error y esta excepcin no debera lanzarse.

MANUAL DE JAVA

45

CREAR EXCEPCIONES
Tambin podemos lanzar nuestras propias excepciones, extendiendo la clase System.exception . Por ejemplo, consideremos un programa cliente/servidor. El cdigo cliente se intenta conectar al servidor, y durante 5 segundos se espera a que conteste el servidor. Si el servidor no responde, el servidor lanzara la excepcin de time-out:
class ServerTimeOutException extends Exception {} public void conectame( String nombreServidor ) throws Exception { int exito; int puerto = 80; exito = open( nombreServidor,puerto ); if( exito == -1 ) throw ServerTimeOutException; }

Si se quieren capturar las propias excepciones, se deber utilizar la sentencia try :


public void encuentraServidor() { ... try { conectame( servidorDefecto ); catch( ServerTimeOutException e ) { g.drawString( "Time-out del Servidor, intentando alternativa", 5,5 ); conectame( servidorAlterno ); } ... }

Cualquier mtodo que lance una excepcin tambin debe capturarla, o declararla como parte de la interface del mtodo. Cabe preguntarse entonces, el porqu de lanzar una excepcin si hay que capturarla en el mismo mtodo. La respuesta es que las excepciones no simplifican el trabajo del control de errores. Tienen la ventaja de que se puede tener muy localizado el control de errores y no tenemos que controlar millones de valores de retorno, pero no van ms all.

CAPTURAR EXCEPCIONES
Las excepciones lanzadas por un mtodo que pueda hacerlo deben recoger en bloque try/catch o try/finally .
int valor; try { for( x=0,valor = 100; x < 100; x ++ ) valor /= x; } catch( ArithmeticException e ) { System.out.println( "Matemticas locas!" ); } catch( Exception e ) { System.out.println( "Se ha producido un error" ); }

try Es el bloque de cdigo donde se prev que se genere una excepcin. Es como si dijsemos "intenta estas sentencias y mira a ver si se produce una excepcin". El bloque try tiene que ir seguido, al menos, por una clusula catch o una clusula finally catch Es el cdigo que se ejecuta cuando se produce la excepcin. Es como si dijsemos "controlo cualquier excepcin que coincida con mi argumento". En este bloque tendremos que asegurarnos de colocar cdigo que no genere excepciones. Se pueden colocar sentencias catch sucesivas, cada una controlando una excepcin diferente. No debera intentarse capturar todas las excepciones con una sola clusula, como esta:
catch( Excepcion e ) { ...

Esto representara un uso demasiado general, podran llegar muchas ms excepciones de las esperadas. En este caso es mejor dejar que la excepcin se propague hacia arriba y dar un mensaje de error al usuario.

MANUAL DE JAVA

46

Se pueden controlar grupos de excepciones, es decir, que se pueden controlar, a travs del argumento, excepciones semejantes. Por ejemplo:
class Limites extends Exception {} class demasiadoCalor extends Limites {} class demasiadoFrio extends Limites {} class demasiadoRapido extends Limites {} throw( new demasiado Cansado() ); } catch( Limites lim ) { if( lim instanceof demasiadoCalor ) { System.out.println( "Capturada excesivo calor!" ); return; } if( lim instanceof demasiadoCansado ) { System.out.println( "Capturada excesivo cansancio!" ); return; } } finally System.out.println( "En la clausula finally" );

La clusula catch comprueba los argumentos en el mismo orden en que aparezcan en el programa. Si hay alguno que coincida, se ejecuta el bloque. El operador instanceof se utiliza para identificar exactamente cual ha sido la identidad de la excepcin. finally Es el bloque de cdigo que se ejecuta siempre, haya o no excepcin. Hay una cierta controversia entre su utilidad, pero, por ejemplo, podra servir para hacer un log o un seguimiento de lo que est pasando, porque como se ejecuta siempre puede dejarnos grabado si se producen excepciones y nos hemos recuperado de ellas o no. Este bloque finally puede ser til cuando no hay ninguna excepcin. Es un trozo de cdigo que se ejecuta independientemente de lo que se haga en el bloque try. Cuando vamos a tratar una excepcin, se nos plantea el problema de qu acciones vamos a tomar. En la mayora de los casos, bastar con presentar una indicacin de error al usuario y un mensaje avisndolo de que se ha producido un error y que decida si quiere o no continuar con la ejecucin del programa. Por ejemplo, podramos disponer de un dilogo como el que se presenta en el cdigo siguiente:
public class DialogoError extends Dialog { DialogoError( Frame padre ) { super( padre,true ); setLayout( new BorderLayout() ); // Presentamos un panel con continuar o salir Panel p = new Panel(); p.add( new Button( "Continuar?" ) ); p.add( new Button( "Salir" ) ); add( "Center",new Label( "Se ha producido un error. Continuar?" ) ) add( "South",p ); } public boolean action( Event evt,Object obj ) { if( "Salir".equals( obj ) ) { dispose(); System.exit( 1 ); } return false; } }

Y la invocacin, desde algn lugar en que se suponga que se generarn errores, podra ser como sigue:
try { // Cdigo peligroso } catch( AlgunaExcepcion e ) { VentanaError = new DialogoError( this ); VentanaError.show(); }

MANUAL DE JAVA

47

PROPAGACION DE EXCEPCIONES
La clusula catch comprueba los argumentos en el mismo orden en que aparezcan en el programa. Si hay alguno que coincida, se ejecuta el bloque y sigue el flujo de control por el bloque finally (si lo hay) y concluye el control de la excepcin. Si ninguna de las clusulas catch coincide con la excepcin que se ha producido, entonces se ejecutar el cdigo de la clusula finally (en caso de que la haya). Lo que ocurre en este caso, es exactamente lo mismo que si la sentencia que lanza la excepcin no se encontrase encerrada en el bloque try. El flujo de control abandona este mtodo y retorna prematuramente al mtodo que lo llam. Si la llamada estaba dentro del mbito de una sentencia try, entonces se vuelve a intentar el control de la excepcin, y as continuamente. Veamos lo que sucede cuando una excepcin no es tratada en la rutina en donde se produce. El sistema Java busca un bloque try..catch ms all de la llamada, pero dentro del mtodo que lo trajo aqu. Si la excepcin se propaga de todas formas hasta lo alto de la pila de llamadas sin encontrar un controlador especfico para la excepcin, entonces la ejecucin se detendr dando un mensaje. Es decir, podemos suponer que Java nos est proporcionando un bloque catch por defecto, que imprime un mensaje de error y sale. No hay ninguna sobrecarga en el sistema por incorporar sentencias try al cdigo. La sobrecarga se produce cuando se genera la excepcin. Hemos dicho ya que un mtodo debe capturar las excepciones que genera, o en todo caso, declararlas como parte de su llamada, indicando a todo el mundo que es capaz de generar excepciones. Esto debe ser as para que cualquiera que escriba una llamada a ese mtodo est avisado de que le puede llegar una excepcin, en lugar del valor de retorno normal. Esto permite al programador que llama a ese mtodo, elegir entre controlar la excepcin o propagarla hacia arriba en la pila de llamadas. La siguiente lnea de cdigo muestra la forma general en que un mtodo declara excepciones que se pueden propagar fuera de l:
tipo_de_retorno( parametros ) throws e1,e2,e3 { }

Los nombres e1,e2,... deben ser nombres de excepciones, es decir, cualquier tipo que sea asignable al tipo predefinido Throwable . Observar que, como en la llamada al mtodo se especifica el tipo de retorno, se est especificando el tipo de excepcin que puede generar (en lugar de un objeto exception). He aqu un ejemplo, tomado del sistema Java de entrada/salida:
byte readByte() throws IOException; short readShort() throws IOException; char readChar() throws IOException; void writeByte( int v ) throws IOException; void writeShort( int v ) throws IOException; void writeChar( int v ) throws IOException;

Lo ms interesante aqu es que la rutina que lee un char, puede devolver un char; no el entero que se requiere en C. C necesita que se devuelva un int, para poder pasar cualquier valor a un char, y adems un valor extra (-1) para indicar que se ha alcanzado el final del fichero. Algunas de las rutinas Java lanzan una excepcin cuando se alcanza el fin del fichero.

MANUAL DE JAVA

48

En el siguiente diagrama se muestra grficamente cmo se propaga la excepcin que se genera en el cdigo, a travs de la pila de llamadas durante la ejecucin del cdigo:

Cuando se crea una nueva excepcin, derivando de una clase Exception ya existente, se puede cambiar el mensaje que lleva asociado. La cadena de texto puede ser recuperada a travs de un mtodo. Normalmente, el texto del mensaje proporcionar informacin para resolver el problema o sugerir una accin alternativa. Por ejemplo:
class SinGasolina extends Exception { SinGasolina( String s ) { // constructor super( s ); } .... // Cuando se use, aparecer algo como esto try { if( j < 1 ) throw new SinGasolina( "Usando deposito de reserva" ); } catch( SinGasolina e ) { System.out.println( o.getMessage() ); }

Esto, en tiempo de ejecucin originara la siguiente salida por pantalla:


> Usando deposito de reserva

Otro mtodo que es heredado de la superclase Throwable es printStackTrace() . Invocando a este mtodo sobre una excepcin se volcar a pantalla todas las llamadas hasta el momento en donde se gener la excepcin (no donde se maneje la excepcin). Por ejemplo:
// Capturando una excepcin en un mtodo class testcap { static int slice0[] = { 0,1,2,3,4 }; public static void main( String a[] ) { try { uno(); } catch( Exception e ) { System.out.println( "Captura de la excepcion en main()" ); e.printStackTrace(); } } static void uno() { try { slice0[-1] = 4; } catch( NullPointerException e ) { System.out.println( "Captura una excepcion diferente" ); } } }

Cuando se ejecute ese cdigo, en pantalla observaremos la siguiente salida:


> Captura de la excepcion en main() > java.lang.ArrayIndexOutOfBoundsException: -1 at testcap.uno(test5p.java:19) at testcap.main(test5p.java:9)

Con todo el manejo de excepciones podemos concluir que proporciona un mtodo ms seguro para el control de errores, adems de representar una excelente herramienta para organizar en sitios concretos todo el manejo de los errores y, adems, que podemos proporcionar mensajes de error ms decentes al usuario indicando qu es lo que ha fallado y por qu, e incluso podemos, a veces, recuperarnos de los errores.
MANUAL DE JAVA

49

La degradacin que se produce en la ejecucin de programas con manejo de excepciones est ampliamente compensada por las ventajas que representa en cuanto a seguridad de funcionamiento de esos mismos programas.

ENTRADA/SALIDA ESTANDAR
Los usuarios de Unix, y aquellos familiarizados con las lneas de comandos de otros sistemas como DOS, han utilizado un tipo de entrada/salida conocida comnmente por entrada/salida estndar . El fichero de entrada estndar ( stdin ) es simplemente el teclado. El fichero de salida estndar ( stdout ) es tpicamente la pantalla (o la ventana del terminal). El fichero de salida de error estndar ( stderr ) tambin se dirige normalmente a la pantalla, pero se implementa como otro fichero de forma que se pueda distinguir entre la salida normal y (si es necesario) los mensajes de error.
La clase System

Java tiene acceso a la entrada/salida estndar a travs de la clase System . En concreto, los tres ficheros que se implementan son:
Stdin

System.in implementa stdin como una instancia de la clase InputStream . Con System.in , se accede a los mtodos read() y skip( ). El mtodo read() permite leer un byte de la entrada. skip( long n ) , salta n bytes de la entrada.
Stdout

System.out implementa stdout como una instancia de la clase PrintStream . Se pueden utilizar los mtodos print() y println() con cualquier tipo bsico Java como argumento.
Stderr

System.err implementa stderr de la misma forma que stdout. Como con System.out, se tiene acceso a los mtodos de PrintStream. Vamos a ver un pequeo ejemplo de entrada/salida en Java. El cdigo siguiente, miType.java , reproduce, o funciona como la utilidad cat de Unix o type de DOS:
import java.io.*; class miType { public static void main( String args[] ) throws IOException { int c; int contador = 0; while( (c = System.in.read() ) != 'n' ) { contador++; System.out.print( (char)c ); } System.out.println(); // Lnea en blanco System.err.println( "Contados "+ contador +" bytes en total." ); } }

MANUAL DE JAVA

50

Clases comunes de Entrada/Salida Adems de la entrada por teclado y salida por pantalla, se necesita entrada/salida por fichero, como son:
FileInputStream DataInputStream FileOutputStream DataOutputStream

Tambin existen otras clases para aplicaciones ms especficas, que no vamos a tratar, por ser de un uso muy concreto:
PipedInputStream BufferedInputStream PipedOutputStream BufferedOutputStream PushBackInputStream StreamTokenizer

FICHEROS
Todos los lenguajes de programacin tienen alguna forma de interactuar con los sistemas de ficheros locales; Java no es una excepcin. Cuando se desarrollan applets para utilizar en red, hay que tener en cuenta que la entrada/salida directa a fichero es una violacin de seguridad de acceso. Muchos usuarios configurarn sus navegadores para permitir el acceso al sistema de ficheros, pero otros no. Por otro lado, si se est desarrollando una aplicacin Java para uso interno, probablemente ser necesario el acceso directo a ficheros.
Ficheros

Antes de realizar acciones sobre un fichero, necesitamos un poco de informacin sobre ese fichero. La clase File proporciona muchas utilidades relacionadas con ficheros y con la obtencin de informacin bsica sobre esos ficheros. Creacin de un objeto File Para crear un objeto File nuevo, se puede utilizar cualquiera de los tres constructores siguientes:
File miFichero; miFichero = new File( "/etc/kk" );

o
miFichero = new File( "/etc","kk" );

o
File miDirectorio = new File( "/etc" ); miFichero = new File( miDirectorio,"kk" );

El constructor utilizado depende a menudo de otros objetos File necesarios para el acceso. Por ejemplo, si slo se utiliza un fichero en la aplicacin, el primer constructor es el mejor. Si en cambio, se utilizan muchos ficheros desde un mismo directorio, el segundo o tercer constructor sern ms cmodos. Y si el directorio o el fichero es una variable, el segundo constructor ser el ms til.
MANUAL DE JAVA

51

Comprobaciones y Utilidades Una vez creado un objeto File, se puede utilizar uno de los siguientes mtodos para reunir informacin sobre el fichero:
y

Nombres de fichero

String getName() String getPath() String getAbsolutePath() String getParent() boolean renameTo( File nuevoNombre ) y

Comprobaciones

boolean exists() boolean canWrite() boolean canRead() boolean isFile() boolean isDirectory() boolean isAbsolute() y

Informacin general del fichero

long lastModified() long length() y

Utilidades de directorio

boolean mkdir() String[] list()

Vamos a desarrollar una pequea aplicacin que muestra informacin sobre los ficheros pasados como argumentos en la lnea de comandos, InfoFichero.java :
import java.io.*; class InfoFichero { public static void main( String args[] ) throws IOException { if( args.length > 0 ) { for( int i=0; i < args.length; i++ ) { File f = new File( args[i] ); System.out.println( "Nombre: "+f.getName() ); System.out.println( "Camino: "+f.getPath() ); if( f.exists() ) { System.out.print( "Fichero existente " ); System.out.print( (f.canRead() ? " y se puede Leer" : "" ) ); System.out.print( (f.canWrite() ? " y se puese Escribir" : "" ) ); System.out.println( "." ); System.out.println( "La longitud del fichero son "+ f.length()+" bytes" ); } else System.out.println( "El fichero no existe." ); } } else System.out.println( "Debe indicar un fichero." ); } }

MANUAL DE JAVA

52

STREAMS DE ENTRADA
Hay muchas clases dedicadas a la obtencin de entrada desde un fichero. Este es el esquema de la jerarqua de clases de entrada por fichero:

Objetos FileInputStream Los objetos FileInputStream tpicamente representan ficheros de texto accedidos en orden secuencial, byte a byte. Con FileInputStream, se puede elegir acceder a un byte, varios bytes o al fichero completo. Apertura de un FileInputStream Para abrir un FileInputStream sobre un fichero, se le da al constructor un String o un objeto File:
FileInputStream mi FicheroSt; miFicheroSt = new FileInputStream( "/etc/kk" );

Tambin se puede utilizar:


File miFichero FileInputStream miFicheroSt; miFichero = new File( "/etc/kk" ); miFicheroSt = new FileInputStream( miFichero );

Lectura de un FileInputStream Una vez abierto el FileInputStream, se puede leer de l. El mtodo read() tiene muchas opciones: int read(); Lee un byte y devuelve -1 al final del stream. int read( byte b[] ); Llena todo el array, si es posible. Devuelve el nmero de bytes ledos o -1 si se alcanz el final del stream. int read( byte b[],int offset,int longitud ); Lee longitud bytes en b comenzando por b[offset]. Devuelve el nmero de bytes ledos o -1 si se alcanz el final del stream. Cierre de FileInputStream Cuando se termina con un fichero, existen dos opciones para cerrarlo: explcitamente, o implcitamente cuando se recicla el objeto (el garbage collector se encarga de ello).
MANUAL DE JAVA

53

Para cerrarlo explcitamente, se utiliza el mtodo close():


miFicheroSt.close();

Ejemplo: Visualizacin de un fichero Si la configuracin de la seguridad de Java permite el acceso a ficheros, se puede ver el contenido de un fichero en un objeto TextArea. El cdigo siguiente contiene los elementos necesarios para mostrar un fichero:
FileInputStream fis; TextArea ta; public void init() { byte b[] = new byte[1024]; int i; // El buffer de lectura se debe hacer lo suficientemente grande // o esperar a saber el tamao del fichero String s; try { fis = new FileInputStream( "/etc/kk" ); } catch( FileNotFoundException e ) { /* Hacer algo */ } try { i = fis.read( b ); } catch( IOException e ) { /* Hacer algo */ } s = new String( b,0 ); ta = new TextArea( s,5,40 ); add( ta ); }

Hemos desarrollado un ejemplo, Agenda.java, en el que partimos de un fichero agenda que dispone de los datos que nosotros deseamos de nuestros amigos, como son: nombre, telfono y direccin. Si tecleamos un nombre, buscar en el fichero de datos si existe ese nombre y presentar la informacin que se haya introducido. Para probar, intentar que aparezca la informacin de Pepe. Objetos DataInputStream Los objetos DataInputStream se comportan como los FileInputStream. Los streams de datos pueden leer cualquiera de las variables de tipo nativo, como floats, ints o chars. Generalmente se utilizan DataInputStream con ficheros binarios. Apertura y cierre de DataInputStream Para abrir y cerrar un objeto DataInputStream, se utilizan los mismos mtodos que para FileInputStream:
DataInputStream miDStream; FileInputStream miFStream; // Obtiene un controlador de fichero miFStream = new FileInputStream "/etc/ejemplo.dbf" ); //Encadena un fichero de entrada de datos miDStream = new DataInputStream( miFStream ); // Ahora se pueden utilizar los dos streams de entrada para // acceder al fichero (si se quiere...) miFStream.read( b ); i = miDStream.readInt(); // Cierra el fichero de datos explcitamente //Siempre se cierra primero el fichero stream de mayor nivel miDStream.close(); miFStream.close();

Lectura de un DataInputStream Al acceder a un fichero como DataInputStream, se pueden utilizar los mismos mtodos read() de los objetos FileInputStream. No obstante, tambin se tiene acceso a otros mtodos diseados para leer cada uno de los tipos de datos:
byte readByte() int readUnsignedByte() short readShort() readUnsignedShort() char readChar() int readInt() long readLong() readFloat() double readDouble() String readLine() int float

Cada mtodo leer un objeto del tipo pedido. Para el mtodo String readLine(), se marca el final de la cadena con n, r, rn o con EOF. Para leer un long, por ejemplo:
long numeroSerie; ... numeroSerie = miDStream.readLong();

MANUAL DE JAVA

54

Streams de entrada de URLs Adems del acceso a ficheros, Java proporciona la posibilidad de acceder a URLs como una forma de acceder a objetos a travs de la red. Se utiliza implcitamente un objeto URL al acceder a sonidos e imgenes, con el mtodo getDocumentBase() en los applets:
String imagenFich = new String( "imagenes/pepe.gif" ); imagenes[0] = getImage( getDocumentBase(),imagenFich );

No obstante, se puede proporcionar directamente un URL, si se quiere:


URL imagenSrc; imagenSrc = new URL( "http://enterprise.com/~info" imagenes[0] = getImage( imagenSrc,"imagenes/pepe.gif" ); );

Apertura de un Stream de entrada de URL Tambin se puede abrir un stream de entrada a partir de un URL. Por ejemplo, se puede utilizar un fichero de datos para un applet:
ImputStream is; byte buffer[] = getDocumentBase(),datos).openStream(); new byte[24]; is = new URL(

Ahora se puede utilizar is para leer informacin de la misma forma que se hace con un objeto FileInputStream:
is.read( buffer,0,buffer.length );

NOTA: Debe tenerse muy en cuenta que algunos usuarios pueden haber configurado la seguridad de sus navegadores para que los applets no accedan a ficheros.

STREAMS DE SALIDA
La contrapartida necesaria de la lectura de datos es la escritura de datos. Como con los Streams de entrada, las clases de salida estn ordenadas jerrquicamente:

Examinaremos las clases FileOutputStream y DataOutputStream para complementar los streams de entrada que se han visto. En los ficheros fuente del directorio $JAVA_HOME/src/java/io se puede ver el uso y mtodos de estas clases, as como de los streams de entrada ($JAVA_HOME es el directorio donde se haya instalado el Java Development Kit, en sistemas UNIX). Objetos FileOutputStream Los objetos FileOutputStream son tiles para la escritura de ficheros de texto. Como con los ficheros de entrada, primero se necesita abrir el fichero para luego escribir en l.

MANUAL DE JAVA

55

Apertura de un FileOutputStream Para abrir un objeto FileOutputStream, se tienen las mismas posibilidades que para abrir un fichero stream de entrada. Se le da al constructor un String o un objeto File.
FileOutputStream miFicheroSt; miFicheroSt = new FileOutputStream( "/etc/kk" );

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

Escritura en un FileOutputStream Una vez abierto el fichero, se pueden escribir bytes de datos utilizando el mtodo write(). Como con el mtodo read() de los streams de entrada, tenemos tres posibilidades: void write( int b ); Escribe un byte. void write( byte b[] ); Escribe todo el array, si es posible. void write( byte b[],int offset,int longitud ); Escribe longitud bytes en b comenzando por b[offset]. Cierre de FileOutputStream Cerrar un stream de salida es similar a cerrar streams de entrada. Se puede utilizar el mtodo explcito:
miFicheroSt.close();

O, se puede dejar que el sistema cierre el fichero cuando se recicle miFicheroSt. Ejemplo: Almacenamiento de Informacin Este programa, Telefonos.java, pregunta al usuario una lista de nombres y nmeros de telfono. Cada nombre y nmero se aade a un fichero situado en una localizacin fija. Para indicar que se ha introducido toda la lista, el usuario especifica "Fin" ante la solicitud de entrada del nombre. Una vez que el usuario ha terminado de teclear la lista, el programa crear un fichero de salida que se mostrar en pantalla o se imprimir. Por ejemplo:
95-4751232,Juanito 564878,Luisa 123456,Pepe 347698,Antonio 91-3547621,Maria

MANUAL DE JAVA

56

El cdigo fuente del programa es el siguiente:


import java.io.*; class Telefonos { static FileOutputStream fos; public static final int longLinea = 81; public static void main( String args[] ) throws IOException { byte tfno[] = new byte[longLinea]; byte nombre[] = new byte[longLinea]; fos = new FileOutputStream( "telefono.dat" ); while( true ) { System.err.println( "Teclee un nombre ('Fin' termina)" ); leeLinea( nombre ); if( "fin".equalsIgnoreCase( new String( nombre,0,0,3 ) ) ) break; System.err.println( "Teclee el numero de telefono" ); leeLinea( tfno ); for( int i=0; tfno[i] != 0; i++ ) fos.write( tfno[i] ); fos.write( ',' ); for( int i=0; nombre[i] != 0; i++ ) fos.write( nombre[i] ); fos.write( 'n' ); } fos.close(); } private static void leeLinea( byte linea[] ) throws IOException { int b = 0; int i = 0; while( (i < ( longLinea-1) ) && ( ( b = System.in.read() ) != 'n' ) ) linea[i++] = (byte)b; linea[i] = (byte)0; } }

Streams de salida con buffer Si se trabaja con gran cantidad de datos, o se escriben muchos elementos pequeos, ser una buena idea utilizar un stream de salida con buffer. Los streams con buffer ofrecen los mismos mtodos de la clase FileOutputStream, pero toda salida se almacena en un buffer. Cuando se llena el buffer, se enva a disco con una nica operacin de escritura; o, en caso necesario, se puede enviar el buffer a disco en cualquier momento. Creacin de Streams de salida con buffer Para crear un stream BufferedOutput, primero se necesita un stream FileOutput normal; entonces se le aade un buffer al stream:
FileOutputStream miFileStream; BufferdOutpurStream miBufferStream; // Obtiene un controlador de fichero miFileStream = new FileOutputStream( "/tmp/kk" ); // Encadena un stream de salida con buffer miBufferStream = new BufferedOutputStream( miFileStream );

Volcado y Cierre de Streams de salida con buffer Al contrario que los streams FileOutput, cada escritura al buffer no se corresponde con una escritura en disco. A menos que se llene el buffer antes de que termine el programa, cuando se quiera volcar el buffer explcitamente se debe hacer mediante una llamada a flush():

MANUAL DE JAVA

57
// Se fuerza el volcado del buffer a disco miBufferStream.flush(); // Cerramos el fichero de datos. Siempre se ha de cerrar primero el // fichero stream de mayor nivel miBufferStream.close(); miFileStream.close();

Streams DataOutput Java tambin implementa una clase de salida complementaria a la clase DataInputStream. Con la clase DataOutputStream, se pueden escribir datos binarios en un fichero. Apertura y cierre de objetos DataOutputStream Para abrir y cerrar objetos DataOutputStream, se utilizan los mismos mtodos que para los objetos FileOutputStream:
DataOutputStream miDataStream; FileOutputStream miFileStream; BufferedOutputStream miBufferStream; // Obtiene un controlador de fichero miFileStream = new FileOutputStream( "/tmp/kk" ); // Encadena un stream de salida con buffer (por eficiencia) miBufferStream = new BufferedOutputStream( miFileStream ); // Encadena un fichero de salida de datos miDataStream = new DataOutputStream( miBufferStream ); // Ahora se pueden utilizar los dos streams de entrada para // acceder al fichero (si se quiere) miBufferStream.write( b ); miDataStream.writeInt( i ); // Cierra el fichero de datos explcitamente. Siempre se cierra // primero el fichero stream de mayor nivel miDataStream.close(); miBufferStream.close(); miFileStream.close();

Escritura en un objeto DataOutputStream Cada uno de los mtodos write() accesibles por los FileOutputStream tambin lo son a travs de los DataOutputStream. Tambin encontrar mtodos complementarios a los de DataInputStream:
void writeBoolean( boolean b ); void writeByte( int i ); void writeShort( int i ); void writeChar( int i ); void writeInt( int i ); void writeFloat( float f ); void writeDouble( double d ); void writeBytes( String s ); void writeChars( string s );

Para las cadenas, se tienen dos posibilidades: bytes y caracteres. Hay que recordar que los bytes son objetos de 8 bits y los caracteres lo son de 16 bits. Si nuestras cadenas utilizan caracteres Unicode, debemos escribirlas con writeChars(). Contabilidad de la salida Otra funcin necesaria durante la salida es el mtodo size(). Este mtodo simplemente devuelve el nmero total de bytes escritos en el fichero. Se puede utilizar size() para ajustar el tamao de un fichero a mltiplo de cuatro. Por ejemplo, de la forma siguiente:
. . . int numBytes = miDataStream.size() % 4; for( int i=0; i < numBytes; i++ ) miDataStream.write( 0 ); . . .

FICHEROS DE ACCESO ALEATORIO


A menudo, no se desea leer un fichero de principio a fin; sino acceder al fichero como una base de datos, donde se salta de un registro a otro; cada uno en diferentes partes del fichero. Java proporciona una clase RandomAccessFile para este tipo de entrada/salida. Creacin de un Fichero de Acceso Aleatorio Hay dos posibilidades para abrir un fichero de acceso aleatorio:

MANUAL DE JAVA

58

Con el nombre del fichero:


miRAFile = new RandomAccessFile( String nombre,String modo );

Con un objeto File:


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

El argumento modo determina si se tiene acceso de slo lectura ( r ) o de lectura/escritura ( r/w ). Por ejemplo, se puede abrir un fichero de una base de datos para actualizacin:
RandomAccessFile miRAFile; miRAFile = new RandomAccessFile( "/tmp/kk.dbf","rw" );

Acceso a la Informacin Los objetos RandomAccessFile esperan informacin de lectura/escritura de la misma manera que los objetos DataInput/DataOutput. Se tiene acceso a todas las operaciones read() y write() de las clases DataInputStream y DataOutputStream . Tambin se tienen muchos mtodos para moverse dentro de un fichero: long getFilePointer(); Devuelve la posicin actual del puntero del fichero void seek( long pos ); Coloca 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 ese fichero. long length(); Devuelve la longitud del fichero. La posicin length() marca el final de ese fichero. Actualizacin de Informacin Se pueden utilizar ficheros de acceso aleatorio para aadir informacin a ficheros existentes:
miRAFile = new RandomAccessFile( "/tmp/kk.log","rw" ); miRAFile.seek( miRAFile.length() ); // Cualquier write() que hagamos a partir de este punto del cdigo // aadir informacin al fichero

Vamos a ver un pequeo ejemplo, Log.java , que aade una cadena a un fichero existente:
import java.io.*; // Cada vez que ejecutemos este programita, se incorporara una nueva // linea al fichero de log que se crea la primera vez que se ejecuta // class Log { public static void main( String args[] ) throws IOException { RandomAccessFile miRAFile; String s = "Informacion a incorporarnTutorial de Javan"; // Abrimos el fichero de acceso aleatorio miRAFile = new RandomAccessFile( "/tmp/java.log","rw" ); // Nos vamos al final del fichero miRAFile.seek( miRAFile.length() ); // Incorporamos la cadena al fichero miRAFile.writeBytes( s ); // Cerramos el fichero miRAFile.close(); } }

MANUAL DE JAVA