:: Enseignements :: ESIPE :: E3INFO :: 2008-2009 :: Programmation Objet avec Java ::
[LOGO]

String, StringBuilder, egalité, exec et parcours de map.


Exercice 1 - Assignation, égalité, référence

  1. Qu'affiche le code suivant :
           String s1="toto";
           String s2=s1;
           String s3=new String(s1);
    
           System.out.println(s1==s2);
           System.out.println(s1==s3);
         
    Expliquer
  2. Quelle est la méthode à utiliser si l'on veux tester le contenu des chaînes de caractère ?
  3. Qu'affiche le code suivant :
          String s1="toto";
          String s2="toto";
    
          System.out.println(s1==s2);
         
    Expliquer.
  4. Expliquer pourquoi il est important que java.lang.String soit non mutable.
  5. Qu'affiche le code suivant :
          String s="hello";
          s.toUpperCase();
          System.out.println(s);
         
    Expliquer

Exercice 2 - En morse. Stop.

Ecrire une classe fr.umlv.morse.Morse qui permet lors de son exécution d'afficher les chaînes de caractères prisent en argument séparé par des "Stop.".
      $ java Morse ceci est drole
      ceci Stop. est Stop. drole Stop.
    
  1. Utiliser dans un premier temps, l'opérateur + qui permet la concaténation de chaînes de caractères.
  2. A quoi sert l'objet java.lang.StringBuilder
    Pouquoi sa méthode append(String) renvoie un obejt de type StringBuilder ?
  3. Ré-écire la classe fr.umlv.morse.Morse en utilisant un StringBuilder.
    Quelle est l'avantage par rapport à la solution précédente ?
  4. Recopier le code suivant dans une classe de Test :
           public static void main(String[] args) {
             String first=args[0];
             String second=args[1];
             String last=args[2];
             System.out.println(first+' '+second+' '+last);
           }
          
    Compiler le code puis utilise la commande javap pour afficher l'assembleur généré
           javap -c Test
          
    Que pouvez vous en déduire ?
    Dans quel cas doit-on utiliser StringBuilder.append() plutôt que le + ?

Exercice 3 - Exec

Le but de cet exercice est d'associer les inodes des fichiers du répertoire courant à leur nom en utilisant la commande /bin/ls avec le paramètre -i.

  1. Pour executer une commande système en Java, on peut utiliser les méthodes exec de la classe java.lang.Runtime. Quelle méthode doit on utiliser si l'on veut envoyer executer la commande /bin/ls avec le paramètre -i.
  2. Comment récupérer le résultat de l'exécution de la commande ?
  3. Sachant que l'on peut obtenir l'objet Runtime avec la méthode Runtime.getRuntime() et qu'un objet java.util.Scanner peut prendre un InputStream en paramètre. Ecrire un programme qui execute la commande /bin/ls avec le paramètre -i et qui affiche le résultat ligne par ligne.
    Rappel: Scanner possède les méthodes hasNextLine, nextLine.
  4. Pour communiquer, le système établie un tube entre le programme Java et la commande système. Il y a en fait deux tubes, un pour la sortie standard et un pour la sortie d'erreur standard. Si jamais la commande écrit dans un tube et que le résultat n'est pas lu, le système fini par bloquer la commande en attente d'une lecture par le programme Java.
    Or, actuellement le programme ne lit pas sur la sortie d'erreur standard donc une commande risque d'être bloqué indéfiniment par le système. Pour eviter ce problème, une solution simple consiste à rediriger la sortie d'erreur standard sur la sortie d'erreur.
    Modifier votre code pour utiliser la classe ProcessBuilder et ainsi rediriger l'erreur standard sur la sortie standard.
  5. Modifier votre programme pour que le résultat de la commande ls soit stocké dans une Map dont les clés sont des i-nodes (sous forme d'un entier long) et les valeurs des noms (sous forme de String).
    Note: Il est possible de créer un Scanner sur une String.
  6. Parcourir la Map des résultats pour les afficher sous la forme : nom : un_nom inode: numero_d_inode
    Note: On peut utiliser une boucle foreach.