En général une bibliothèque (library) est un regroupement de code suffisamment structuré et documenté pour que d’autres programmeurs puissent s’en servir. La bibliothèque associée à un langage de programmation est diffusée avec le compilateur, système d’exécution etc. La majeure partie de des programmes disponibles dans la bibliothèque d’un langage est normalement écrite dans ce langage lui-même.
La première source de documentation des classes de la bibliothèque de Java est bien entendu la documentation en ligne de cette dernière, ou comme on dit la Application Programmer Interface Specification. Nous donnons donc des extraits de cette documentation assortis de quelques commentaires personnels. Cette section entend surtout vous aider à prendre la bonne habitude de consulter la documentation du langage que vous utilisez. En particulier, la version web du polycopié comporte des liens vers la documentation en ligne.
On objectera que la bibliothèque est énorme. Mais en pratique on s’y retrouve assez vite :
Il est vain d’objecter que la documentation est en anglais. C’est comme ça.
Ce package
regroupe les fonctionnalités les plus basiques de la
la bibliothèque. Il est importé par défaut
(pas besoin de import java.lang.*
).
À chaque type scalaire (int
, char
etc.),
correspond une classe (Integer
, Character
etc.)
qui permet surtout de transformer les scalaires en
objets. Une transformation que le compilateur sait automatiser
(voir 2.2.3).
Prenons l’exemple de la classe Integer le pendant objet du
type scalaire int
.
Deux méthodes permettent le passage d’un scalaire à un
objet et réciproquement.
int
caché dans un objet Integer
.
La classe Integer
a bien d’autres méthodes, comme par exemple
s
contient la représentation décimale d’un
entier, alors parseInt
renvoie cet entier (comme un int
).
Si la chaîne s
ne représente pas un int
,
alors l’exception NumberFormatException
est lancée.
Les fonctions mathématiques usuelles sont définies dans la
classe Math.
Il n’y a pas d’objets Math
. Cette classe ne sert qu’à la structuration.
Elle offre des méthodes (statiques).
double
,
par défaut floor,
par excès ceil
et au plus proche round.
double
. Tandis que round renvoie un long
.
Les méthodes existent aussi pour les float
et
round(float a)
renvoie un int
.
Cela peut sembler logique si on considère que les valeurs double
et long
d’une part, et float
et int
d’autre part occupent le même
nombres de bits (64 et 32). Mais en fait ça ne règle pas vraiment le
problème des flottants trop grands pour être arrondis vers un entier
(voir la documentation).Les chaînes sont des objets de la classe String.
Une chaîne est tout simplement une séquence finie de caractères.
En Java les chaînes sont non-mutables : on ne peut pas changer les
caractères d’une chaîne.
Les chaînes sont des objets normaux, à un peu de syntaxe spécialisée près.
Les constantes chaînes
s’écrivent entre doubles quotes, par exemple "coucou"
.
Si on veut mettre un double quote « "
» dans une chaîne,
il fait le citer en le précédant d’une barre oblique inverse
(backslash).
System.err.print("Je suis un double quote : \"")
affiche
Je suis un double quote : " sur la console.
En
outre, la concaténation de deux chaînes s1 et
s2, s’écrit avec l’opérateur + comme
s1+
s2.
Les autres opérations classiques sur les chaînes sont des méthodes normales.
beginIndex
est l’indice
du premier caractère de la sous-chaîne, et endIndex
est l’indice du
caractère qui suit immédiatement la sous-chaîne.
La longueur de la sous-chaîne extraite est donc endIndex-beginIndex
.
Si le couple d’indices ne désigne pas une sous-chaîne
l’exception IndexOutOfBoundsException
est lancée.
Les règles de définition du couple d’indices désignant une sous-chaîne
valide (voir la documentation)
conduisent à la particularité bien sympathique que
s.substring(s.length(), s.length())
renvoie la chaîne
vide ""
.Object
.
Il faut juste le savoir, c’est tout. La classe String
étant une
sous-classe de Object
(voir B.2.3), la méthode s’applique en particulier
au seul cas utile d’un argument de classe String
..compareTo(
s2)
» renvoie
un entier r avec :
On ne peut pas changer une chaîne, par exemple changer un caractère
individuellement. Or, on veut souvent construire une chaîne petit à
petit, on peut le faire en utilisant la concaténation mais il y a alors
un prix à payer, car une nouvelle chaîne est créée à chaque
concaténation. En fait, lorsque l’on construit une chaîne de gauche
vers la droite (pour affichage d’un tableau par ex.) on a besoin d’un
autre type de structure de données : le StringBuilder (ou
StringBuffer essentiellement équivalent).
Un objet StringBuilder
contient un tampon de caractère interne,
qui peut changer de taille et dont les éléments peuvent être modifiés.
Les membres les plus utiles de cette classe sont :
obj.toString()
qui est ajoutée,
ou "null"
si obj est null
.
Les autres méthodes sont là, soit pour des raisons d’efficacité (cas
de String
), soit pour les tableaux dont
le toString()
est inutilisable,
soit parce que l’argument est de type scalaire
(cas de int
).
Toutes les méthodes append renvoient l’objet StringBuilder
dont on appelle la méthode,
ce qui est absurde, cet objet restant le même.
Je crois qu’il en est ainsi
afin d’autoriser par exemple l’écriture sb.append(i).append(':') ;
au lieu de sb.append(i) ;
sb.append(':') ;
(où i
est une
variable par exemple de type int
).
On trouvera un exemple d’utilisation classique d’un
objet StringBuilder
en 1.2.1 :
une création, des tas de append(…), et un
toString() final.
Cette classe System est un peu fourre-tout. Elle posssède trois champs et quelques méthodes assez utiles.
final
, on ne peut donc
pas les changer (bizarrement il existe quand même des méthode
pour changer les trois flux standard).
Les deux flux de sortie offrent des sorties formatées par une
méthode print
bien pratique, car elle
est surchargée et fonctionne pour toutes les valeurs.La sortie out est la sortie normale du programme, tandis que la sortie err est la sortie d’erreur. En fonctionnement normal ces deux flux semblent confondus car aboutissant tous deux dans la même fenêtre. Mais on peut rediriger la sortie out, par exemple vers un fichier (>fichier). Les messages d’erreurs s’affichent alors au lieu de se mélanger avec la sortie normale du programme dans fichier.
status
est le code de retour qui vaut
conventionellement zéro dans le cas d’une exécution normale, et autre
chose pour une exécution qui s’est mal passée,
En Unix, le code est accessible juste après l’exécution comme
$status
ou $?
, selon les shells.Ce package regroupe s’attaque principalement à la communication avec le système de fichiers de la machine. Nous ne passons en revue ici que les flux de caractères, qui correspondent aux fichiers texte (voir B.5).
Les objets de la classe Reader sont des flux de caractères ouverts en lecture. Un tel flux est simplement une séquence de caractères que l’on lit les un après les autres, et qui finit par se terminer.
int
qui est le caractère en
attente dans le flux d’entrée, ou −1, si le flux est terminé.
On notera que read renvoie un int
et non pas un char
précisément pour pouvoir identifier la fin du flux facilement.
En outre et comme annoncé par sa déclaration elle peut lever l’exception
IOException
en cas d’erreur (possible dès que l’on
s’intéresse au fichiers).
La classe Reader
sert seulement à décrire
une fonctionnalité et il n’existe pas à proprement parler d’objets
de cette classe.
En revanche, il existe diverses sous-classes (voir B.2.3) de
Reader
qui permettent de construire concrètement des objets,
qui peuvent se faire passer pour des Reader
.
Il s’agit par entre autres des classes
StringReader
(lecteur sur une chaîne),
InputStreamReader
(lecteur sur un flux d’octets) et FileReader (lecteur sur un
fichier).
On peut donc par exemple obtenir un Reader
ouvert sur un
fichier /usr/share/dict/french
par
et un Reader
sur l’entrée standard par
Un objet BufferedReader est d’abord un Reader qui groupe
les appels au flux sous-jacent et stocke les caractères lus
dans un tampon, afin d’améliorer les performances
(voir B.5.4).
Mais un BufferedReader
offre quelques fonctionnalités en plus
de celles des Reader
.
Reader
en argument.
BufferedReader
est une sous-classe de la classe Reader
de sorte qu’un objet BufferedReader
possède une
méthode read.
Reader
ne possèdent pas.
null
en fin de flux.
La méthode fonctionne pour les trois conventions de fin de ligne
('\n'
, '\r'
ou '\r'
suivi de '\n'
)
et le ou les caractères « fin de ligne » ne sont pas renvoyés.
La méthode fonctionne encore pour la dernière ligne d’un flux
qui ne serait pas terminée par une fin de ligne explicite.
Une source pseudo-aléatoire est une suite de nombres qui ont l’air
d’être tirés au hasard.
Ce qui veut dire que les nombres de la suite obéissent à des critères
statistiques censés exprimer le hasard (et en particulier
l’uniformité, mais aussi un aspect chaotique pas évident à spécifier
précisément).
Une fois la source construite (un objet de la
classe Random),
diverses méthodes permettent d’obtenir
divers scalaires (int
, double
, etc.) que l’on peut
considérer comme tirés au hasard.
On a besoin de tels nombres « tirés au hasard » par exemple pour réaliser
des simulations (voir 2.1.1)
ou produire des exemples destiner à tester des
programmes.
a + rand.nextInt(b-a)
.
0.0
(inclus) et 1.0
(exclu).
rand.nextDouble() < 0.75
vaut true
avec une probabilité de 75 %.