Escuela Politécnica Superior de Elche Ingeniería Industrial SISTEMAS INFORMÁTICOS INDUSTRIALES curso 2006-2007 PROGRAMACIÓN EN JAVA PRÁCTICA 1: Entrada y salida de datos en Java Objetivos • • Familiarizarse con el entorno de desarrollo JDK de Sun para crear aplicaciones en Java Conocer las clases de Java relacionadas con la entrada y salida de datos Descripción Realizar una aplicación en Java que: 1) Lea una cadena de caracteres por teclado. 2) Obtenga las palabras (tokens) que forman parte de la cadena. 3) Muestre por pantalla y guarde en un fichero los tokens ordenados alfabéticamente. Ejemplo: Ejecución del programa Introduzca la cadena: esto es una cadena de prueba que debe ordenarse Tokens ordenados: cadena de debe es esto ordenarse prueba que una Fichero generado cadena de debe es esto ordenarse prueba que una Desarrollo 1) Se debe crear un fichero Java denominado Practica1.java. En dicho fichero se implementará la clase Practica1 que contendrá el main(). 2) Para leer una cadena de caracteres desde teclado en Java se puede proceder del siguiente modo: Página 1 de 4 Escuela Politécnica Superior de Elche Ingeniería Industrial InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String cadena = br.readLine(); En Java la manera de representar las entradas y las salidas es a base de streams (flujos de datos). Un stream es una conexión entre el programa y la fuente o destino de los datos. La información se traslada en serie a través de esta conexión. Todas las clases de Java relacionadas con la entrada y salida se agrupan en el package java.io. Hay 4 jerarquía de clases relacionadas con la entrada y salida de datos: - Las clases derivadas de InputStream (para lectura) y de OutputStream (para escritura). Estas clases manejan streams de bytes. Las clases derivadas de Reader y Writer, que manejan caracteres en vez de bytes. InputStreamReader es una clase derivada de Reader que convierte los streams de bytes a streams de caracteres, es decir, lee bytes y los convierte en caracteres. System.in es el objeto de la clase InputStream para recibir datos desde la entrada estándar del sistema (el teclado). De esta forma, el objeto isr es un stream que convierte los bytes leídos desde teclado en caracteres. La clase BufferedReader deriva de la clase Reader. Esta clase añade un buffer para realizar una lectura eficiente de caracteres. Dispone del método readLine que permite leer una línea de texto y devolverla como String. 3) Una vez que se ha leído la cadena de caracteres el siguiente paso es separarla en las palabras que la forman (tokens). Para ello se puede utilizar la clase StringTokenizer perteneciente al package java.util. Por ejemplo, para mostrar todos los tokens de un String denominado cadena se procedería del siguiente modo: StringTokenizer st = new StringTokenizer(cadena); while(st.hasMoreTokens()){ System.out.println(st.nextToken()); } El método int countTokens() devuelve el número de tokens que se pueden extraer de la frase. 4) Los tokens de la cadena de caracteres leída, deben ser almacenados en un vector de Strings. Dicho vector deberá ser ordenado alfabéticamente, para ello puede utilizarse al algoritmo de ordenación de intercambio directo (algoritmo de la burbuja). A continuación se muestra dicho algoritmo en pseudocódigo para el caso de que se quiera ordenar un vector de números reales: Página 2 de 4 Escuela Politécnica Superior de Elche Ingeniería Industrial ALGORITMO burbuja variables enteras i,j,N vector de reales v para i=1 hasta N-1 para j=N-1 hasta i si (v[j-1] > v[j]) intercambiar v[j-1] y v[j] fsi fpara fpara FIN ALGORITMO Para ordenar alfabéticamente Strings debe utilizarse el método int compareTo(String). P.ej. cad1.compareTo(cad2) devuelve un entero positivo si cad1 > cad2, un entero negativo si cad1 < cad2, y 0 si son iguales. 5) Por último deben mostrarse los tokens ordenados en pantalla y guardarlos en un fichero denominado archivo.txt. Para escribir una cadena de texto en un fichero se puede proceder del siguiente modo: FileWriter fw = new FileWriter(“archivo.txt”); BufferedWriter bw = new BufferedWriter(fw); PrintWriter salida = new PrintWriter(bw); salida.println(“texto que se guardara en el fichero”); salida.close(); La clase FileWriter deriva de Writer y permite escribir caracteres en un fichero. La clase BufferedWriter también deriva de la clase Writer. Esta clase añade un buffer para realizar una escritura eficiente de caracteres. La clase PrintWriter, que también deriva de Writer, permite escribir de forma sencilla en un archivo de texto, ya que posee los métodos print y println, idénticos a los de System.out. El método close() cierra el stream. Observaciones • • En operaciones de entrada y salida de datos debe capturarse la excepción IOException. Se recomienda estructurar la aplicación en métodos. Página 3 de 4 Escuela Politécnica Superior de Elche Ingeniería Industrial Jerarquía de clases para lectura y escritura de datos PrintWriter Página 4 de 4