Artículos de Tecnología > Programación

Recibiendo datos en Java

Alex Felipe
Alex Felipe
recebendo-dados-em-java 1652885717

Recibí una lista de estudiantes en un archivo CSV y necesito registrarlos en mi sistema:

 Alex Felipe;21 
 Cleber Nascimento;16 
 Felipe de Souza;25 
 João da Silva;18 
 Juliana Guimarães;18 
 Maria Cristina;23 
 Pâmela Aguiar;17
public class Alumno {

    private final String nombre; 
    private final int edad;

    public Alumno(String nombre, int edad) {
        this.nombre = nombre; 
        this.edad = edad; 
    }
}

Necesito ingresar la información de los alumnos en mi sistema. Usaré la clase Scanner del paquete java.util para recibir los datos del teclado:

Scanner sc = new Scanner(System.in);

System.out.println("Digite el nombre del alumno:"); 
String nombre = sc.nextLine(); 
System.out.println("Informe la edad del alumno:"); 
int edad = sc.nextInt();

System.out.println("alumno: " + nombre + "\\nedad: " + edad);

Obteniendo el primer resultado:

 Digite el nombre del alumno: Alex Felipe 
 Informe la fecha de nacimiento del alumno: 21 
 alumno: Alex Felipe 
 edad: 21

El método nextLine() permite la lectura de String y el método nextInt() permite la lectura de int. Envío de datos al alumno:

Alumno alumno = new Alumno(nombre, edad);

System.out.println(alumno);

Verificando la impresión:

nombre: Alex Felipe edad: 21

¡Genial, logré registrar a un estudiante! Ahora vamos a registrar al resto de los estudiantes:

Digite el nombre del alumno: Cleber Nascimento Informe la edad del alumno: 16 nombre: Cleber Nascimento edad: 16 Digite el nombre del alumno: Felipe de Souza Informe la edad del alumno: 25 nombre: Felipe de Souza edad: 25 Digite el nombre del alumno: João da Silva Informe la edad del alumno: 18 nombre: João da Silva edad: 18

...

¡Espera un segundo! ¡Esto ya está cansando! ¿Tendré que registrar a todos estos alumnos a mano? ¡Si con apenas 7 alumnos da mucho trabajo imagina con 30 más! ¡Acabará con la paciencia de todos!

¡Además de permitir la lectura de datos a través del teclado, la clase Scanner permite la lectura de archivos! Simplemente informe al constructor que, en lugar de leer desde el teclado (System.in), queremos leer un archivo específico instanciando la clase File del paquete java.io:

Scanner sc = new Scanner(new File("usuarios.csv"));

¡Listo! Ahora necesitaremos leer línea por línea iterando con un while a través del método hasNext() que informa si aún hay líneas para leer:

while (sc.hasNext()) { 
    //El while solo se detiene cuando no hay más líneas para leer. 
}

Para obtener el siguiente elemento del archivo, usamos el método next():

while (sc.hasNext()) {

    String elemento = sc.next(); 
    System.out.println(elemento);

}

Si probamos nuestro código:

 Alex Felipe;21 
 Cleber Nascimento;16 
 Felipe de Souza;25 ...

¡Ups! Así no podré separar los datos del alumno... Además de leer el archivo, el Scanner tiene el método useDelimiter() que delimita la lectura del elemento, es decir, determina hasta dónde necesita llegar el elemento, por ejemplo, quiero que tome el elemento hasta que aparezca un ";":

Scanner sc = new Scanner(new File("archivo.csv"))
    .useDelimiter(";");

Ejecutando el código una vez más:

 Alex Felipe 21 
 Cleber Nascimento 16 
 Felipe de Souza 25

...

¡Excelente! Separé la información, ahora instanciaré a mis alumnos:

String nombre = sc.next(); 
int edad = Integer.parseInt(sc.next());

Alumno alumno = new Alumno(nombre, edad); 
System.out.println(alumno);

Probando nuestro código:

 Exception in thread "main" 
 java.lang.NumberFormatException: For input string: "21 Cleber Nascimento"

Qué raro... ¿Problema de conversión? ¿Qué String es esta? Parecía que la información de nombre y edad estaba separada correctamente... Lo que sucedió en este caso es que nuestro delimitador está separando la información hasta el momento en que encuentra un ";" entre la edad y el siguiente nombre del estudiante no hay ";" tiene solo un salto de línea, es decir, debemos informarle al Scannerque al mismo tiempo lo delimitamos por el ";" también lo queremos delimitado por un salto de línea:

Scanner sc = new Scanner(new File("archivo.csv")).useDelimiter(";|\\\\n");

El pipe (|) indica que queremos que esté delimitado por ";" o "\n" que significa salto de línea. Probando de nuevo:

 Exception in thread "main" 
 java.lang.NumberFormatException: For input string: "21 "

¿Otra excepción? Como podemos ver, ya separó la edad del nombre del otro estudiante, pero aún dejó un salto de línea y por lo tanto no fue posible convertir a int. En este caso, podemos utilizar el método trim() de la propia clase String, que ajusta el contenido contenido en el String, eliminando saltos de línea o espacios en blanco:

String nombre = sc.next(); 
int edad = Integer.parseInt(sc.next().trim());

Alumno alumno = new Alumno(nombre, edad);

System.out.println(alumno);

Dando el resultado:

 nombre: Alex Felipe edad: 21 
 nombre: Cleber Nascimento edad: 
 16 nombre: Felipe de Souza edad: 25

...

¡Estupendo! ¡Ahora mi sistema puede leer el archivo CSV y registrar a los estudiantes por mí!

Vimos que para recibir datos de medios externos en Java podemos usar la clase Scanner que tiene la capacidad de recibir datos a través del teclado o archivos, pero no siempre cuando leemos información de un archivo se espera el resultado, por lo que siempre debemos verificar la siguiente información:

¿Te gustó la clase de Scanner? ¿Quieres conocer otras alternativas a la clase Scanner y otras bibliotecas del lenguaje Java? Conoce la Formación en Java.

8989346

Alex Felipe Victor Vieira

Alex es instructor y desarrollador y tiene experiencia en Java, Kotlin, Android. Creador de más de 40 cursos como Kotlin, Flutter, Android, persistencia de datos, comunicación de API web, personalización de pantalla, pruebas automatizadas, arquitectura de aplicaciones y Firebase. Es experto en Programación Orientada a Objetos, siempre con el objetivo de compartir las mejores prácticas y tendencias en el mercado de desarrollo de software. Trabajó durante 2 años como editor de contenidos en el blog de Alura y hoy sigue escribiendo artículos técnicos.

Este articulo fue adecuado para Alura Latam por: Jose Charris

Artículos de Tecnología > Programación

En Alura encontrarás variados cursos sobre Programación. ¡Comienza ahora!

Precios en:
USD
  • USD
  • BOB
  • CLP
  • COP
  • USD
  • PEN
  • MXN
  • UYU

Semestral

  • 273 cursos

    Cursos de Programación, Front End, Data Science, Innovación y Gestión.

  • Videos y actividades 100% en Español
  • Certificado de participación
  • Estudia las 24 horas, los 7 días de la semana
  • Foro y comunidad exclusiva para resolver tus dudas
  • Luri, la inteligencia artificial de Alura

    Luri es nuestra inteligencia artificial que resuelve dudas, da ejemplos prácticos y ayuda a profundizar aún más durante las clases. Puedes conversar con Luri hasta 100 mensajes por semana

  • Acceso a todo el contenido de la plataforma por 6 meses
US$ 65.90
un solo pago de US$ 65.90
¡QUIERO EMPEZAR A ESTUDIAR!

Paga en moneda local en los siguientes países

Anual

  • 273 cursos

    Cursos de Programación, Front End, Data Science, Innovación y Gestión.

  • Videos y actividades 100% en Español
  • Certificado de participación
  • Estudia las 24 horas, los 7 días de la semana
  • Foro y comunidad exclusiva para resolver tus dudas
  • Luri, la inteligencia artificial de Alura

    Luri es nuestra inteligencia artificial que resuelve dudas, da ejemplos prácticos y ayuda a profundizar aún más durante las clases. Puedes conversar con Luri hasta 100 mensajes por semana

  • Acceso a todo el contenido de la plataforma por 12 meses
US$ 99.90
un solo pago de US$ 99.90
¡QUIERO EMPEZAR A ESTUDIAR!

Paga en moneda local en los siguientes países

Acceso a todos
los cursos

Estudia las 24 horas,
dónde y cuándo quieras

Nuevos cursos
cada semana