3-Chaînes de caractères, entrée/sortie
Transcription
3-Chaînes de caractères, entrée/sortie
Chaı̂nes de caractères Objets Immuables Entrée/Sortie Programmation Orientée Objet 3-Chaı̂nes de caractères, entrée/sortie Emmanuel Hyon Université Paris Ouest Nanterre UFR SEGMI - L2 MIA - 2010/2011 17 mars 2011 1 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Sommaire 1 Chaı̂nes de caractères 2 Objets Immuables 3 Entrée/Sortie Inter action clavier ecran 2 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Sommaire 1 Chaı̂nes de caractères 2 Objets Immuables 3 Entrée/Sortie 3 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie La classe String • Les chaı̂nes de caractères sont représentées en Java par la classe String • Toute chaı̂ne de caractère est donc une instance de String 1 2 String vide = ""; // cha^ ıne vide String salut = "Bonjour !"; 4 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Sous-chaı̂nes • L’extraction d’une sous-chaı̂ne se fait avec la méthode : substring(int first, int last + 1) : String • first est l’index de la première position à copier • last est l’index de la dernière position à copier, auquel il faut rajouter 1 • la numérotation des positions commence à zéro 1 2 String beau = "Il fait beau !".substring(8, 12); // beau vaut "beau" 5 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie String est immuable ! • Il est impossible de remplacer des caractères à l’intérieur de la même chaı̂ne. • Pour ce faire, il faut concaténer la sous-chaı̂ne qu’on veut conserver avec les caractères qu’on veut remplacer. • Cela créera une nouvelle chaı̂ne • Cette caractéristique rend toute instance de String immuable 1 2 3 String salut = "bonjour !"; salut = salut.substring(0, 3) + "soir !" // salut possède maintenant la référence d’une nouvelle cha^ ıne qui vaut : "bonsoir !" 6 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Pourquoi String est-elle immuable ? • Principalement favoriser le partage de références vers les mêmes chaı̂nes de caractères • Plus de réutilisation et comparaison que de modification dans la majorité des programmes • Inconvénient : problème de performance dans le cas où la modification l’emporte • Dans le cas d’une construction progressive de chaı̂nes, il existe des classes adaptées, telles que StringBuffer et StringBuilder. 7 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Egalité entre Strings • Le test de l’égalité se fait sur le contenu des objets de type String et non sur leurs références. • Utiliser l’API equals ou equalsIgnoreCase et non == • == a pour effet de déterminer si les deux objets possèdent la même référence 1 2 3 4 String greeting = "bonjour"; if ("Bonjour".equalsIgnoreCase(greeting)) { //faire quelque chose } 8 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Construction progressive de chaı̂nes • Il est inefficace de construire progressivement des chaı̂nes avec l’opérateur de concaténation + • Chaque concaténation donne lieu à la création d’une nouvelle chaı̂ne • Il est mieux dans ce cas d’utiliser StringBuilder ou StringBuilder 1 2 3 4 StringBuilder sb = new StringBuilder() sb.append("Voici un début de texte\n"); sb.append("Voici une nouvelle ligne de texte."); sb.toString(); // retournera toute la séquence de cha^ ınes construite 9 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Sommaire 1 Chaı̂nes de caractères 2 Objets Immuables 3 Entrée/Sortie 10 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Les Objets immuables Qu’est ce qu’un objet immuable Un objet immuable (immutable en anglais) est un objet dont les attributs d’instances accessibles ne changent pas après la création. Les objets immuables sont • String, • Tous les objets représentant un type primaire : Integer, Float, Boolean,.... Les avantages Ils sont Thread Safe. Ils n’ont pas besoin d’être clonés Ils gardent la même référence. 11 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Sommaire 1 Chaı̂nes de caractères 2 Objets Immuables 3 Entrée/Sortie Inter action clavier ecran 12 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Inter action clavier ecran Lecture à la console Encapsuler System.in dans la classe Scanner 1 2 3 4 5 6 Scanner in = new Scanner(System.in); String name = in.next(); // lecture d’un mot String address = in.nextLine(); // lecture d’une ligne int age = in.nextInt(); // lecture d’un entier double salary = in.nextDouble(); // lecture d’un réel boolean prochain=in.hasnext(); // y a-t-il un prochain item Scanner se trouve dans le package java.util : 1 import java.util.Scanner; 13 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Inter action clavier ecran Lecture à la console II Exemple 1 Scanner scan = new Scanner(System.in); 2 System.out.print(’’Saissisez votre nom’’); 3 String mot = in.next(); // lecture du mot 4 System.out.println(’’Saissisez votre nom’’); 5 String mot = in.nextLine(); // lecture du mot 6 char c =mot.charAt(2); 7 System.out.println(’’Saissisez votre age’’); 8 int age = in.nextInt(); // lecture de l’entier 9 System.out.println(’’Saissisez votre poids’’); 10 double poids = in.nextDouble(); // lecture d’un réel 14 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Inter action clavier ecran Parsing avec scanner Décomposition en jetons 1 2 3 4 Scanner in = new Scanner(System.in); in.useDelimiter(’’;’’); while (in.hasNext()) System.out.print(‘‘ mot est ‘‘+in.next()); si la ligne est : Bon ;jour Mon ;Ami le programme donne : Bon jour Mon Ami. si delimiteur est “ “ et la ligne est : Bon ;jour Mon ;Ami le programme donne : Bon ;jour Mon ;Ami. StringTokenizer est une autre classe qui permet de transformer une phrase. 15 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Inter action clavier ecran Affichage formaté • Lorsqu’on souhaite un affichage bien formaté, System.out.print (et variante en ln) n’est souvent pas satisfaisant • Utiliser System.out.printf avec des spécificateurs de format (à la C) • plusieurs spécificateurs peuvent être utilisés dans le même affichage 1 2 3 double x = 10000.0 / 3.0; // 8 positions, précision 2 System.out.printf("%8.2f", x); // 3333.33 16 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Inter action clavier ecran Spécificateurs de format pour printf Spécificateur d x o f e g s c b tx Type Decimal integer Hexadecimal integer Octal integer fixed-point floating point Exponential floating-point General floating-point (shorter of e and f) String Character boolean Date and time Exemple 159 9f 237 15.9 1.59e+01 Computer P true Voir tableau suivant 17 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Inter action clavier ecran Spécificateurs de format pour Date Spécificateur Type c Complete date and time F D T R Y B d A mx ISO 8601 date US formatted date 24-hour time 24-hour time, no seconds Four-digit year Full month name Two-digit day Full week day name Two-digit month Exemple Tue Feb 16 11 :12 :05 PST 2010 2010-02-16 02/16/2010 14 :32 :45 15 :23 2010 March 06 Wednesday 03 18 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Inter action clavier ecran Affichage de date • Utiliser tx, où x est l’un des spécificateurs du tableau précédent 1 2 System.out.printf("%tc", new Date()); // mar. févr. 16 18:20:48 CET 2010 19 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Inter action clavier ecran Lecture d’un fichier • Encapsuler la classe File dans la classe Scanner • L’emplacement du fichier indiqué est relatif au répertoire où Java a lancé l’exécution du programme • Utiliser un chemin absolu en cas de problème avec le chemin relatif • Ou String dir = System.getProperty("user.dir") pour récupérer le chemin vers le répertoire courant de travail 1 2 Scanner in = new Scanner(new File("fichier.txt")); // toutes les méthodes de Scanner peuvent ^ etre utilisées pour la lecture 20 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Inter action clavier ecran Lecture d’un fichier inexistant • Une exception sera levée • Avant d’étudier les exceptions, il faut maintenant indiquer au compilateur qu’une telle exception doit être propagée • Ce mécanisme est mis en œuvre avec le mot-clé throws 1 2 3 4 public static void main(String[] args) throws FileNotFoundException { Scanner in = new Scanner(new File("fichier.txt")); // ... } 21 / 22 Chaı̂nes de caractères Objets Immuables Entrée/Sortie Inter action clavier ecran Écriture dans un fichier • Utiliser la classe PrintWriter • Si le fichier n’existe pas, il est créé • S’il existe déjà, son contenu actuel est écrasé 1 2 3 PrintWriter out = new PrintWriter("fichier.txt"); out.println("Notes de cours de POO"); // On peut utiliser également print et printf. 22 / 22