Professional Documents
Culture Documents
1
Qué necesitamos
• LA PÁGINA DE SUN
• En http://www.java.sun.com tenemos todo
lo necesario para bajarnos java y empezar
a trabajar con él.
2
Ediciones de Java
• Lo primero que tenemos que decidir es qué "edición" de
java necesitamos. Hay tres disponibles: J2ME, J2SE y
J2EE
• J2ME es la versión "Micro". Es una versión "reducida" de
java para aparatos pequeños. Los más típicos son los
teléfonos móviles. Si no queremos desarrollar un juego
para uno de estos diabólicos inventos, esta no es nuestra
versión.
• J2SE es la versión "Standard". Esta es la versión para las
aplicaciones normales que pueden correr en un PC.
Normalmente, esta es la versión que debemos descargar.
• J2EE es la versión "Enterprise". Esta versión es para el
desarrollo de aplicaciones web. Es útil para gente que
programa en servidores web y hacen páginas web
complejas, con accesos a bases de datos, etc, etc.
3
• Suponemos que nos hemos decidido por el J2SE. Dentro tenemos
varias opciones para descargarnos. Vamos a verlas:
• JRE es el entorno de ejecución. Sirve para poder ejecutar
programas java que ya estén hechos, pero no para desarrollar
nuestros propios programas. Esta opción es la adecuada para
aquellos que quieren navegar por internet y que les funcionen los
applets (programitas java) incluidos en algunas páginas web o los
chats realizados en java.
• SDK es el entorno de desarrollo. Aquí está incluido el compilador
de java, el debugger y otras herramientas. Esta es la opción
adecuada para los que quieren programar en java sus propias
aplicaciones.
• SDK + netbeans es lo mismo de antes, pero incluye netbeans, un
entorno visual de desarrollo.
4
UN ENTORNO VISUAL DE
DESARROLLO
-- Lo compilamos
$ javac HolaMundo.java
-- Lo ejecutamos
$ java HolaMundo
¡Hola Mundo!
6
• El netbeans es un entorno visual de desarrollo. Cuando
arrancamos netbeans, nos aparece un árbol con todas las clases
de nuestra aplcación o proyecto (por supuesto, la primera vez que
lo arranquemos saldrá vacío), un editor en el que podemos escribir
nuestro programa, con opciones para ejecutar, para depurar, etc,
etc. Para los conocedores de otros lenguajes, algo similar al Visual
C++, Visual Basic o C++ Builder.
• El desarrollo siempre es más fácil con una herramienta de este tipo,
sin embargo su gran ventaja es también su gran inconveniente: Nos
solucionan automáticamente muchos de los trabajos que haríamos
a mano de no tenerla. Esto hace que haya cosas que no
aprendamos. Es bastante habitual que programadores
acostumbrados a estas herramientas no sepan luego compilar o
incluso ejecutar un programa java fuera de ella.
7
• Netbeans tiene su propia página http://
www.netbeans.org en la que puedes
descargarte el mismo netbeans (es
gratuito) y módulos adicionales para el
mismo (unos son gratuitos y otros no).
8
• Hay otros entornos de desarrollo visuales
gratuitos, como eclipse, que puedes
descargarte de http://www.eclipse.org.
• Y además están los de pago, como
JBuilder (de Borland) o IntelliJ Idea.
9
LA API DE JAVA
10
RESUMIENDO
11
CREAMOS EL PROGRAMA
• Lo mejor es empezar los primeros
programas con un editor de textos
normalito (notepad, vi, xemcas, etc).
• No usamos Word, WordPad, StarOffice o
cualquier otro procesador de textos en
condiciones, ya que los ficheros que
almacenan no los entiende nadie, salvo
ellos mismos. Por supuesto, mucho
menos el compilador de java.
12
• También es bueno para empezar compilar y ejecutar a
mano, desde línea de comandos.
• Es mejor no usar un IDE (estilo eclipse, netbeans,
jbuilder, etc) al principio.
• El IDE hace muchas cosas él sólo o con un simple click
de ratón, por ejemplo, compilar y ejecutar.
• La consecuencia de esto es que tú no aprendes a
hacerlas y luego, sin el IDE o con otro IDE distinto, estás
perdido. También es bastante normal que los IDE
añadan cosas propias de su cosecha, especialmente
JBuilder, que no son estandard de java. Si las usas sin
querer, estarás aprendiendo algo que no es java, sino
propio del IDE.
13
• En windows nos vale el notepad, en linux podemos usar
el vi. Atención a las mayúsculas y minúsculas en el
nombre del fichero y el nombre de la clase.
• $ vi HolaMundo.java
• c:\> notepad HolaMundo.java
• Ahora escribimos nuestro programa
• public class HolaMundo
{
public static void main (String [ ] args)
{
System.out.println ("Hola mundo");
}
}
14
• Guardamos el programa y salimos del
editor.
• Si más adelante queremos escribir en la
misma línea, debemos usar print().
• El código dentro del main será entonces
• System.out.println ("Hola Mundo");
15
COMPILAMOS EL PROGRAMA
16
• $ PATH=$PATH:/directorio_java/bin
• C:\> set PATH=%PATH
%;directorio_java\bin
• Si la ejecutar javac obtenemos un
mensaje de "Usage: javac" y la lista de
opciones, es que todo está correcto y
podemos compilar nuestro programa.
17
• Para compilar el programa, estando en el mismo
directorio en el que está el fichero
HolaMundo.java escribimos
• javac HolaMundo.java
18
EJECUTAR EL PROGRAMA
• $ java HolaMundo
Hola Mundo
• C:\> java HolaMundo
Hola Mundo
19
• El comando java admite como parámetro
el nombre de la clase, no el del fichero. La
clase se llama HolaMundo, el fichero se
llama HolaMundo.class. Por eso NO
HAY QUE PONER .class AL EJECUTAR.
Este despiste suele ser habitual en la
gente que empieza y llega a dar bastantes
quebraderos de cabeza hasta que se cae
en la cuenta.
20
LA CLASE HolaMundo
• Hemos hecho una clase que hemos llamado
HolaMundo.
• En java es habitual meter cada clase en un fichero
distinto. Es obligatorio que la clase se llame igual que el
fichero. Importan las mayúsculas y las minúsculas, así
que no es lo mismo HolaMundo que holaMundo ni que
Holamundo. Como nuestra clase se llama HolaMundo,
debemos llamar a nuestro fichero HolaMundo.java.
• Si hubiera varias clases en el mismo fichero, java sólo
permite que se pueda usar una de ellas desde código
que esté fuera del fichero. Esa clase que se puede ver
desde todos lados debe llevar el modificador public.
Además, la clase public debe ser obligatoriamente la
que se lllama igual que el fichero.
21
• En resumen, si hacemos un fichero HolaMundo.java,
debemos meter dentro obligatoriamente y para que todo
vaya bien una clase pública que se llame HolaMundo.
Eso es lo que tenemos en la primera línea.
• public class HolaMundo
• ¿Desde dónde hasta dónde va la clase?. En java lo
marcamos con una llaves. Inmediatamente después del
nombre de la clase, abrimos unas llaves. Luego
hacemos el código de nuestra clase y finalmente la
cerramos.
• public class HolaMundo
{
...
}
22
EL MÉTODO MAIN
• Dentro de la clase podemos poner código de muchas maneras distintas.
• Una forma habitual es hacer "métodos". Un método es un trozo de código al que
damos un nombre para poder identificarlo y llamarlo desde cualquier sitio.
• En java hay un nombre especial de método que es main. Cuando a java le decimos
que debe ejecutar el código de una clase, busca en dicha clase el método con
nombre main y es el método que ejecuta.
• Para que java entienda el método main, este debe estar declarado de una forma
muy concreta, que es la siguiente
• public static void main (String [ ] args)
{
...
}
• Debe ser public. Eso quiere decir que se le puede llamar desde cualquier lado.
• Debe ser static. Esto quiere decir que se le puede llamar sin necesidad de
instanciar la clase
• Es void. Eso quiere decir que ese método no devuelve ningún resultado.
• El parámetro del método, que va entre paréntesis detrás de él, es un array de String
(cadenas de texto
23
SACAR TEXTO POR LA
PANTALLA
• En java tenemos disponible la clase System que está accesible
directamente en cualquier sitio, es decir, podemos usarla sin hacer
nada especial siempre que queramos. Esta clase contiene cosas
relacionadas con nuestro sistema, con nuestro ordenador. Dentro,
entre otras cosas, tiene un atributo out que es público. Al ser
público podemos acceder a él libremente. Para acceder a este
atributo debemos indicar que está dentro de System. Eso se hace
poniendo System.out.
• Este atributo System.out esta ligado a la pantalla y es otra clase
que a su vez tiene métodos. Tiene método para poder enviarle
cadenas de caracteres que saldrán en pantalla. Los dos métodos
más usados son print() y println(). Ambos sacan el texto que
pongamos entre los paréntesis por pantalla, sólo que el segundo
añade además un "nueva línea
24
CLASSPATH
• java busca los ficheros .class en determinados sitios.
Las versiones más antiguas de java los buscan en el
directorio en el que está instalado java. Las versiones
más modernas los buscan en los mismos directorios y
en el directorio actual. Si estás con un java moderno,
java encontrará tu fichero HolaMundo.class y no
tendrás problemas. Si estás con un java antiguo,
entonces no lo encontrará y te dará el error de que no
encuentra la clase HolaMundo.
• Afortunadamente, java se puede configurar para que
busque clases en otros directorios de los de defecto.
Hay dos formas de hacerlo.
25
VARIABLE DE ENTORNO
CLASSPATH
• Una es por medio por la variable de entorno CLASSPATH. Simplemente debemos definir la
variable diciéndole en qué directorios están los ficheros .class. En windows estos directorios van
separados por punto y coma. En unix van separados por dos puntos.
• Podemos dar este path relativo o absoluto.
• $ CLASSPATH=.
$ CLASSPATH=/home/usuario/mi_proyecto_HolaMundo
$ export CLASSPATH
• En unix suele ser necesario poner "export CLASSPATH" después de definir la variable. En
unix, cuando se define una variable nueva por primera vez, si queremos que los demás procesos
(por ejemplo java cuando lo ejecutemos) la vean, es necesario ejecutar un export.
• En cuanto a windows, que tiene la costumbre de poner espacios en los nombres de directorio y
ficheros, suele ser necesario meterlo todo entre comillas, para que sepa que el comando no
termina en el espacio.
• Una vez hecho esto, deberíamos poder ejecutar el programa HolaMundo sin problemas.
26
OPCION DEL COMANDO JAVA
• La otra opción para definir el CLASSPATH es hacerlo
como opción en la linea de comandos de java. Se haría
así
• $ java -cp . HolaMundo
$ java -cp /home/usuario/mi_proyecto_HolaMundo
HolaMundo
• C:\> java -cp . HolaMundo
C:\> java -cp "C:\Documents and
Settings\usuario\mi_proyecto_HolaMundo" HolaMundo
27
QUÉ SON PAQUETES EN JAVA
• Cuando hacemos programas más grandes, es normal que el
número de clases vaya creciendo. Cada vez tenemos más y más
clases. Meterlas todas en el mismo directorio no suele ser lógico.
• Es mejor hacer grupos de clases, de forma que todas las clases
que traten de un determinado tema o estén relacionadas entre sí
vayan juntas.
• Por ejemplo, si hacemos un programa de una agenda de teléfonos
que los guarde en una base de datos, podemos meter todas las
clases que tratan con la base de datos en un paquete (grupo),
todas las de ventanas en otro, las de imprimir en otro, etc, etc.
• Un paquete de clases es un grupo de clases que agrupamos juntas
porque consideramos que están relacionadas entre sí o tratan de
un tema común.
28
LA CLASE HOLA MUNDO EN UN
PAQUETE
• Java nos ayuda a organizar las clases en paquetes.
• En cada fichero .java que hagamos, al principio, podemos indicar a qué paquete pertenece la
clase que hagamos en ese fichero.
• Por ejemplo, si decidimos agrupar nuestros programas de pruebas, incluido el Hola Mundo, en
un paquete "prueba", pondríamos esto en nuestro fichero HolaMundo.java
• package prueba;
public class HolaMundo
{
public static void main (String [ ] args)
{
System.out.println ("Hola mundo");
}
}
• El código es exactamente igual al de nuestro Hola Mundo original, pero hemos añadido la línea
"package prueba;" al principio.
• Hasta aquí todo correcto. Sin embargo, al hacer esto, para que todo funcione bien, java nos
obliga a organizar los directorios, compilar y ejecutar de cierta forma.
29
ESTRUCTURA DE DIRECTORIOS
ASOCIADA
• Si hacemos que HolaMundo.java pertenezca al paquete
prueba, java nos obliga a crear un subdirectorio "prueba" y
meter el HolaMundo.java ahí.
• Es decir, debemos tener esto así (unix y windows)
• /
<directorio_usuario>/mi_proyecto_HolaMundo/prueba/Hola
Mundo.java
• C:\<directorio_usuario>\mi_proyecto_HolaMundo\prueba\Ho
laMundo.java
• Nuevamente, las mayúsculas y minúsculas son importantes.
Tal cual lo pongamos en "package", debemos poner el
nombre del subdirectorio.
30
COMPILAR UNA CLASE QUE
ESTÁ EN UN PAQUETE
• Para compilar la clase que está en el paquete debemos
situarnos en el directorio padre del paquete y compilar
desde ahí
• $ cd /<directorio_usuario>/mi_proyecto_HolaMundo
$ javac prueba/HolaMundo.java
• C:\> cd C:\<directorio_usuario>\mi_proyecto_HolaMundo
C:\> javac prueba\HolaMundo.java
• Si todo va bien, en el directorio "prueba" se nos creará
un HolaMundo.class
31
EJECUTAR UNA CLASE QUE
ESTÁ EN UN PAQUETE
• Una vez generado el HolaMundo.class en el directorio prueba, para
ejecutarlo debemos estar situados en el directorio padre de
"prueba".
• El nombre "completo" de la clase es "paquete.clase", es decir
"prueba.HolaMundo". Por ello, para ejecutar, debemos hacerlo así
• $ cd /<directorio_usuario>/mi_proyecto_HolaMundo
$ java prueba.HolaMundo
Hola Mundo
• C:\> cd C:\<directorio_usuario>\mi_proyecto_HolaMundo
C:\> java prueba.HolaMundo
Hola Mundo
32
EL CLASSPATH CUANDO LAS
CLASES ESTÁN EN PAQUETES
• Cuando las clases están en paquetes, la variable CLASSPATH debe
ponerse de tal forma que encuentre el paquete, NO la clase. Es decir, en
nuestro ejemplo
• $ CLASSPATH=/<directorio_usuario>/mi_proyecto_HolaMundo
$ export CLASSPATH
$ java prueba.HolaMundo
Hola Mundo
• C:\> set CLASSPATH="C:\<directorio_usuario>\mi_proyecto_HolaMundo"
C:\> java prueba.HolaMundo
Hola Mundo
33
PAQUETES ANIDADOS
• Para poder organizar mejor las cosas, java permite hacer subpaquetes de
los paquetes y subpaquetes de los subpaquetes y así sucesivamente. Por
ejemplo, si quiero partir mis clases de prueba en pruebas básicas y pruebas
avanzadas, puedo poner más niveles de paquetes separando por puntos
• package prueba.basicas;
...
package prueba.avanzadas;
...
• A nivel de subdirectorios tendría que crear los subdirectorios "basicas" y
"avanzadas" debajo de "prueba" y meter ahí las clases que correspondan.
• Para compilar, en el directorio del proyecto habria que compilar poniendo
todo el path hasta llegar a la clase. Idem para el CLASSPATH. Para
ejecutar, el nombre de la clase va con todos los paquetes separados por
puntos, es decir "prueba.basicas.HolaMundo" y
"prueba.avanzadas.HolaMundoRemoto".
34
• Es decir:
• /
<directorio_usuario>/mi_proyecto_HolaMundo/prueba/basicas/Hola
Mundo.java
$ cd /<directorio_usuario>/mi_proyecto_HolaMundo
$ javac prueba/basicas/HolaMundo.java
$ java -cp /<directorio_usuario>/mi_proyecto_HolaMundo
prueba.basicas.HolaMundo
Hola Mundo
• C:\<directorio_usuario>\mi_proyecto_HolaMundo\prueba\basicas\H
olaMundo.java
C:\> cd C:\<directorio_usuario>\mi_proyecto_HolaMundo
C:\> javac prueba\basicas\HolaMundo.java
C:\> java -cp C:\<directorio_usuario>\mi_proyecto_HolaMundo
prueba.basicas.HolaMundo
Hola Mundo
35
• Cuando tenemos un programa grande, con varios
paquetes y clases, ya sabemos cómo organizarlo,
compilarlo y ejecutarlo.
• Sin embargo, para pasárselo a otros usuarios o
instalarlo en otro ordenador es un poco rollo. Tenemos
que llevarnos directorios enteros, con los ficheros que
hay dentro y demás.
• Lo ideal es meter todos estos ficheros y directorios en
un único fichero comprimido.
• Java, con su comando jar, que está en el directorio bin
de donde tengamos java, nos permite hacer esto.
Empaqueta todo lo que le digamos (directorios, clases,
ficheros de imagen o lo que queramos) en un único
fichero de extensión .jar.
36
• Un fichero de extensión .jar es similar a los .zip
de Winzip, a los .rar de Winrar o a los ficheros
.tar del tar de unix. De hecho, con Winzip o
Winrar se puede ver y desempaquetar el
contenido de un fichero .jar
• Java nos da además otra opción, podemos
ejecutar las clases del fichero .jar sin tener
que desempaquetarlo. Simplemente podemos
darle a nuestro usuario el fichero .jar con todo
dentro y ya está listo para ejecutar.
37
• Para crear un fichero jar, en primer lugar tenemos que tener todo
ya perfectamente preparado y compilado, funcionando.
• Si las clases de nuestro programa no pertenecen a paquetes,
simplemente debemos meter las clases en el fichero .jar Para ello,
vamos al directorio donde estén los ficheros .class y ejecutamos el
siguiente comando
• $ cd directorio_con_los_class
$ jar -cf fichero.jar fichero1.class fichero2.class fichero3.class
• La opción "c" indica que queremos crear un fichero.jar nuevo. Si ya
existía, se machacará, así que hay que tener cuidado. La opción "f"
sirve para indicar el nombre del fichero, que va inmediatamente
detrás. En nuestro caso, fichero.jar. Finalmente se pone una lista
de ficheros .class (o de cualquier otro tipo) que queramos meter en
nuestro jar. Se pueden usar comodines, estilo *.class para meter
todos los .class de ese directorio.
38
• Si las clases de nuestro porograma pertenecen a
paquetes, debemos meter en nuestro jar la estructura de
directorios equivalente a los paquetes entera.
• Para ello, nos vamos al directorio padre de donde
empiece nuestra estructura de paquetes. En el caso de
nuestro HolaMundo con paquete, debemo meter el
directorio prueba completo. El comando a ejecutar es
este.
• $ cd directorio_padre_de_prueba
$ jar -cf fichero.jar prueba
• Las opciones son las mismas, pero al final en vez de las
clases, hemos puesto el nombre del directorio. Esto
meterá dentro del jar el directorio y todo lo que hay
debajo.
39
• Otra opción sería meter los .class, pero
indicando el camino relativo para llegar e
ellos
• $ cd directorio_padre_de_prueba
$ jar -cf fichero.jar
prueba/HolaMundo.class
• En windows la barra va al revés...
40
VER QUÉ HAY DENTRO DE UN JAR
42
CÓMO EJECUTAR UN JAR
• Para ejecutar un jar, símplemente debemos poner el fichero jar en el
CLASSPATH.
• Ojo, hay que poner el fichero.jar, NO el directorio en el que está el fichero.jar.
• Este suele ser un error habitual al empezar, pensar que basta con poner el
directorio donde está el jar.
• Para los .class, basta poner el directorio, para los .jar hay que poner el
fichero.jar
• El path para indicar la ubicación del fichero puede ser absoluto o relativo al
directorio en el que ejecutemos el comando java. El comando para ejecutar una
clase dentro de un jar, en nuestro caso del HolaMundo con paquete,
suponiendo que estamos en el directorio en el que está el fichero.jar, sería este
• $ java -cp ./fichero.jar prueba.HolaMundo
Hola Mundo
• Simplemente, en la opción -cp del CLASSPATH hemos puesto el fichero.jar con
su PATH relativo.
• Detrás hemos puesto el nombre de la clase, completo, con su paquete deltante.
Nuevamente, en windows la barra de directorio va al revés.
43
EL FICHERO DE MANIFIESTO
• Ejecutar así tiene una pega. Además de acordarse de poner la opción -cp,
hay que saber el nombre de la clase que contiene el método main().
Además, si nuestro programa es muy grande, tendremos varios jar, tanto
nuestros como otros que nos bajemos de internet o de donde sea. La
opción -cp también puede ser pesadita de poner en ocasiones.
• Una opción rápida que a todos se nos ocurre es crearse un pequeño
fichero de script/comandos en el que se ponga esta orden. Puede ser un
fichero .bat de windows o un script de unix. Este fichero debe acompañar al
fichero.jar y suponiendo que estén en el mismo directorio, su contenido
puede ser este
• java -cp ./fichero.jar prueba.HolaMundo
• Para ejecutarlo, se ejecuta como un fichero normal de comandos/script. Si
el fichero se llama ejecuta.sh o ejecuta.bat, según sea unix o windows:
• $ ./ejecuta.sh
Hola Mundo
• C:\> ejecuta.bat
Hola Mundo
44
• Sin embargo, java nos ofrece otra posibilidad de forma que no tengamos
que hacer este fichero. Simplemente, en un fichero de texto metemos una
línea en la que se ponga cual es la clase principal. Este fichero se conoce
como fichero de manifiesto y su contenido puede ser este
• Main-Class: prueba.HolaMundo
• Cuando contruimos el jar, debemos incluir este fichero de una forma
especial. Por ejemplo, si el fichero lo llamamos manifiesto.txt y lo ponemos
en el directorio donde vamos a construir el jar, el comando para hacerlo
sería este
• $ jar cmf manifiesto.txt fichero.jar prueba/HolaMundo.class
• En windows, nuevamente, la barra al revés. Al comando de crear jar le
hemos añadido la opción "m" para indicar que vamos a añadir un fichero de
manifiesto. Hemos añadido además el fichero manifiesto.txt. El orden de las
opciones "mf" es importante. El fichero de manifiesto y el fichero.jar se
esperan en el mismo orden que pongamos las opciones. En el ejemplo,
como hemos puesto primero la ocpión "m", debemos poner manifiesto.txt
delante de fichero.jar. El resto de ficheros son los que queremos
empaquetar.
45
• Una vez construido, se ejecuta fácilmente. Basta con
poner
• $ java -jar fichero.jar
• La opción "-jar" indica que se va a ejecutar el fichero.jar
que se ponga a continuación haciendo caso de su
fichero de manifiesto. Como este fichero de manfiesto
dice que la clase principal es prueba.HolaMundo, será
esta la que se ejecute.
• De esta forma nos basta con entregar el jar y listo. El
comando para arrancarlo es sencillo.
• Es más, en windows, si lo configuramos para que los
ficheros jar se abran con java y la opción -jar, bastará
con hacer doble click sobre ellos para que se ejecuten.
46
Teclado en Java
• LOS InputStream: EL OBJETO System.in
• Al igual que Java nos ofrece System.out para escribir
en pantalla, tenemos System.in para leer de ella.
System.in es un objeto de una clase de java que se
llama InputStream.
• Para java, un InputStream es cualquier cosa de la que
se leen bytes. Puede ser el teclado, un fichero, un
socket, o cualquier otro dispositivo de entrada. Esto, por
un lado es una ventaja. Si todas esas cosas son
InputStream, podemos hacer código que lea de ellas
sin saber qué estamos leyendo.
47
• Por otro lado, es un problema. Como un
InputStream es para leer bytes, sólo tiene
métodos para leer bytes. Nosotros
queremos leer palabras o números del
teclado, no bytes. Si escribimos en el
teclado una A mayúscula y la leemos con
System.in, obtendremos un entero de
valor 65, que es el valor del byte
correspondiente a la A.
48
LOS Reader
• Para java, una clase Reader es una clase
que lee caracteres. Esto se parece más a
lo que queremos. Un Reader tiene
métodos para leer caracteres. Con esta
clase ya podriamos trabajar.
• La pena es que seguimos teniendo
System.in, que es un InputStream y no
un Reader.
49
¿Cómo convertimos el System.in
en Reader?
• Hay una clase en java, la
InputStreamReader, que nos hace esta
conversión.
• Para obtener un Reader, únicamente
tenemos que instanciar un
InputStreamReader pasándole en el
constructor un InputStream.
50
• El código es el siguiente
• InputStreamReader isr = new
InputStreamReader(System.in);
• Estamos declarando una variable "isr" de tipo
InputStreamReader. Creamos un objeto de
esta clase haciendo new
InputStreamReader(...).
• Entre paréntesis le pasamos el InputStream
que queremos convertir a Reader, en este caso,
el System.in
51
• Ya tenemos el Reader. ¿Cómo funciona exactamente?
• InputStreamReader es un Reader. Se comporta igual
que in Reader y se puede poner en cualquier sitio que
admita un Reader. Es decir, podemos leer de él
caracteres.
• Al constuirlo le hemos pasado un InputStream, en
concreto, System.in. InputStreamReader de alguna
forma se lo guarda dentro.
• Cuando a InputStreamReader le pedimos caracteres, él
le pide al InputStream que tiene guardado dentro los
bytes, los convierte a caracteres y nos los devuelve.
52
LA CLASE BufferedReader
53
• Se llama BufferedReader.
• El mecanismo para obtener un
BufferedReader a partir de otro Reader
cualquiera (por ejemplo el
InputStreamReader), es similar al que
usamos antes. Lo instanciamos pasándole
en el construtor el Reader.
54
• El código es
• BufferedReader br = new BufferedReader (isr);
• El funcionamiento de esta clase es igual que el
InputStreamReader. Cuando le pedimos una línea completa de
caracteres (un String), ella se lo pide al Reader que tenga dentro,
los convierte en String y nos lo devuelve.
• Para pedirle un String, se usa el método readLine(). Este método
lee todos los caracteres tecleados (recibidos si fuera otro dispositivo
de entrada) hasta que encuentra la pulsación de la tecla <INTRO>,
<RETURN> o como quieras llamarla.
• String texto = br.readLine();
• Esto lee del teclado un String completo y lo guarda en una variable
"texto".
55
CONVERTIR LA CADENA String
EN UN ENTERO int
• Si queremos leer un número del teclado, el
usuario escribe por ejemplo 123, con la clase
BufferedReader obtendremos un String que
contiene "123", es decir, tres caracteres. Eso no
se parece en nada a un número 123.
• Para convertir el String en un número entero
(sin decimales), podemos usar otra clase de
Java. La clase Integer vale para muchas cosas,
pero entre otras es capaz de convertir un String
a int. Siempre que sea posible. Por ejemplo
"abc" no se puede convertir a número de
ninguna manera.
56
• La clase Integer es muy estricta.
• Para convertir el String a int necesita que
el String sea exactamente un int.
Cualquier caracter o letra que tenga el
String y no valga, hará que la conversión
falle.
• Por ejemplo, "123a" da fallo por culpa de
la "a" del final. Del mismo modo "12 3" da
fallo por el espacio entre el "12" y el "3".
57
• La conversión se realiza así
• int valor = Integer.parseInt(texto);
• Esto intenta convertir texto en un int y si
no hay problemas, guarda el resultado en
una variable int llamada valor.
58
EXCEPCIONES Exception Y try-
catch
• Cuando en java puede fallar algo, por ejemplo, la conversión de la
cadena en int, suele avisarnos.
• Esto lo hace "lanzando excepciones".
• Una excepción es algo que lanza Java para avisarnos que ha
habido un problema.
• En nuestro código podemos "capturar" esas excepciones y hacer
algo para tratar de arreglaro. Por ejemplo, si le pedimos al usuario
que meta un número, el usuario escribe "abc", lo leemos e
intentamos convertirlo a int, nos salta una excepción. Si capturamos
esa excepción, en el código que hagamos para tratarla, podemos
avisar al usuario que se ha equivocado un poco al teclear, que lo
intente de nuevo y volver a pedirle el número.
59
• Para capturar una excepción, tenemos que
hacer el código así
• try
{
// Aquí el código que puede fallar
}
catch (Exception e)
{
System.out.println(e);
e.printStackTrace();
// Aquí el código para tratar el fallo
}
60
• Lo habitual, al menos mientras estamos haciendo
nuestro programa, es sacar por pantalla el error, para
tener una pista de qué ha fallado. Eso se puede
coneiguir de las dos formas:
• Por un lado, de la forma que ya conocemos, con
System.out.println(e); Esto nos saca una línea de texto
con el error correspondiente en inglés del bueno.
• Por otro lado, llamando al método printStackTrace() de
la excepción que se ha provocado. Esta llamada escribe
la misma línea de texto de error, pero además nos dice
exactamente en qué línea de código se produce el error.
Esta información es muy útil si nuestro programa todavía
está a medias y no acaba de hacer lo que queremos.
61
UN EJEMPLO: SUMAR DOS
NÚMEROS
• Como ejemplo, vamos a ver un programa
completo que pide dos números al
usuario, los suma y saca el resultado.
62
• import java.io.*;
public class suma
{
public static void main (String [] args)
{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader (isr);
try
{
System.out.print("Sumando 1 : ");
int s1 = Integer.parseInt(br.readLine());
System.out.print("Sumando 2 : ");
int s2 = Integer.parseInt(br.readLine());
int suma=s1+s2;
System.out.println ("La suma es " + s1 + "+" + s2 +"="+ suma);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
63
• Cuando vimos el tema de paquetes, vimos que
las clases se pueden agrupar en paquetes.
• Todas las clases que hemos visto aquí de java
relativas a Streams y Readers, están en el
paquete java.io.
• En la primera linea de código, con el import,
estamos avisando a java que vamos a usar
clases de ese paquete.
• Es necesario poner esta linea, decirle a java en
qué paquetes están las clases, porque en otros
paquetes puede haber clases con el mismo
nombre, para distinguir unas de otras.
64
• Luego lo compilas y lo puedes ejecutar
• $ javac suma.java
$ java suma
Sumando 1 : 2
Sumando 2 : 4
La suma es 2+4=6
65
• Si fallamos, tendremos esto
• $ javac suma.java
$ java suma
Sumando 1 : 2
Sumando 2 : asd
java.lang.NumberFormatException: For input string: "asd"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at suma.main(suma.java:14)
66