En aquest tema, aprendrem a desenvolupar una aplicació de consola en Java. Les aplicacions de consola són programes que s'executen en una interfície de línia de comandes (CLI) i interactuen amb l'usuari a través de text. Aquest tipus d'aplicacions són ideals per a tasques automatitzades, scripts i eines de desenvolupament.
Objectius del Tema
- Comprendre els conceptes bàsics d'una aplicació de consola.
- Aprendre a llegir i escriure dades a la consola.
- Desenvolupar una aplicació de consola completa amb funcionalitats bàsiques.
Conceptes Bàsics
- Entrada i Sortida de la Consola
Per interactuar amb l'usuari a través de la consola, utilitzarem les classes Scanner
per a la lectura d'entrada i System.out
per a la sortida.
Lectura d'Entrada
import java.util.Scanner; public class EntradaConsola { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Introdueix el teu nom: "); String nom = scanner.nextLine(); System.out.println("Hola, " + nom + "!"); } }
Explicació:
Scanner scanner = new Scanner(System.in);
: Crea un objecteScanner
per llegir l'entrada de la consola.scanner.nextLine();
: Llegeix una línia de text de la consola.System.out.println("Hola, " + nom + "!");
: Mostra un missatge a la consola.
Sortida de Dades
public class SortidaConsola { public static void main(String[] args) { System.out.println("Aquest és un missatge de sortida."); } }
Explicació:
System.out.println("Aquest és un missatge de sortida.");
: Mostra un missatge a la consola.
Desenvolupament d'una Aplicació de Consola Completa
- Definició del Problema
Desenvoluparem una aplicació de consola que gestioni una llista de tasques. L'usuari podrà afegir, eliminar i veure les tasques.
- Estructura del Programa
El programa tindrà les següents funcionalitats:
- Mostrar el menú principal.
- Afegir una tasca.
- Eliminar una tasca.
- Veure totes les tasques.
- Sortir del programa.
- Implementació
Classe Principal
import java.util.ArrayList; import java.util.Scanner; public class GestorTasques { private static ArrayList<String> tasques = new ArrayList<>(); private static Scanner scanner = new Scanner(System.in); public static void main(String[] args) { boolean sortir = false; while (!sortir) { mostrarMenu(); int opcio = scanner.nextInt(); scanner.nextLine(); // Consumir la nova línia switch (opcio) { case 1: afegirTasca(); break; case 2: eliminarTasca(); break; case 3: veureTasques(); break; case 4: sortir = true; break; default: System.out.println("Opció no vàlida. Si us plau, tria una altra opció."); } } } private static void mostrarMenu() { System.out.println("\nGestor de Tasques"); System.out.println("1. Afegir Tasca"); System.out.println("2. Eliminar Tasca"); System.out.println("3. Veure Tasques"); System.out.println("4. Sortir"); System.out.print("Tria una opció: "); } private static void afegirTasca() { System.out.print("Introdueix la tasca: "); String tasca = scanner.nextLine(); tasques.add(tasca); System.out.println("Tasca afegida."); } private static void eliminarTasca() { System.out.print("Introdueix el número de la tasca a eliminar: "); int index = scanner.nextInt(); scanner.nextLine(); // Consumir la nova línia if (index >= 0 && index < tasques.size()) { tasques.remove(index); System.out.println("Tasca eliminada."); } else { System.out.println("Número de tasca no vàlid."); } } private static void veureTasques() { System.out.println("\nLlista de Tasques:"); for (int i = 0; i < tasques.size(); i++) { System.out.println(i + ". " + tasques.get(i)); } } }
Explicació:
ArrayList<String> tasques
: Emmagatzema la llista de tasques.Scanner scanner
: Llegeix l'entrada de l'usuari.mostrarMenu()
: Mostra el menú principal.afegirTasca()
: Afegeix una nova tasca a la llista.eliminarTasca()
: Elimina una tasca de la llista.veureTasques()
: Mostra totes les tasques.
Exercicis Pràctics
Exercici 1: Afegir Validació
Modifica el programa per validar que l'usuari introdueixi un número vàlid quan elimina una tasca.
Exercici 2: Afegir Funcionalitat de Modificació
Afegeix una nova opció al menú per permetre a l'usuari modificar una tasca existent.
Exercici 3: Guardar i Carregar Tasques
Modifica el programa per guardar les tasques en un fitxer i carregar-les quan el programa s'inicia.
Solucions
Solució a l'Exercici 1
private static void eliminarTasca() { System.out.print("Introdueix el número de la tasca a eliminar: "); int index = scanner.nextInt(); scanner.nextLine(); // Consumir la nova línia if (index >= 0 && index < tasques.size()) { tasques.remove(index); System.out.println("Tasca eliminada."); } else { System.out.println("Número de tasca no vàlid."); } }
Solució a l'Exercici 2
private static void modificarTasca() { System.out.print("Introdueix el número de la tasca a modificar: "); int index = scanner.nextInt(); scanner.nextLine(); // Consumir la nova línia if (index >= 0 && index < tasques.size()) { System.out.print("Introdueix la nova tasca: "); String novaTasca = scanner.nextLine(); tasques.set(index, novaTasca); System.out.println("Tasca modificada."); } else { System.out.println("Número de tasca no vàlid."); } }
Afegeix aquesta opció al menú:
Solució a l'Exercici 3
import java.io.*; import java.util.ArrayList; import java.util.Scanner; public class GestorTasques { private static ArrayList<String> tasques = new ArrayList<>(); private static Scanner scanner = new Scanner(System.in); private static final String FITXER_TASQUES = "tasques.txt"; public static void main(String[] args) { carregarTasques(); boolean sortir = false; while (!sortir) { mostrarMenu(); int opcio = scanner.nextInt(); scanner.nextLine(); // Consumir la nova línia switch (opcio) { case 1: afegirTasca(); break; case 2: eliminarTasca(); break; case 3: veureTasques(); break; case 4: sortir = true; guardarTasques(); break; default: System.out.println("Opció no vàlida. Si us plau, tria una altra opció."); } } } private static void mostrarMenu() { System.out.println("\nGestor de Tasques"); System.out.println("1. Afegir Tasca"); System.out.println("2. Eliminar Tasca"); System.out.println("3. Veure Tasques"); System.out.println("4. Sortir"); System.out.print("Tria una opció: "); } private static void afegirTasca() { System.out.print("Introdueix la tasca: "); String tasca = scanner.nextLine(); tasques.add(tasca); System.out.println("Tasca afegida."); } private static void eliminarTasca() { System.out.print("Introdueix el número de la tasca a eliminar: "); int index = scanner.nextInt(); scanner.nextLine(); // Consumir la nova línia if (index >= 0 && index < tasques.size()) { tasques.remove(index); System.out.println("Tasca eliminada."); } else { System.out.println("Número de tasca no vàlid."); } } private static void veureTasques() { System.out.println("\nLlista de Tasques:"); for (int i = 0; i < tasques.size(); i++) { System.out.println(i + ". " + tasques.get(i)); } } private static void guardarTasques() { try (BufferedWriter writer = new BufferedWriter(new FileWriter(FITXER_TASQUES))) { for (String tasca : tasques) { writer.write(tasca); writer.newLine(); } } catch (IOException e) { System.out.println("Error en guardar les tasques: " + e.getMessage()); } } private static void carregarTasques() { try (BufferedReader reader = new BufferedReader(new FileReader(FITXER_TASQUES))) { String tasca; while ((tasca = reader.readLine()) != null) { tasques.add(tasca); } } catch (IOException e) { System.out.println("Error en carregar les tasques: " + e.getMessage()); } } }
Conclusió
En aquest tema, hem après a desenvolupar una aplicació de consola en Java. Hem cobert els conceptes bàsics d'entrada i sortida de la consola, i hem implementat una aplicació completa per gestionar una llista de tasques. A més, hem proporcionat exercicis pràctics per reforçar els conceptes apresos i hem ofert solucions detallades per a cada exercici. Amb aquests coneixements, estàs preparat per crear les teves pròpies aplicacions de consola en Java.
Curs de Programació en Java
Mòdul 1: Introducció a Java
- Introducció a Java
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Operadors
Mòdul 2: Flux de Control
Mòdul 3: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Mètodes
- Constructors
- Herència
- Polimorfisme
- Encapsulació
- Abstracció
Mòdul 4: Programació Orientada a Objectes Avançada
Mòdul 5: Estructures de Dades i Col·leccions
Mòdul 6: Gestió d'Excepcions
Mòdul 7: Entrada/Sortida de Fitxers
- Lectura de Fitxers
- Escriptura de Fitxers
- Fluxos de Fitxers
- BufferedReader i BufferedWriter
- Serialització
Mòdul 8: Multithreading i Concurrència
- Introducció al Multithreading
- Creació de Fils
- Cicle de Vida dels Fils
- Sincronització
- Utilitats de Concurrència
Mòdul 9: Xarxes
- Introducció a les Xarxes
- Sockets
- ServerSocket
- DatagramSocket i DatagramPacket
- URL i HttpURLConnection