Packages intégrés de Java
Tour d'horizon des packages Java les plus utilisés — java.lang, java.util, java.io, java.nio, java.net, java.time.
Le JDK est livré avec une vaste bibliothèque standard, organisée en des centaines de packages. Vous passerez vos premiers mois à utiliser sans cesse la même poignée d'entre eux : java.lang, java.util, java.io, java.nio, java.net, java.time, java.math. Ce chapitre est une visite guidée — à quoi sert chacun, les classes principales qu'il contient, et quand l'utiliser plutôt que ses voisins.
java.lang — le package que vous n'importez jamais
java.lang est importé automatiquement dans chaque fichier source. Tout ce qu'il contient est accessible par son simple nom, sans aucune ligne import :
Object,Class,String,StringBuilder— les types que tout programme utilise.Math—sqrt,min,max,random, les fonctions trigonométriques.- Types enveloppes —
Integer,Long,Double,Boolean,Character,Byte,Short. Thread,Runnable,ThreadLocal— les primitives de concurrence d'origine.System—out,err,currentTimeMillis(),getenv,exit.Throwable,Exception,RuntimeException,Error— toute la hiérarchie des exceptions.Iterable,Comparable,CharSequence,AutoCloseable— les interfaces sur lesquelles le langage lui-même s'appuie pourfor-each, les génériques,try-with-resourceset autres.
Si vous voyez une classe utilisée sans import, elle provient presque toujours d'ici.
java.util — collections, utilitaires et les anciennes classes de date
java.util est le package du quotidien. Le framework de collections à lui seul suffit à justifier de le connaître.
- Interfaces de collection :
Collection,List,Set,Map,Queue,Deque. - Implémentations concrètes :
ArrayList,LinkedList,HashMap,LinkedHashMap,TreeMap,HashSet,TreeSet,ArrayDeque. - Classes utilitaires :
Arrays(méthodes sur les tableaux),Collections(sort,unmodifiableList, ...),Objects(requireNonNull,hash). Optional— pour les types de retour qui « n'ont peut-être pas de valeur ».Random,Scanner,UUID— des utilitaires courants que vous rencontrerez partout.- Les anciennes classes de date —
Date,Calendar,TimeZone. Ne les utilisez pas dans du nouveau code ; utilisez plutôtjava.time.
java.util possède également des sous-packages importants à connaître :
java.util.concurrent—ConcurrentHashMap,ExecutorService,Future,CompletableFuture, la boîte à outils de concurrence moderne.java.util.stream— l'APIStreampour les pipelines de style fonctionnel.java.util.function— les interfaces fonctionnelles :Function,Predicate,Supplier,Consumer, la famille utilisée par les streams et les lambdas.
java.io — les flux classiques
Le package I/O d'origine, encore largement utilisé partout, même si java.nio est désormais préféré pour le nouveau code.
- Flux d'octets :
InputStream,OutputStream,FileInputStream,FileOutputStream,BufferedInputStream,ByteArrayInputStream. - Flux de caractères :
Reader,Writer,FileReader,FileWriter,BufferedReader,InputStreamReader,PrintWriter. File— l'abstraction legacy du système de fichiers.- Sérialisation :
Serializable,ObjectInputStream,ObjectOutputStream.
La séparation entre les flux d'octets (InputStream/OutputStream) et les flux de caractères (Reader/Writer) est intentionnelle — les octets pour les données binaires, les caractères pour le texte avec un encodage connu.
java.nio — I/O moderne et chemins de fichiers
« NIO » signifiait à l'origine « new I/O » ; aujourd'hui c'est simplement le package I/O recommandé.
java.nio.file.Path— le remplaçant moderne dejava.io.File.java.nio.file.Files— des helpers en une ligne :Files.readString,Files.write,Files.walk,Files.exists.java.nio.file.Paths— l'ancien point d'entrée ;Path.of(...)fait la même chose en moins de code.- Buffers et canaux :
ByteBuffer,FileChannel,SocketChannel— des blocs de construction bas niveau pour l'I/O haute performance.
Pour lire un fichier dans du nouveau code, utilisez Files.readString(Path.of(...)) plutôt qu'un BufferedReader associé à un try-with-resources.
java.net — réseau
URLs, sockets et HTTP.
URL,URI— analyse et représentation des adresses.Socket,ServerSocket,DatagramSocket— TCP et UDP bas niveau.InetAddress— adresses IP et résolution de noms d'hôtes.
Java 11 a ajouté java.net.http.HttpClient, un client HTTP moderne avec support asynchrone intégré au JDK. Pour le nouveau code effectuant des requêtes HTTP, c'est le bon point de départ — aucune bibliothèque tierce n'est requise.
java.time — dates et heures bien gérées
Ajouté dans Java 8 pour remplacer l'API Date / Calendar défaillante.
LocalDate,LocalTime,LocalDateTime— valeurs d'horloge murale, sans fuseau horaire.ZonedDateTime,ZoneId— instants avec fuseau horaire.Instant— un point sur la ligne de temps globale ; le type à stocker en base de données.Duration,Period— des quantités de temps (secondes vs. jours/mois).DateTimeFormatter— analyse et formatage.
Tous les types java.time sont immuables et thread-safe. Cela seul suffit à justifier la migration de tout code utilisant encore java.util.Date.
java.math — arithmétique de précision
Quand double et long ne suffisent pas :
BigInteger— entiers de précision arbitraire ; pas de débordement.BigDecimal— arithmétique décimale exacte avec un mode d'arrondi explicite ; ce qu'il faut pour l'argent.
MathContext et RoundingMode complètent le package.
Quelques autres que vous rencontrerez
java.text— formatage plus ancien (NumberFormat,MessageFormat). Largement remplacé parjava.timeetString.format, mais encore courant pour la sortie localisée.java.security— hachage, signature ;MessageDigest,KeyStore,Signature.javax.crypto— chiffrement symétrique et asymétrique.java.sql— API JDBC.javax.xml,org.w3c.dom,org.xml.sax— analyse XML.
Les préfixes javax.* et org.* sont historiques — javax était à l'origine pour les « extensions », et les packages org.* provenaient d'organismes de normalisation. Aujourd'hui, ce sont des packages JDK ordinaires comme les autres.
Un exemple concret
Ce programme utilise java.util, java.util.stream, java.time et java.math en un seul endroit — un aperçu de la façon dont la bibliothèque standard se compose.
Le résultat affiché est :
4 Jan 2026 -> $33.49
17 Jan 2026 -> $12.00
first sale was 28 days before 1 Feb 2026Notez que les totaux sont exacts (BigDecimal n'a pas perdu un centime), les jours sont groupés dans l'ordre calendaire (le fournisseur TreeMap les a triés), et l'écart entre les dates est calculé sans un seul calcul manuel en millisecondes. Le même programme serait deux fois plus long et moins lisible avec les équivalents Date/Calendar d'avant Java 8 et double pour les montants. Choisir le bon package, c'est déjà la moitié du travail.
Et ensuite
Vous avez maintenant vu ce que contient la bibliothèque standard. La dernière pièce de l'histoire des packages est la façon dont la JVM trouve réellement toutes ces classes — les vôtres et celles du JDK — à la compilation et à l'exécution. Continuez vers le classpath Java.