Curso de Java. Entrada y salida con ficheros: clase Scanner

Escrito por Adrián Crespo
Java
0

Continuamos en RedesZone.net con la entrada y salida de ficheros. Durante la anterior entrega de nuestro curso de Java, explicamos la entrada y salida relacionada con los ficheros de texto.

Por lo tanto, en el día de hoy, vamos a continuar con la entrada y salida de ficheros, en este caso, hablaremos de la clase Scanner, utilizada para leer números y texto de ficheros de texto. Después también hablaremos de la entrada y salida de texto con un formato predeterminado.

Vamos a empezar por lo tanto con la clase Scanner.

Clase Scanner

La clase Scanner (paquete java.util) permite leer números y texto de un fichero de texto y de otras fuentes

  • Permite la lectura del texto línea a línea (similar a BufferedReader)
  • Permite la lectura sencilla de números y palabras separadas por el separador especificado
  1. El separador por defecto es cualquier tipo de espacio en blanco (espacio, salto de línea, tabulador, etc.)
  2. Puede utilizarse otro separador utilizando el método useDelimiter
  • Permite reconocer patrones de texto conocidos como “expresiones regulares”

Scanner se comporta como un stream filtro de caracteres

  • Aunque técnicamente no lo es, ya que no extiende a Reader

-Principales Operaciones de Scanner

Excepciones que pueden lanzar los métodos de Scanner:

  • NoSuchElementException: no quedan más palabras
  • IllegalStateException: el scanner está cerrado
  • InputMismatchException: el dato leído no es del tipo esperado

Para ver la utilización de estos métodos que mejor forma de verlo que hacer un ejemplo:

Tenemos el siguiente fichero de texto:

azul 1.0 3.5 7.7

rojo 2

verde 10.0 11.1

Y queremos producir la siguiente salida:

Palabra:azul
Número:1.0
Número:3.5
Número:7.7
Palabra:rojo
Número:2.0
Palabra:verde
Número:10.0
Número:11.1


public static void main() {

final String nomFich="datos.txt";

Scanner in = null;

try {

// abre el fichero

in = new Scanner(new FileReader(nomFich));

// configura el formato de números

in.useLocale(Locale.ENGLISH);

// lee el fichero palabra a palabra

while (in.hasNext()) {

// lee primera palabra

String palabra = in.next();

System.out.println("Palabra:"+palabra);

// lee números
while (in.hasNextDouble()) {
 // lee un double
double d = in.nextDouble();
 System.out.println("Número:"+d);
 }
 } // while (in.hasNext())
 } catch (FileNotFoundException e) {
 System.out.println("Error abriendo el fichero "
 +nomFich);
 } finally {
 if (in!=null){
 in.close();
 }
 } // try
} // main

Ejemplo de utilización de Scanner para leer la entrada de teclado


...

Scanner lectura = new Scanner(System.in);
 int n = lectura.nextInt();
String palabra=lectura.next();
double d=lectura.nextDouble();
 System.out.println("entero: "+n+ " palabra: "+
 palabra+" real: "+d);

...

Hemos finalizado con todo lo relacionado a la clase Scanner, vamos a proseguir, en este caso, con la entrada y salida de texto, pero en este caso, eligiendo el formato que se le quiere dar.

La clase PrintWriter dispone de una operación de salida de texto con formato, llamada printf:

  • El objeto System.out que representa la pantalla también.
  • Está copiada del lenguaje C.
  • El primer parámetro es el string de formato.
  • Luego viene un número variable de parámetros.

Ejemplo

System.out.printf("%s de %3d años", nombre, edad);

Produce la salida (suponiendo nombre=”Pedro”, edad=18)

 Pedro de  18 años

*Strings de formato

Contiene caracteres que se muestran tal cual y especificaciones de formato que se sustituyen por los sucesivos parámetros

Especificaciones de formato más habituales:
%d enteros
%c caracteres
%s string
%f float y double, coma fija
%e float y double, notación exponencial
%g float y double, exponencial o coma fija
%n salto de línea en el formato del sist. operat.
%% el carácter %

Puede lanzarse IllegalFormatException si el formato no corresponde al parámetro

Después del carácter % se puede poner un carácter de opciones:

Alinear a la izquierda.
0 Rellenar con ceros (números sólo).
+ Poner signo siempre (números sólo).

Especificación de anchura y precisión

Puede añadirse después del “%” (y el carácter de opción si lo hay) la especificación de anchura mínima y/o número de decimales.
A continuación, una serie de ejemplos con el número PI.

Hemos llegado al final de la entrega del día de hoy. Espero que la explicación de la clase Scanner os haya servido de provecho para poder utilizarla y llevarlo a la práctica. En la próxima entrega os hablaremos sobre el uso de ficheros como tablas para recoger datos y el uso del acceso aleatorio.


Noticias relacionadas