Mostrando entradas con la etiqueta Scanner. Mostrar todas las entradas
Mostrando entradas con la etiqueta Scanner. Mostrar todas las entradas

18 dic 2017

Las tildes y la ñ en la entrada y salida de datos en Java con NetBeans


Uno de los problemas iniciales con los que nos encontramos al leer cadenas de texto en Java, con, por ejemplo Scanner, es la utilización de tildes, ya que dependiendo de la configuración de las instrucciones de entrada, de los proyectos e incluso del propio Netbeans, los resultados pueden ser muy distintos.
Si leemos una cadena de texto que contenga tildes y la ñ, en un proyecto por defecto creado en Java con Netbeans en Windows, de esta forma:
import java.util.Scanner;
public class Tildes {
    public static void main(String[] args) {
      Scanner sc= new Scanner(System.in);
      String cadena;
      System.out.print("Entrada: ");
      cadena= sc.nextLine();
      System.out.printf("Salida: %s%n", cadena);
    }
}


Obtenemos este resultado:

Esto es debido a que la codificación que utiliza Netbeans por defecto para los proyectos, es UTF-8, mientras que la que utiliza Windows en español es, ISO-8859-1 (o el superconjunto Windows-1252), como podemos ver en las propiedades del proyecto:


Una posible solución es cambiar en el desplegable Encoding: y poner el valor Windows-1252, o bien ISO-8859-1:

Pero esto puede suponer un problema, si estamos leyendo o escribiendo ficheros de texto, porque nos los escribirá por defecto con la nueva codificación, como bien nos indica:
 

Una solución alternativa, es dejar el proyecto con la codificación UTF-8, por si leemos o escribimos ficheros de texto con esta codificación, y especificar la codificación en la entrada de datos de Scanner, de esta forma:


Scanner sc= new Scanner (System.in, "ISO-8859-1");


Con las dos soluciones obtendremos el resultado deseado:

Una solución más drástica sería cambiar la codificación por defecto (charset) para todos los proyectos Netbeans, esto lo haríamos en el fichero de configuración netbeans.conf, situado en el directorio raíz de nuestra instalación de Netbeans ( habitualmente c:\program files\Netbeans-xxx\). La línea:
netbeans_default_options="-J-Dfile.encoding=UTF-8 -J-client -J-Xss2m ........."

8 oct 2014

La clase Scanner en Java

Permite realizar la entrada de datos desde dispositivos como la entrada estándar o los ficheros, proporcionando métodos para la lectura de cadenas y de los tipos básicos.

Ejs.:    Scanner scan1= new Scanner(System.in);
          Scanner scan2= new Scanner(File fich);

Va recogiendo fragmentos (tokens) de la entrada, siendo el separador por defecto el espacio en blanco. Mediante sus métodos se pueden analizar, recuperar y convertir los tokens que se van procesando.

Sus principales métodos son:
o   next() 
devuelve el siguiente elemento en la entrada.
o   hasNext() 
devuelve un valor boolean indicando si existe el siguiente elemento en la entrada.
o   hasNextByte(), hasNextInt(), hasNextFloat, …
devuelven un valor boolean indicando si el tipo del siguiente token coincide con el método, pero sin avanzar ningún token. Por ejemplo hasNextByte() devolvería el valor true si el siguiente token que se recuperaría con nextByte(), fuera un byte.
o   nextByte(), nextInt, nextFloat, …
devuelve el siguiente token como un valor del tipo indicado por el método. Por ejemplo nextByte() devolverá un byte.
o   useDelimiter(String delim)
cambia el delimitador de tokens por defecto, con el nuevo valor.


Ejemplo de uso de Scanner desde la entrada estándar

package esscanner;
import java.util.Scanner;
public class ESScanner {
    public static void main(String[] args) {
       boolean var_boolean;
       char var_char;
       int var_int;
       float var_float;
       String cadena;
       Scanner scan = new Scanner(System.in);
       System.out.printf(Escriba un boolean : ");
       var_boolean = scan.nextBoolean();
       scan.nextLine();
       System.out.printf(Escriba un char    : ");
       cadena = scan.nextLine();
       var_char = cadena.charAt(0);
       System.out.printf(Escriba un int: ");
       var_int = scan.nextInt();
       System.out.printf(Escriba un float: ");
       var_float = scan.nextFloat();
       scan.nextLine();
       System.out.printf(Escriba una frase: ");
       cadena = scan.nextLine();
       System.out.printf("var_boolean = %b%n", var_boolean);
       System.out.printf("var_char  = %c%n", var_char);
       System.out.printf("var_int     = %d%n", var_int);
       System.out.printf("var_float  = %14.9f%n", var_float);
       System.out.printf(Frase: %s%n", cadena);
    }
}


Ejemplo de uso de Scanner utilizando ficheros

package es_fich_scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
/*
 * Lee un fichero de texto línea a línea
 * mostrándolo por pantalla
 * Lee un fichero de enteros delimitado por # y lo muestra
 */

public class ES_fich_Scanner {
    public static void main(String[] args) throws FileNotFoundException {
        File f = new File("fich_lineas.txt");
        Scanner scan = new Scanner(f);
        while (scan.hasNextLine()) {
            System.out.println(scan.nextLine());
        }
        File f2 = new File("fich_num.txt");
        scan = new Scanner(f2);
        scan.useDelimiter("#");
        while (scan.hasNextInt()) {
            System.out.println(scan.nextInt());
        }
    }
}


7 oct 2014

Entrada y Salida básica en Java

La E/S básica en Java se realiza mediante la clase System, a través de sus atributos estáticos err, out e in.

SALIDA
La salida se efectúa a través de System.err o System.out. Estos dos atributos de System son de tipo PrintStream y permiten utilizar, entre otros, los métodos:
o   print(), escribe el argumento. Está sobrecargado para los tipos primitivos.
§  System.out.print(Hola, mundo);
§  System.out.print(2050);
o   println(), escribe el argumento y salta de línea.
o   printf(), salida con formato de características análogas a las de C, con mejoras.
§  System.out.printf(Saludo: %s %d %n, Hola, mundo, 2050);

ENTRADA
La entrada puede efectuarse a través de System.in, de tipo Inputstream, de varias formas:
o   Mediante el método read(). Bastante limitado porque sólo permite leer bytes (valores numéricos entre 0 y 255) que devuelve como un entero.
o   a partir de un ejemplar de Console proporcionado por System. Sólo permite leer líneas completas, de tipo String, que después deben ser interpretadas si lo que se quiere obtener corresponde a otros tipos, por ejemplo numéricos.
o   a través de un ejemplar de Scanner, que se construye a partir de System.in,  en este caso permite acceder directamente a traductores de todos los tipos básicos, incluyendo líneas completas (String).


Ejemplo con read()

package entradaRead;

import java.io.IOException;

public class EntradaRead {

    public static void main(String[] args) throws IOException {
        char carac;
        System.out.print("Introduce una frase: ");
        while ((carac=(char) System.in.read()) != '\n')
            System.out.print(carac);
    }
   
}


Ejemplo con Console

package entradasalidaconsole;
import java.io.Console;

public class EntradaSalidaConsole {

    public static void main(String[] args) {
       String cadena = "una frase";
       Console con = System.console();
        if (null != con) {
            con.printf("%s%n", "Escribo desde Console");
            cadena= con.readLine("Escriba %s: ", cadena);
            con.printf("La cadena introducida es:%s%n", cadena);
            con.printf("Escribe otra frase: ");
            cadena= con.readLine();
            con.printf("La cadena introducida es:%s%n", cadena);
        } else {
            System.err.println("Perdón, no se puede usar la consola.");
        }
    }
}


Ejemplo con Scanner

package entradasalidascanner;
import java.util.Scanner;

public class Entradasalidascanner {

public static void main(String[] args) {
       String cadena = "una frase";
       Scanner sc = new Scanner(System.in);
       System.out.printf("Escriba %s: ", cadena);
       cadena= sc.nextLine();
       System.out.printf("La cadena introducida es:%s%n", cadena);
       System.out.print("Escribe otra frase: ");
       cadena= sc.nextLine();
       System.out.printf("La cadena introducida es:%s%n", cadena);
    }
    

}