Download Programación en Java
Document related concepts
no text concepts found
Transcript
Curso Programación en Java Tema 3 Entrada y Salida básica en Java -Paquetes- Ignacio Zahonero Martínez Luis Joyanes Aguilar ENTRADA DESDE DISPOSITIVO ESTÁNDAR(I) En Java la entrada y salida se lee y escribe en flujos (streams). La fuente básica de entrada de datos es el teclado y de salida de datos es la pantalla. La clase System define dos referencias a objetos static para la gestión de la entrada y de la salida por consola: System.in para entrada por teclado. System.out para salida por pantalla. System.in está asociado, normalmente, con el teclado. Es un flujo de tipo InputStream. Los elementos básicos del flujo de entrada System.in son bytes individuales. Con el método read() (int read() throws IOException) se lee un byte: char c; c = (char)System.in.read(); Ignacio Zahonero Martínez Luis Joyanes Aguilar 2 ENTRADA DESDE DISPOSITIVO ESTÁNDAR(II) No resulta práctico el captar la entrada byte a byte, es preferible hacerlo línea a línea. Para ello se utiliza, primero un flujo de tipo InputStreamReader cuya misión es convertir el blujo básico de bytes (System.in) a flujo de caracteres. InputStreamReader en = new InputStreamReader(System.in); este objeto que se crea se utiliza a su vez como argumento para inicializar otro objeto de la clase BufferedReader, que ya permite captar líneas de caracteres del teclado con el método readLine(): String cd; BufferedReader entrada = new BufferedReader(en); System.out.print(“Introduzca una línea por teclado: “); cd = entrada.readLine(); System.out.println(“Línea de entrada: “ + cd); El método readLine() devuelve un objeto cadena (tipo String) con la línea leída. Ignacio Zahonero Martínez Luis Joyanes Aguilar 3 ENTRADA DESDE DISPOSITIVO ESTÁNDAR(III) El objeto de la clase BufferedReader se puede crear de una sola tacada, de una sola sentencia, es la forma habitual en que aparece en los programas : BufferedReader entrada = new BufferedReader( new InputStreamReader(System.in)); Es necesario tener en cuenta que la especificación de readLine() indica que levanta una excepción de tipo IOException que es necesario procesar o propagar. try { entrada.readLine(); } catch (IOException e) { ...;} Ignacio Zahonero Martínez Luis Joyanes Aguilar 4 ENTRADA DE UN NUMERO ENTERO El método parseInt () de la clase Integer,se utiliza con mucha frecuencia para entrada de datos enteros desde el teclado. Primero se crea un objeto asociado con el teclado, se lee a continuación una línea con el número entero tecleado y con parseInt() se convierte a dato int. BufferedReader entrada = new BufferedReader( new InputStreamReader(System.in)); String cd; int dato; System.out.print("Introduzca un dato entero: "); cd = entrada.readLine(); dato = Integer.parseInt(cd); Se puede simplificar concatenando llamadas : dato = Integer.parseInt(entrada.readLine()); Ignacio Zahonero Martínez Luis Joyanes Aguilar 5 ENTRADA DE UN NUMERO REAL Los pasos a seguir para entrada de un dato de tipo double: 1. Crear el objeto para entrada asociado con el dispositivo estándar de entrada, el teclado. Este objeto se utiliza para cualquier entrada. BufferedReader entrada = new BufferedReader( new InputStreamReader(System.in)); 2. Leer línea y transformar a double con el método Double.parseDouble(cadena) double d = Double.parseDouble(entrada.readLine()) Alternativamente: 2. Crear un objeto Double con el método de la clase valueOf(). Double d; String cd; cd = entrada.readLine(); d = Double.valueOf(cd); se puede concatenar llamadas: d = Double.valueOf(entrada.readLine()); 3. Obtener el dato double del objeto con el método doubleValue(). double x = d.doubleValue(); Ignacio Zahonero Martínez Luis Joyanes Aguilar 6 EJEMPLO DE ENTRADA Dada la base y altura de un triángulo calcular su área : import java.io.*; public class Area { public static void main(String ar[]) throws Exception { double base, altura; String cd; BufferedReader entrada = new BufferedReader( new InputStreamReader(System.in)); System.out.println("Base del Triángulo: "); cd = entrada.readLine(); base = Double.parseDouble(cd); System.out.println("Altura del Triángulo: "); altura = Double. parseDouble(entrada.readLine()); System.out.println("El area = " + base*altura/2); } } Ignacio Zahonero Martínez Luis Joyanes Aguilar 7 OTRA VERSION DEL EJEMPLO Dada la base y altura de un triángulo calcular su área : import java.io.*; public class Area { public static void main(String ar[]) throws Exception { double base, altura; Double d; String cd; BufferedReader entrada = new BufferedReader( new InputStreamReader(System.in)); System.out.println("Base del Triángulo: "); cd = entrada.readLine(); d = Double.valueOf(cd); base = d.doubleValue(); System.out.println("Altura del Triángulo: "); d = Double.valueOf(entrada.readLine()); altura = d.doubleValue(); System.out.println("El area = " + base*altura/2); } } Ignacio Zahonero Martínez Luis Joyanes Aguilar 8 SALIDA POR PANTALLA El objeto out definido en la clase System está asociado con el flujo de salida, que dirige los datos a consola o pantalla. out es un objeto de la clase PrintStream. Los métodos más utilizados son: print() transfiere una cadena de caracteres al buffer de la pantalla. println() transfiere una cadena de caracteres y el carácter de fin de línea al buffer dela pantalla. Argumento de print() o println() puede ser constantes o variables de los tipos básicos, int, double, char ... y de tipo String (cadena). se pueden concatenar cadenas con caracteres, enteros ... . Para ello se utiliza el operador + que internamente realiza la conversión, por ejemplo: double r = 2.0; double area = Math.PI*r*r; System.out.println("Radio = " + r + ',' + "area: " + area); Ignacio Zahonero Martínez Luis Joyanes Aguilar 9 ENTRADA UTILIZANDO CLASE SCANNER Java 5 dispone de la clase Scanner (paquete java.util) para analizar un flujo de caracteres y obtener los elementos, de cualquier tipo primitivo, de que consta. La clase puede analizar cualquier flujo, y en particular el flujo de bytes básico asociado al teclado representado por System.in. El flujo a analizar por Scanner se asocia a través del constructor. Scanner dc = new Scanner(System.in); El scanner dc esta´ asociado a la entrada básica, el teclado. El scanner divide la entrada en tockens (elementos) separados por un delimitador, por defecto un espacio. Los métodos más interesantes son: Tipo nextTipo(); obtiene el siguiente valor de tipo primitivo Tipo. boolean hasNextTipo(); true si el siguiente elemento es de tipo primitivo Tipo Ignacio Zahonero Martínez Luis Joyanes Aguilar 10 METODOS DE SCANNER int nextInt(); devuelve el valor entero del sgte elemento. short nextShort(); devuelve el valor entero corto del sgte elemento. long nextLong(); devuelve el valor entero largo del sgte elemento. double nextDouble(); devuelve el valor double del sgte elemento. ... para cada tipo de dato primitivo String next(); devuelve una cadena con el sgte elemento. String nextLine(); devuelve los caracteres hasta fin de línea y se sitúa en la siguiente. Los métodos nextTipo levantan la excepción InputMismatchException si no pueden obtener un siguiente elemento del tipo requerido. A tener en cuenta: en la entrada de un número real, la parte entera se separa de una coma (,) de la parte decimal,p. e. : 3,50 boolean hasNext(); true si quedan elementos en la línea. boolean hasNextInt(); true si siguiente elemento es un entero. ... para cada tipo de dato primitivo Ignacio Zahonero Martínez Luis Joyanes Aguilar 11 EJEMPLO import java.util.Scanner; //import static java.lang.System.*; import java.util.Date; public class EjemploScanner { public static void main(String [] a) { Scanner sc = new Scanner(System.in); System.out.println("Nombre: "); String nm = sc.nextLine(); System.out.println("edad y peso: "); int edad = sc.nextInt(); double peso = sc.nextDouble(); System.out.println(nm + ", tu edad es: " + edad + ", pesas: " + peso + " en el día de " + new Date()); } } Ignacio Zahonero Martínez Luis Joyanes Aguilar 12 PAQUETES Ignacio Zahonero Martínez Luis Joyanes Aguilar 13 AGRUPACIÓN DE CLASES EN JAVA Los paquetes es la forma que tiene Java de organizar las clases relacionadas. En un paquete se agrupan clases e interfaces. Los paquetes están compuestos por clases, interfaces, subpaquetes relacionados y pueden contener archivos de recursos . La utilización de paquetes permite: • Crear agrupaciones de clases e interfaces relacionadas formando bibliotecas de clases. • Crear espacios de nombres que sirven para evitar conflictos de nombres entre los tipos. Los miembros de diferentes paquete pueden utilizar el mismo nombre. • Proporcionan un marco de protección para desarrollar aplicaciones, de forma que los miembros de un paquete pueden utilizar componentes de otras clases del paquete pero que no es accesible desde el exterior. Es el ámbito del paquete la visibilidad por omisión (visibilidad friendly). Los paquetes se estructuran de manera jerárquica. Se permite un paquete (subpaquete) dentro de otro paquete. Ignacio Zahonero Martínez Luis Joyanes Aguilar 14 ESTRUCTURA DE UN PAQUETE Los paquetes han de asociarse a la estructura rígida de directorios. Dentro de un paquete puede haber subpaquetes; así, el paquete java está compuesto de los subpquetes util, io, awt, .... mipaquete clase1 interface1 subpaquete1 clase21 clase22 Ignacio Zahonero Martínez Luis Joyanes Aguilar subpaquete2 clase23 interface24 15 CREACIÓN DE UN PAQUETE: sentencia package Los ficheros de un paquete deben situarse en un subdirectorio que coincida con el nombre completo del paquete. La barra, que representa directorio, se sustituye por el punto (.) en el lenguaje Java. es.upsam.alumnos.Master.class -> directorio es/upsam/alumnos/Master.class Para crear un paquete: 1. Crear la estructura de directorios, desde el directorio base, correspondiente a la jerarquía de paquetes. 2. Para incorporar una clase al paquete, incluir la sentencia package como primera sentencia (primera línea del archivo fuente) en el archivo que contiene a la clase. Por ejemplo la clase Jabalina en el paquete atletismo: // archivo fuente Jabalina.java package atletismo; public class Jabalina { ... } Ignacio Zahonero Martínez Luis Joyanes Aguilar 16 PAQUETE escritorio Si las clases Lapiz, Bolígrafo y Folio se van a organizar formando el paquete escritorio, el esquema a seguir es el siguiente: // archivo fuente Lapiz.java package escritorio; public class Lapiz { ... } // archivo fuente Boligrafo.java package escritorio; public class Boligrafo { ... } // archivo fuente Folio.java package escritorio; public class Folio { ... } En el directorio escritorio se ubicarán los archivos Lapiz.java, Boligrafo.java y Folio.java . Y también los archivos que que resultan de la compilación: Lapiz.class, Boligrafo.class y Folio.class Ignacio Zahonero Martínez Luis Joyanes Aguilar 17 PAQUETES Si las clases no se definen como pertenecientes a un package, se utiliza un package por defecto, que es el directorio actual. Formato package NombrePaquete; Los nombres de los paquetes deben evitar conflictos con otros nombres de paquetes . Para ubicar el paquete en el sistema de archivos local, Java utiliza la variable CLASSPATH a partir de la cual obtiene el directorio base del paquete. CLASSPATH en el sistema operativo contiene uno o más directorios utilizados como raíz en la búsqueda del archivo. Una vez ubicado el directorio raíz toma el nombre del paquete y reemplaza cada punto por la barra de directorio (invertida o no dependiendo del sistema operativo), de forma que el paquete mipaquete.parte1.parte2 se convierte en el directorio mipaquete/parte1/parte2 que cuelga del directorio determinado por CLASSPATH . Por ejemplo, si las clases del paquete escritorio cuelgan del directorio c:\java\clases\escritorio. La variable de entorno deberá especificar: CLASSPATH=.;c:\java\clases Ignacio Zahonero Martínez Luis Joyanes Aguilar 18 UTILIZAR PAQUETES: import Las clases que se encuentran en los paquetes se identifican utilizando el nombre del paquete, el selector punto (.) y a continuación el nombre de la clase. Por ejemplo, la declaración de la clase Arte con atributos de la clase PrintStream (paquete java.io) y Lapiz (paquete escritorio): public class Arte { private java.io.PrintStream salida; private escritorio.Lapiz p; La sentencia import facilita la selección de una clase, permite escribir únicamente su nombre, evitando el nombre del paquete. La declaración anterior se puede abreviar: import java.io.PrintStream; import escritorio.*; public class Arte { private PrintStream salida; private Lapiz p; Ignacio Zahonero Martínez Luis Joyanes Aguilar 19 import La sentencia import debe aparecer antes de la declaración de las clases, a continuación de la sentencia package. Tiene dos formatos: 1. 2. import identificadorpaquete.nombreClase; import identificadorpaquete.*; El primer formato especifica una clase concreta. El segundo formato es para poder acceder a todos los elementos de un paquete sin necesidad de calificar con el nombre del paquete . Se denomina importación a demanda. Con frecuencia se utiliza el formato .*. Tiene la ventaja de poder simplificar cualquier clase del paquete, se pueden señalar los siguientes problemas: • Se desconoce qué clases concretas del paquete se están utilizando. • Puede haber colisiones entre nombres de clases declaradas en el archivo y nombres de clases del paquete. • Mayor tiempo de compilación debido a que el compilador busca la existencia de cualquier clase en el paquete. Nota: Aunque aparezca la sentencia import paquete.*, el compilador genera bytecode sólo para las clases utilizadas. Ignacio Zahonero Martínez Luis Joyanes Aguilar 20 import (II) Al importar un paquete no se importan los subpaquetes. Estos deben ser importados explícitamente. La sentencia: import java.util.*; importa todas las clases de ese paquete, pero no las de paquetes cuyo nombre esté relacionado jerárquicamente. Así el subpaquete prefs no se importa. Los subpaquetes deben ser importados explícitamente. Por ejemplo, el subpaquete prefs del paquete java.util util, y el subpaquete event de java.awt: import java.util.*; import java.awt.event.*; El paquete java.lang siempre se importa por defecto. Java 5 incorpora la importación estática de una clase. Permite acceder a los elementos static de una clase sin necesidad de calificar el elemento con el nombre de la clase. Por ejempo para la clase System y la clase Math: import static java.lang.System.*; import static java.lang.Math.*; out.println("seno(90) = " + sin(PI/2.)); equivale a System.out.println( Ignacio Zahonero Martínez Luis Joyanes Aguilar Math.sin(Math.PI ... 21 PAQUETES ESTÁNDAR La biblioteca de Java incorpora más de 35 paquetes. Algunos se muestran a continuación: java.lang Constituye el núcleo del lenguaje. El compilador importa automáticamente este paquete (es el único que lo hace). Entre otras cosas contiene las clases: • Object. La superclase. • Tipos de datos envueltos (Integer, Double,...). • String y StringBuffer y StringBuilder. • System y Runtime, que permiten utilizar los recursos del sistema. System proporciona la interface de programación independiente del sistema para los recursos del sistema y Runtime da acceso al entorno de ejecución específico de un sistema. • Thread, para la programación con hilos. • Class, proporciona una descripción de la clase en tiempo de ejecución. • Math, de rutinas matemáticas. • Exception, Error y Throwable para el manejo de excepciones. • Process, representa el proceso del sistema que se crea en tiempo de ejecuación. Ignacio Zahonero Martínez Luis Joyanes Aguilar 22 PAQUETES ESTÁNDAR java.io Proporciona canales de entrada y salida que permiten la escritura y lectura de archivos de datos y otras fuentes de entrada y salida. java.util Utilidades genéricas, de manejo de cadenas, GregorianCalendar, Date, StringTokenizar, ... ). fechas, calendarios (Vector, ArrayList, java.net Implementa clases e interfaces para el trabajo en red como conexiones HTTP, .... java.applet Contiene la clase Applet para la construcción de applets. java. awt Incluye este paquete elementos GUI (ventanas, botones, etc.), subpaquete event para procesar eventos, java.awt.image para manejar figuras, colores, cortar y pegar, etc. Ignacio Zahonero Martínez Luis Joyanes Aguilar 23