3. JSR 334 - Petites améliorations
du langage (le projet "Coin")
Expression littérale binaire:
◦ 0b11111111,
Formatage des expressions numériques
◦ long creditCardNumber =
1111_2222_3333_444L;
Switch sur les String
◦ switch(action) {
case "save": save(); break;
case "update": update(); break;
case "delete": delete(); break;
default: unknownAction(action);
} 3
4. JSR 334 - Petites améliorations
du langage (le projet "Coin")
Type Inference sur la création d'instance
Generics (le losange):
◦ Map<Reference<Object>,Map<String,List<Object>>>
map = new HashMap<>(),
Gestion automatique des ressources
◦ Modèle avant Java 7
Res r = ... // 1. Création de la ressource
try {
// 2. Utilisation de la ressource
...
}
finally {
// 3. Fermeture de la ressource
r.close();
}
4
5. JSR 334 - Petites améliorations
du langage (le projet "Coin")
Exemple: copie de fichier:
try {
InputStream input = new FileInputStream(in.txt);
try {
OutputStream output = new FileOutputStream(out.txt);
try {
byte[] buf = new byte[8192];
int len;
while ( (len=input.read(buf)) >=0 )
output.write(buf, 0, len);
}
finally {
output.close();
}
}
finally {
input.close();
}
}
catch (IOException e) {
System.err.println("Une erreur est survenue lors de la copie");
e.printStrackTrace();
}
5
6. JSR 334 - Petites améliorations
du langage (le projet "Coin")
Exemple: copie de fichier avec le try with
resources
try (InputStream input = new FileInputStream(in.txt);
OutputStream output = new FileOutputStream(out.txt)) {
byte[] buf = new byte[8192];
int len;
while ( (len=input.read(buf)) >=0 )
output.write(buf, 0, len);
}
catch (IOException e)
{
System.err.println("Une erreur survenue lors de la
copie");
e.printStrackTrace(); 6
7. JSR 334 - Petites améliorations
du langage (le projet "Coin")
Multicatch : traiter plus d'une exception à la
fois
◦ Avant Java 7
try { ... }
catch(IOException e) { // traitement }
catch(SQLException e) { // traitement }
◦ Maintenant
try { ... }
catch(IOException | SQLException e) {
// traitement
} 7
8. JSR 334 - Petites améliorations
du langage (le projet "Coin")
Amélioration du rethrow
◦ Avant Java 7
public void method() throws Exception {
try {
// Remonte uniquement des IOException ou SQLException...
} catch (Exception e) {
// traitement
throw e; // throws Exception
}
}
◦ Maintenant
public void method() throws IOException, SQLException {
try {
// Remonte uniquement des IOException ou SQLException...
} catch (Exception e) {
// traitement
throw e; // IOException, SQLException (ou unchecked exception)
}
}
8
9. JSR 203 - NIO.2 : accès complet
aux systèmes de fichiers
Nouveau package java.nio.file en
remplacement de la classe java.io.File
java.nio.file.Path remplacera java.io.File
// Avec java.io.File
File file = new File("file.txt");
// Avec java.nio.file.Path :
Path path =
FileSystems.getDefault().getPath("file.txt");
Path path = Paths.get("file.txt");
Path path = Paths.get("/chemin/de/base", "sous-
répertoire", "encore/plusieurs/répertoires",
"file.txt");
Méthodes toPath() et toFile()
9
10. JSR 203 - NIO.2 : accès complet
aux systèmes de fichiers
Files : méthodes à tout faire
boolean exists = Files.exists(path);
boolean isDirectory = Files.isDirectory(path);
boolean isExecutable = Files.isExecutable(path);
boolean isHidden = Files.isHidden(path);
boolean isReadable = Files.isReadable(path);
boolean isRegularFile = Files.isRegularFile(path);
boolean isWritable = Files.isWritable(path);
long size = Files.size(path);
FileTime time = Files.getLastModifiedTime(path);
Files.delete(path);
10
11. JSR 203 - NIO.2 : accès complet
aux systèmes de fichiers
Copie et déplacement de fichiers
Files.copy(Paths.get("source.txt"),
Paths.get("dest.txt"));
Files.copy(Paths.get("source.txt"),
Paths.get("dest.txt"),
StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES );
Files.move(Paths.get("source.txt"),
Paths.get("dest.txt"));
Files.move(Paths.get("source.txt"),
Paths.get("dest.txt"),
StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES,
StandardCopyOption.ATOMIC_MOVE ); 11
13. JSR 203 - NIO.2 : accès complet
aux systèmes de fichiers
Ouverture de flux divers
// Ouverture en lecture :
try ( InputStream input = Files.newInputStream(path) ) { ... }
// Ouverture en écriture :
try ( OutputStream output = Files.newOutputStream(path) ) { ...
}
// Ouverture d'un Reader en lecture :
try ( BufferedReader reader = Files.newBufferedReader(path,
StandardCharsets.UTF_8) ) { ... }
// Ouverture d'un Writer en écriture :
try ( BufferedWriter writer = Files.newBufferedWriter(path,
StandardCharsets.UTF_8) ) { ... }
13
14. JSR 203 - NIO.2 : accès complet
aux systèmes de fichiers
DirectoryStream : lister les éléments d'un dossier
◦ Liste des fichiers/répertoires du répertoire courant :
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)){
for (Path path : stream) {
System.out.println(path);
}
}
◦ Utiliser un filtre
DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
@Override public boolean accept(Path entry) throws IOException {
return Files.isRegularFile(entry) && Files.size(entry) > 8192L;
}
};
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, filter)) {
for (Path path : stream) {
System.out.println(path);
}
}
14
15. JSR 203 - NIO.2 : accès complet
aux systèmes de fichiers
DirectoryStream : lister les éléments d'un dossier
◦ Utiliser un filtre
Path dir = Paths.get(); // current directory
try (
DirectoryStream<Path> stream =
Files.newDirectoryStream(dir, "*.txt"))
{
for (Path path : stream) {
System.out.println(path);
}
}
15
16. JSR 203 - NIO.2 : accès complet
aux systèmes de fichiers
FileVisitor : parcours d'une arborescence
Path dir = Paths.get(); // current directory
Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
@Override public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
System.out.println(file);
return FileVisitResult.CONTINUE;
}
});
◦ L'interface FileVisitor dispose de quatre méthodes:
visitFile() exécutée sur chaque fichier trouvé.
visitFileFailed() exécutée lorsqu'une erreur empêche l'accès au
fichier.
preVisitDirectory() appelée avant le parcours d'un répertoire.
postVisitDirectory() appelée une fois le répertoire parcouru.
16
17. JSR 203 - NIO.2 : accès complet
aux systèmes de fichiers
FileAttributeView : accès aux attributs
◦ Accès complet aux attributs via un système de
vue
BasicFileAttributeView (basic);
DosFileAttributeView (dos);
PosixFileAttributeView (posix);
FileOwnerAttributeView;
AclFileAttributeView (acl) ;
◦ Vérification du support
Files.getFileStore(path).supportsFileAttributeView(D
osFileAttributeView.class);
17
18. JSR 203 - NIO.2 : accès complet
aux systèmes de fichiers
FileAttributeView : accès aux attributs
◦ Accès en lecture/écriture aux attributs 'DOS' :
DosFileAttributeView dosView = Files.getFileAttributeView(path,
DosFileAttributeView.class);
dosView.setArchive(false);
DosFileAttributes attrs = dosView.readAttributes();
boolean a = attrs.isArchive();
18
19. JSR 203 - NIO.2 : accès complet
aux systèmes de fichiers
WatchService : détecter les changements dans un répertoire
// On crée un objet WatchService, chargé de surveiller le dossier :
try (WatchService watcher = path.getFileSystem().newWatchService()) {
// On y enregistre un répertoire, en lui associant certains types d'évènements :
path.register(watcher, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY); // (ou plusieurs)
// Puis on boucle pour récupérer tous les événements :
while (true) {
// On récupère une clef sur un événement (code bloquant)
WatchKey watchKey = watcher.take();
// On parcourt tous les évènements associés à cette clef :
for (WatchEvent<?> event: watchKey.pollEvents()) {
if (event.king()==StandardWatchEventKinds.OVERFLOW)
continue; // évènement perdu
System.out.println(event.kind() + " - " + event.context());
}
// On réinitialise la clef (très important pour recevoir les événements suivants)
if ( watchKey.reset() ==false ) {
// Le répertoire qu'on surveille n'existe plus ou n'est plus accessible break;
}
}
}
19
20. AWT/Swing
TransferHandler.setDragImage() pour définir une image à
afficher pendant le drag&drop.
JList<E> et JComboBox<E>.
Window.setType() + Window.Type contenant trois valeurs
possibles :
◦ NORMAL pour le comportement par défaut,
◦ POPUP pour les fenêtres temporaires,
◦ UTILITY pour les barres d'outils ou palettes.
BorderFactory s'enrichit de nouveaux types de bordures:
◦ createDashedBorder(),
◦ createLineBorder(),
◦ createLoweredSoftBevelBorder(),
◦ createRaisedSoftBevelBorder(),
◦ createSoftBevelBorder(),
◦ createStrokeBorder().
20
21. AWT/Swing
TRANSLUCENT - transparence globale
◦ setOpacity() pour définir le niveau d'opacité globale de la fenêtre
final JFrame frame = new JFrame();
frame.setUndecorated(true);
frame.add(new JLabel("Hello World !"));
frame.setOpacity(0.75F);
frame.getContentPane().setBackground(Color.BLACK);
frame.setVisible(true);
21
22. AWT/Swing
PERPIXEL_TRANSLUCENT - transparence pixel par pixel
◦ Permet de définir le niveau de transparence de chaque pixel de la
fenêtre.
◦ Utiliser la méthode setBackground()
final JFrame frame = new JFrame();
frame.setUndecorated(true);
frame.add(new JLabel("Hello World !"));
frame.setBackground(new Color(0F,0F,0F,0.75F));
frame.setVisible(true);
22
23. AWT/Swing
PERPIXEL_TRANSPARENT - forme non rectangulaire
◦ Possible de créer des fenêtres non rectangulaires.
◦ On utilisera pour cela la méthode setShape() avec la forme désirée
final JFrame frame = new JFrame();
frame.setUndecorated(true);
frame.setShape(new
RoundRectangle2D.Double(0,0,frame.getWidth(),frame.getHeight(),64,6
4));
frame.setBackground(Color.BLACK));
frame.setVisible(true);
23
26. Une nouvelle API pour la
manipulation des Date et heures
(JSR 310)
Obtenir l’heure courrante:
◦ Avec la classe Clock:
Clock clock = Clock.systemDefaultZone();
long time = clock.millis();
Obtenir la date et l’heure
LocalDate date = LocalDate.now();
System.out.printf("%s-%s-%s",
date.getYear(), date.getMonthValue(),
date.getDayOfMonth() );
26
27. Une nouvelle API pour la
manipulation des Date et heures
(JSR 310)
Effectuer les calculs sur les dates et
heures
Period p = Period.of(5, HOURS);
LocalTime time = LocalTime.now();
LocalTime newTime;
newTime = time.plus(5, HOURS);
newTime = time.plusHours(5);
newTime = time.plus(p);
27
28. Les expressions Lambda
Nouvelle syntaxe permettant d’écrire
un « morceau de code ».
Se décompose en deux partie séparés
par une flèche simple ( -> ),
◦ A gauche on retrouve la liste des
paramètres entre parenthèses.
◦ A droite un bloc de code entre accolades.
(Type arg1, Type arg2) -> { instruction1;
instruction2; return value; }
28
29. Les expressions Lambda
Exemple: l’implémentation d’un Comparator :
◦ Avant Java 8:
Comparator<String> ignoreCase = new Comparator<String>()
{
@Override
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
};
◦ Avec Java 8
Comparator<String> ignoreCase = (String s1, String s2) -> {
return s1.compareToIgnoreCase(s2);
};
◦ Peut être simplifié
Comparator<String> ignoreCase = (s1, s2) ->
s1.compareToIgnoreCase(s2);
29
30. Les expressions Lambda
Les références de méthode
◦ Permettent de référencer une méthode
quelconque
◦ Syntaxe composée de deux parties
séparées par le caractères dièse ( # )
La partie de gauche: au nom du type Java
dans lequel on va rechercher la méthode.
La partie de droite: nom de la méthode,
éventuellement suivi par le type de ses
paramètres.
Exemple:
Comparator<String> ignoreCase =
String#compareToIgnoreCase(String);
30
31. Les expressions Lambda
Les méthodes d’extension virtuelles
◦ Comblent les lacunes des interfaces Java:
Une interface publique d’une API ne peut plus
être modifiée sous peine de provoquer des
erreurs,
Cas des interfaces Collection, List ou Map
◦ Permettent de faire évoluer lesinterfaces
en limitant les incompatibilités.
1. Rajouter des méthodes dans l’interface
2. Indiquer une méthode static représentant
l’implémentation par défaut qui sera utilisée
31
32. Les expressions Lambda:
exemple
Trier une List
◦ Avant Java 8
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.compareToIgnoreCase(b);
}
});
◦ À partir de Java 8
Collections.sort(list, (String a, String b) ->
a.compareToIgnoreCase(b) );
list.sort(String#compareToIgnoreCase);
32
33. Les expressions Lambda:
exemple
Gestion des listeners Swing
◦ Avant Java 8
button.addActionListener(new
ActionListener() {
@Override
public void actionPerformed(ActionEvent
e) {
uneMethodAExecuterLorsDuClic(e);
}
});
◦ À partir de Java 8
button.addActionListener(this#uneMethodAExecuterL
orsDuClic);
33