SlideShare une entreprise Scribd logo
1  sur  73
Télécharger pour lire hors ligne
1
Abstract

• Revue rapide des I/O avec Java

• Vue d’ensemble de l’API NIO2

• Fournie avec Java SE 7

• Pour les développeurs que nous sommes


                                          2
Speaker
  http://www.jmdoudoux.fr

  @jmdoudoux

Auteur de 2 didacticiels
sous licence GNU FDL
  Développons en Java (2400 pages)
  Développons en Java avec Eclipse (600 pages)


Membre du         et du CA du

                                                 3
Agenda
• Les entrées / sorties avec Java

• NIO 2

• L’API Filesystem

• Lectures / écritures : API mises à jour

• Les E/S asynchrones (Asynchronous I/O)


                                            4
Les entrées / sorties
     avec Java


                        5
L’API java.io
• Depuis Java 1.0

• Flux : octets (Input/OutputStream)
  caractères (Reader/Writer)

• Fichiers, In Memory, Pipes, Sérialisation, …

• Filtre, Buffer, … (adaptateur, décorateur)

• La classe File

                                                 6
Les évolutions de la classe File
  Java 1.1 getCanonicalPath()
  Java 1.2 getParentFile(), getAbsoluteFile(), getCanonicalFile(),
           toURL(), isHidden(), createNewFile(), deleteOnExit(),
           listFiles(), setLastModified(), setReadOnly(), listRoots(),
           createTempFile(), compareTo()
  Java 1.4 création à partir d’une URI, toURI()
  Java 6    setWritable(), setReadable(), setExecutable(), canExecute(),
            getTotalSpace(), getFreeSpace(), getUsableSpace()



                                                                           7
Les défauts de java.io
• Le manque d’opérations basiques (copie, déplacement de
  fichiers, …)

• Ne fonctionne pas de la même manière sur toutes les
  plateformes

• Support limité des liens symboliques et des méta-données

• …


                                                             8
Les défauts de la classe File

• Encapsule le chemin et les opérations

• Gestion de certaines erreurs : certaines méthodes renvoient
  un booléen sans lever d’exceptions (delete() par exemple)

• Manque de performance de certaines méthodes

• …


                                                                9
New IO (NIO)
• Java 1.4

• utilisation de blocs et non de flux

• les canaux et sélecteurs (channels et selectors),

• les tampons (buffers),

• encodage et décodage de caractères (charset)


                                                      10
NIO 2



        11
NIO 2
Inclus dans Java SE 7

JSR 203 : ajout de fonctionnalités à l’API NIO

• Accès et manipulation du système de fichiers

• Mise à jour de l’API existante

• Canaux asynchrones (asynchronous channels)

• …
                                                 12
L’API FileSystem
• API moderne et complète

• Accès et gestion des systèmes de fichiers (fichiers,
  répertoires, liens symboliques, …)

• Support des méta-datas

• Parcours des répertoires, notifications

• Extensible

                                                         13
L’API FileSystem




                   14
Les chemins



              15
L’interface Path
• Immuable, encapsule tout ou partie du chemin d’un élément
  du système de fichiers

• Dépendant du système de fichier

• Chemin encapsulé absolu ou relatif existe ou non

•     Pas de gestion des extensions des fichiers



                                                              16
Obtenir une instance
      de type Path
Paths.get("monfichier.txt");
Paths.get("jm/AppData/Local/Temp/monfichier.txt");
Paths.get("C:/Users/jm/AppData/Local/Temp/monfichier.txt");
Paths.get("C:UsersjmAppDataLocalTempmonfichier.txt");

Paths.get(URI
  .create("file:///C:/Users/jm/AppData/Local/Temp/monfichier.txt"));

Paths.get(System.getProperty("java.io.tmpdir"), "monfichier.txt");

FileSystems.getDefault().getPath("logs", "access.log");

// Sur Unix
// Path path = Paths.get("/home/jm/temp/monfichier.txt");


                                                                       17
Path : gérer les éléments
Méthodes pour gérer les éléments hiérarchiques du chemin

     Path getFileName()       nom du dernier élément
     Path getParent()         chemin parent ou null
     Path getRoot()           racine du chemin ou null
     Path subPath(int, int)   sous chemin
     Path getName(int)        élément à l’index fourni
     int getNameCount()       nombre d’éléments dans le chemin


                                                                 18
Path : gérer les éléments
 toString()       =   C:UsersjmAppDataLocalTempmonfichier.txt
 getFileName()    =   monfichier.txt
 getRoot()        =   C:
 getName(0)       =   Users
 getNameCount()   =   6
 getParent()      =   C:UsersjmAppDataLocalTemp
 subpath(0,3)     =   UsersjmAppData

 toString()       =   jmAppDataLocalTempmonfichier.txt
 getFileName()    =   monfichier.txt
 getRoot()        =   null
 getName(0)       =   jm
 getNameCount()   =   5
 getParent()      =   jmAppDataLocalTemp
 subpath(0,3)     =   jmAppDataLocal



                                                                      19
Path : manipuler le chemin
• Path normalize() :
  supprime les éléments redondants (par exemple . et ..),
  purement syntaxique

• Path resolve(Path) :
  combiner deux chemins

• Path relativize(Path) :
  chemin relatif entre le chemin et celui fourni

                                                            20
Manipuler un Path
path = Paths.get("C:/Users/admin/
./../jm/AppData/Local/Temp/./monfichier.txt");
System.out.println("normalize()   = " + path.normalize());

normalize()   = C:UsersjmAppDataLocalTempmonfichier.txt

Path path = Paths.get("C:/Users/jm/AppData/Local/");
Path nouveauPath = path.resolve("Temp/monfichier.txt");
System.out.println(nouveauPath);
nouveauPath = path.resolve("C:/Temp");
System.out.println(nouveauPath);

C:UsersjmAppDataLocalTempmonfichier.txt
C:Temp




                                                                21
Path : comparer des chemins
Plusieurs méthodes pour comparer les chemins

• int compareTo(Path other)

• boolean endsWith(Path other)
  boolean endsWith(String other)

• boolean startsWith(Path other)
  boolean startsWith(String other)

• …
                                               22
Path : convertir des chemins
Plusieurs méthodes pour convertir les chemins

• Path toAbsolutePath() :
  retourner le chemin absolu du chemin

• Path toRealPath(LinkOption…) :
  retourner le chemin physique avec résolution des liens
  symboliques selon les options fournies


                                                           23
Path : intégration dans
              l’existant
• Path File.toPath()

• File Path.toFile()

• URI Path.toUri() : retourner le chemin sous la forme d’une
  URI


                                                               24
La manipulation
   des fichiers
et des répertoires

                     25
Glob
• Pattern à appliquer sur un élément du système de fichiers

• Sous ensemble des expressions régulières :
  * ** ? [] {} 
                *.java         éléments dont le nom fini par .java
 Exemples :     ???            éléments dont le nom est composé de trois
                               alphanumériques
                A*.java        éléments dont le nom commence par un a et se
                               termine par .java
                *[0-9]*        éléments dont le nom contient au moins un
                               chiffre
                *.{htm,html}   éléments dont le nom se termine par htm ou html


                                                                                 26
Glob
final Path file1 = Paths.get("C:/java/test/test.java");
final Path file2 = Paths.get("C:/java/test/test.txt");
final Path file3 = file1.getFileName();

String pattern = "glob:**/*.{java,class}";
System.out.println("Pattern " + pattern);

PathMatcher matcher = FileSystems.getDefault().getPathMatcher(pattern);

System.out.println(file1 + " " + matcher.matches(file1));
System.out.format("%-22s %bn", file2, matcher.matches(file2));
System.out.format("%-22s %bn", file3, matcher.matches(file3));

System.out.println("");

pattern = "glob:*.java";
System.out.println("Pattern " + pattern);
matcher = FileSystems.getDefault().getPathMatcher(pattern);
System.out.println(file1 + " " + matcher.matches(file1));
System.out.format("%-22s %bn", file3, matcher.matches(file3));



                                                                          27
La classe Files
• Création : createDirectory(), createFile(), createLink(),
  createSymbolicLink(), createTempFile(), createTempDirectory(), …

• Manipulation : delete(), move(), copy(), …

• Type d’un élément : isRegularFile(), isDirectory(),
  probeContentType(), …

• Méta-données et permissions : getAttributes(),
  getPosixFilePermissions(), isReadable(), isWriteable(), size(),
  getFileAttributeView(), …
                                                                     28
Copier un fichier
      Path source = Paths.get("c:/java/fichier.txt");
      Path cible = Paths.get("c:/java/fichier_copie.txt");
      try {
        Files.copy(source, cible, REPLACE_EXISTING,
      COPY_ATTRIBUTES);

        // java.lang.UnsupportedOperationException
        // Files.move(source, cible, REPLACE_EXISTING,
        // COPY_ATTRIBUTES, ATOMIC_MOVE);
      } catch(IOException ioe) {
        // traitement en cas d’erreur
      }



Copie d’un répertoire

                                                             29
Déplacer ou renommer
          un fichier
      Path source = Paths.get("c:/java/fichier.txt");
      Path cible = Paths.get("c:/java/fichier_copie.txt");
      try {
        Files.copy(source, cible, REPLACE_EXISTING,
      COPY_ATTRIBUTES);

        // java.lang.UnsupportedOperationException
        // Files.move(source, cible, REPLACE_EXISTING,
        // COPY_ATTRIBUTES, ATOMIC_MOVE);
      } catch(IOException ioe) {
        // traitement en cas d’erreur
      }



Déplacement d’un répertoire

                                                             30
Supprimer un fichier
     Path path = Paths.get("C:/java/test/monfichier_copie.txt");
         try {
           Files.delete(path);
         } catch (NoSuchFileException nsfee) {
           // traitement en cas d’erreur
         } catch (DirectoryNotEmptyException dnee) {
           // traitement en cas d’erreur
         } catch (IOException ioe) {
           // traitement en cas d’erreur
         }

     Path path = Paths.get("C:/java/test/monfichier_copie.txt");
         try {
           Files.deleteIfExists(path);
         } catch (DirectoryNotEmptyException dnee) {
           // traitement en cas d’erreur
         } catch (IOException ioe) {
           // traitement en cas d’erreur
         }


Suppression d’un répertoire vide

                                                                   31
Les liens symboliques
• Support optionnel selon le FS (Unix)

• Suivis par défaut avec quelques exceptions :
  delete(), move(), walkFileTree()

• Files.isSameFile()

• Files.isSymbolicLink()

• Files.readSymbolicLink()

                                                 32
Créer un lien /
  un lien symbolique
Path lien = Paths.get("C:/java/test/monlien");
Path cible = Paths.get("C:/java/test/monfichier.txt");
Files.createLink(lien, cible);

if (Files.isSameFile(lien, cible)) {
  System.out.println("Identique");
} else {
  System.out.println("Non identique");
}


Path lien = Paths.get("/home/jm/monlien");
Path cible = Paths.get("/home/jm/monfichier.txt");
Files.createSymbolicLink(lien, cible);

if (Files.isSameFile(lien, cible)) {
  System.out.println("Identique");
} else {
  System.out.println("Non identique");
}

                                                         33
Les événements
sur un répertoire


                    34
L’interface WatchService
• Notifications de changements dans un répertoire

• Abonnement à des événements lors de la création,
  modification, suppression de fichiers

• Evite d’avoir à écrire du code de type pooling ou une API
  open source (JNotify ou JPathWatch)

• Non récursif, performant


                                                              35
L’utilisation de WatchService
Mise en œuvre particulière :

• Instanciation avec FileSystem.newWatchService()

• Enregistrement avec Path.register()
  (Path implémente Watchable)

• Obtenir et traiter les événements



                                                    36
WatchService
WatchService watcher = FileSystems.getDefault().newWatchService();
Path dir = Paths.get("c:/java/test");
WatchKey key = dir.register(watcher, ENTRY_CREATE)

for (;;) {
  try {
    key = watcher.take();
  } catch (InterruptedException ex) {
    ex.printStackTrace();
  }

    for (WatchEvent<?> event : key.pollEvents()) {
      if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
        Path name = (Path) event.context();
        System.out.format(event.kind() + " " + "%s created", name);
      }
    }
    key.reset();
}



                                                                      37
Les méta-données



                   38
Les attributs
• Gestion complète des attributs qui sont dépendants du
  système sous jacent

• Taille, type d’éléments, caché, …

• Attributs communs (BasicFileAttributes) et spécifiques
  (DosFileAttributes, PosixFileAttributes)

• Méthodes de la classe Files


                                                           39
Les attributs DOS

Path fichier = Paths.get("c:/java/test/test.txt");
FileTime now =           FileTime.fromMillis(System.currentTimeMillis());
Files.setLastModifiedTime(fichier, now);
Files.setAttribute(fichier, "dos:hidden", true);

DosFileAttributes attr = Files.readAttributes(fichier, DosFileAttributes.class);
System.out.println(attr.isReadOnly());
System.out.println(attr.isHidden());
System.out.println(attr.isRegularFile());
System.out.println(attr.isSystem());
System.out.println(attr.lastModifiedTime());




                                                                                   40
Les attributs Posix
• Énumération PosixFilePermission

• PosixFilePermissions : helper

• FileAttribute : encapsule les attributs

       Attention aux restrictions de droits via umask
       ou via le répertoire parent


                                                        41
Les attributs Posix
Path fichier = Paths.get("/home/jm/test.txt");

PosixFileAttributes attrs = Files.readAttributes(fichier, PosixFileAttributes.class);
UserPrincipal owner = attrs.owner();
GroupPrincipal group = attrs.group();
System.out.println(owner);
System.out.println(group);

Path fichier = Paths.get("/home/jm/test.txt");
Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-rw-rw-");
FileAttribute<Set<PosixFilePermission>> attr =
PosixFilePermissions.asFileAttribute(perms);
Files.createFile(fichier, attr);




                                                                                        42
Les attributs avec les vues
• Les vues permettent d’obtenir les attributs d’un même
  groupe en bloc -> performance

• Les vues sont spécialisées

• Readonly ou mutable

• Création possible de vues personnalisées



                                                          43
Les différentes vues
AttributeView
  FileAttributeView
    BasicFileAttributeView
      DosFileAttributeView
      PosixFileAttributeView
    FileOwnerAttributeView
      AclFileAttributeView
      PosixFileAttributeView
    UserDefinedFileAttributeView
  FileStoreAttributeView
                                   44
BasicFileAttributView

Path fichier = Paths.get("c:/java/test.txt");

BasicFileAttributeView view = Files.getFileAttributeView(fichier,
            BasicFileAttributeView.class);

BasicFileAttributes attributes = view.readAttributes();
FileTime creationTime = attributes.creationTime();
FileTime lastAccessTime = attributes.lastAccessTime();
boolean isRegularFile = attributes.isRegularFile();




                                                                    45
La classe FileStore
• Encapsule un système de stockage : un disque dur, une
  partition, …

• Obtenir des informations

• Connaître les AttributViews supportées

• FileStore Files.getFileStore(Path)



                                                          46
FileStore
for (final FileStore store : FileSystems.getDefault().getFileStores()) {
  System.out.println(store);
  System.out.println("nom : " + store.name() + ", type : " + fileStore.type());
  System.out.println("Support BasicFileAttribute : "
      + store.supportsFileAttributeView(BasicFileAttributeView.class));
  System.out.println("Support DosFileAttribute : "
      + store.supportsFileAttributeView(DosFileAttributeView.class));
  System.out.println("Support PosixFileAttribute : "
      + store.supportsFileAttributeView(PosixFileAttributeView.class));
}

final int UN_GIGA = 1024 * 1024 * 1024;

for (final FileStore store : FileSystems.getDefault().getFileStores()) {
  try {
    final long total = store.getTotalSpace() / UN_GIGA;
    final long used = (store.getTotalSpace() - store.getUnallocatedSpace())
      / UN_GIGA;
    final long avail = store.getUsableSpace() / UN_GIGA;
    System.out.format("%-20s total=%5dGo used=%5dGo avail=%5dGo%n",
      store, total, used, avail);
  } catch (final IOException e) {
    e.printStackTrace();
  }
}
                                                                                  47
La classe FileSystem

• Encapsule un système de fichiers

• Fabrique pour des objets de l’API

• Obtenir l’instance du système par défaut

  FileSystem fs = FilesSystems.getDefault();




                                               48
La classe FileSystem
• Extensible

• Peut permettre d’offrir différentes vues d’un système de
  fichiers
  (cacher des fichiers sensibles, accès en lecture seule, …)

• N’a pas besoin d’être lié à un « vrai » système de fichiers




                                                                49
Les providers de FileSystem
• Invoquer une fabrique (FileSystems) pour obtenir une
  implémentation spécifique

• Utiliser ou de créer des fournisseurs de FileSystem

  class MonFileSystem extends FileSystem;

• java.nio.file.spi.FileSystemProvider



                                                         50
Un provider pour les zip

• Permet de traiter le contenu d’un zip comme un système de
  fichiers

• Facilite l’utilisation des archives de type zip

• Fourni en standard



                                                              51
Afficher un fichier
            d’un zip
Path jarfile = Paths.get("c:/java/archive.jar");

FileSystem fs = FileSystems.newFileSystem(jarfile, null);
Path mf = fs.getPath("META-INF", "MANIFEST.MF");

try (BufferedReader readBuffer =
Files.newBufferedReader(mf, Charset.defaultCharset())) {
  String ligne = "";
  while ((ligne = readBuffer.readLine()) != null) {
    System.out.println(ligne);
  }
}



                                                            52
Extraire et ajouter
      un fichier à un zip
Path jarfile = Paths.get("c:/java/archive.jar");

FileSystem fs = FileSystems.newFileSystem(jarfile, null);

Path cible = Paths.get("c:/java/MANIFEST.MF");
Files.deleteIfExists(cible);

// extaire un élément de l'archive
Files.copy(fs.getPath("/META-INF/MANIFEST.MF"), cible);




                                                            53
Parcourir le contenu
  d’un répertoire
  DirectoryStream et WalkFileTree




                                    54
L’interface DirectoryStream
• Itération sur le contenu d’un répertoire

• Performance sur de gros répertoires, consomme moins de
  ressources

• Possibilité d’appliquer un filtre avec un glob

•    Invoquer la méthode close() après utilisation



                                                           55
DirectoryStream

Path dir = Paths.get("C:/java/projets");
try (DirectoryStream<Path> stream =
           Files.newDirectoryStream(dir, "*.java")) {
  for (Path entry : stream) {
    System.out.println(entry.getFileName());
  }
}




                                                        56
WalkFileTree avec FileVisitor
• Parcourir une arborescence en utilisant le design pattern
  Visiteur (opérations récursives)

• Files.walkFileTree()

• FileVisitor invoqué
  sur chaque fichier (visitFile() / visitFileFailed())
  sur chaque répertoire (preVisitDirectory()/postVisitDirectory())


                                                                     57
WalkFileTree avec FileVisitor
• SimpleFileVisitor : contrôle du parcours par la valeur de
  retour (CONTINUE, SKIP_SUBTREE, TERMINATE, …)

• Liens symboliques non suivis par défaut
  (FileVisitOption.FOLLOW_LINKS)

• détection des références circulaires (méthode
  visitFileFailed() avec FileSystemLoopException)


                                                              58
WalkFileTree
Path dir = Paths.get("C:/java/projets");
Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {

  public FileVisitResult visitFile(Path file,
          BasicFileAttributes attrs) throws IOException {
    String nom = file.getFileName().toString();
    if (nom.endsWith(".java")) {
      System.out.println("Fichier : " + nom);
    }
    return FileVisitResult.CONTINUE;
  }

  public FileVisitResult preVisitDirectory(Path dir,
          BasicFileAttributes attrs) throws IOException {
    System.out.println("Repertoire : " + dir);
    return FileVisitResult.CONTINUE;
  }
});

                                                            59
Lectures / écritures
Mises à jour de l’API


                        60
Gestion des IO avec Java
      IO                   NIO                      NIO 2
Java 1.0           Java 1.4 (JSR 51)     Java 7 (JSR 203)
Synchrone          Synchrone             ASynchrone
Bloquant           Non bloquant          Non bloquant
File               FileChannel           Path
InputStream        SocketChannel         AsynchronousFileChannel
OutputStream       ServerSocketChannel   AsynchronousByteChannel
Reader             (Charset, Selector,   AsynchronousSocketChannel
Writer             ByteBuffer)           AsynchronousServerSocketChannel
Socket                                   SeekableByteChannel
RandomAccessFile

                                                                           61
Les méthodes de la classe Files


Besoins                Besoins
simples                avancés




                                   62
Lire et écrire tout le
 contenu d’un fichier
byte[] bytes = Files.readAllBytes(path);

List<String> lignes = Files.readAllLines(path,
                            Charset.defaultCharset());

Files.write(path, bytes);

Files.write(path, lignes, Charset.defaultCharset());




                                                         63
Ecrire dans un fichier
        texte
final Path fichier =
Paths.get("c:/java/test/donnees.txt");
  final Charset charset = Charset.forName("UTF8");
  final String contenu = "Prix 10€";

  Files.deleteIfExists(fichier);

  try (BufferedWriter writer =
Files.newBufferedWriter(fichier, charset)) {
    writer.write(contenu, 0, contenu.length());
  } catch (IOException ioe) {
    // traitement de l'erreur
  }
}


                                                     64
L’interface SeekableByteChannel
 • ByteChannel qui gère une position

 • Channel équivalent à RandomAccessFile

 • Files.newSeekableByteChannel()

 • CREATE, CREATE_NEW, READ, WRITE, APPEND,
   TRUNCATE_EXISTING, NOFOLLOW_LINKS, SYNC,
   DSYNC, …


                                              65
SeekableByteChannel
ByteBuffer donneesBonjour =
ByteBuffer.wrap("Bonjour".getBytes());
ByteBuffer donneesBonsoir =
ByteBuffer.wrap("Bonsoir".getBytes());
Path path = Paths.get("C:/java/test/fichier.bin");
Files.deleteIfExists(path);

try (FileChannel fileChannel = FileChannel.open(path,
StandardOpenOption.CREATE, StandardOpenOption.WRITE,
StandardOpenOption.SYNC)) {
  fileChannel.position(100);
  fileChannel.write(donneesBonjour);
}

try (SeekableByteChannel sbc = Files.newByteChannel(path,
StandardOpenOption.WRITE, StandardOpenOption.SYNC)) {
  sbc.position(200);
  sbc.write(donneesBonsoir);
}

                                                            66
Lectures / écritures
   asynchrones


                       67
Les canaux asynchrones
• Channel : opérations non bloquantes (lecture, écriture)
• AsynchronousChannel : opérations asynchrones (exécutées
  dans un thread)

• Contrôle des opérations après leur initialisation via deux
  solutions :
  java.util.concurrent.Future
  java.nio.channels.CompletionHandler


                                                               68
Canaux async avec
         CompletionHandler
• Callback qui sera invoqué lorsque l’opération se termine
  (bien ou mal)

• Paramétré avec le type de résultat et un objet en
  attachement (contexte qui peut être null)
 interface CompletionHandler<V, A> {
   void completed(V result, A attachment);
   void failed(Throwable t, A attachment);
 }

                                                             69
Canaux async : les groupes

• Les CompletionHandler sont invoqués par les threads

• AsynchronousChannelGroup encapsule un pool de threads

• FixedThreadPool

• CachedThreadPool


                                                          70
Conclusion


             71
Conclusion
• NIO2 apporte de nombreuses fonctionnalités, attendues
  depuis longtemps

• Implémentation de bas niveau de certaines, mais utilisables
  dans différents contextes

• Pour allez plus loin : Javadoc, Java tutorials (Basic I/O),
  exemples du JDK (sample/nio/file)


                                                                72
73

Contenu connexe

Tendances

Anniversaire Paris JUG - Deja 10 ans - retour vers le futur avec JMX
Anniversaire Paris JUG -  Deja 10 ans - retour vers le futur avec JMXAnniversaire Paris JUG -  Deja 10 ans - retour vers le futur avec JMX
Anniversaire Paris JUG - Deja 10 ans - retour vers le futur avec JMXJean-Michel Doudoux
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016Antoine Rey
 
Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Jérôme Tamborini
 
Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Jean-Michel Doudoux
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Antoine Rey
 
Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring BatchAntoine Rey
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchronesAbdoulaye Dieng
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Jean-Michel Doudoux
 
Cpp2 : classes et objets
Cpp2 : classes et objetsCpp2 : classes et objets
Cpp2 : classes et objetsAbdoulaye Dieng
 
Procédure de configuration et préparation de l’environnement sous windows
Procédure de configuration et préparation de l’environnement sous windowsProcédure de configuration et préparation de l’environnement sous windows
Procédure de configuration et préparation de l’environnement sous windowsAddi Ait-Mlouk
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScriptAbdoulaye Dieng
 
Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrenteFranck SIMON
 

Tendances (20)

Anniversaire Paris JUG - Deja 10 ans - retour vers le futur avec JMX
Anniversaire Paris JUG -  Deja 10 ans - retour vers le futur avec JMXAnniversaire Paris JUG -  Deja 10 ans - retour vers le futur avec JMX
Anniversaire Paris JUG - Deja 10 ans - retour vers le futur avec JMX
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
 
Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)
 
Programmation Java
Programmation JavaProgrammation Java
Programmation Java
 
Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018
 
JAVA 8
JAVA 8JAVA 8
JAVA 8
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?
 
Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring Batch
 
Hibernate jpa
Hibernate jpaHibernate jpa
Hibernate jpa
 
Requêtes HTTP synchrones et asynchrones
Requêtes HTTPsynchrones et asynchronesRequêtes HTTPsynchrones et asynchrones
Requêtes HTTP synchrones et asynchrones
 
Java 9 modules
Java 9    modulesJava 9    modules
Java 9 modules
 
Introduction à Python
Introduction à PythonIntroduction à Python
Introduction à Python
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
 
Cpp2 : classes et objets
Cpp2 : classes et objetsCpp2 : classes et objets
Cpp2 : classes et objets
 
Introduction à Symfony
Introduction à SymfonyIntroduction à Symfony
Introduction à Symfony
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
Procédure de configuration et préparation de l’environnement sous windows
Procédure de configuration et préparation de l’environnement sous windowsProcédure de configuration et préparation de l’environnement sous windows
Procédure de configuration et préparation de l’environnement sous windows
 
Introduction à JavaScript
Introduction à JavaScriptIntroduction à JavaScript
Introduction à JavaScript
 
Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrente
 

En vedette

Ccb7 常用操作(全)
Ccb7 常用操作(全)Ccb7 常用操作(全)
Ccb7 常用操作(全)Jarold Chen
 
The 3-Minute Guide For Heal PHerniated Disc Pain
The 3-Minute Guide For Heal  PHerniated Disc PainThe 3-Minute Guide For Heal  PHerniated Disc Pain
The 3-Minute Guide For Heal PHerniated Disc Painpediaforpain
 
1pp infogreport cs4
1pp infogreport cs41pp infogreport cs4
1pp infogreport cs4Philips
 
financial figures Kinepolis Group
financial figures Kinepolis Groupfinancial figures Kinepolis Group
financial figures Kinepolis GroupSander Vandenberghe
 
编程语言的历史
编程语言的历史编程语言的历史
编程语言的历史bradcao2010
 
Person centered care_web
Person centered care_webPerson centered care_web
Person centered care_webwef
 
A presentation on job planning job manuals,
A presentation on job planning job manuals,A presentation on job planning job manuals,
A presentation on job planning job manuals,SreeKrishna1
 

En vedette (8)

Ccb7 常用操作(全)
Ccb7 常用操作(全)Ccb7 常用操作(全)
Ccb7 常用操作(全)
 
Bildhistoria 2
Bildhistoria 2Bildhistoria 2
Bildhistoria 2
 
The 3-Minute Guide For Heal PHerniated Disc Pain
The 3-Minute Guide For Heal  PHerniated Disc PainThe 3-Minute Guide For Heal  PHerniated Disc Pain
The 3-Minute Guide For Heal PHerniated Disc Pain
 
1pp infogreport cs4
1pp infogreport cs41pp infogreport cs4
1pp infogreport cs4
 
financial figures Kinepolis Group
financial figures Kinepolis Groupfinancial figures Kinepolis Group
financial figures Kinepolis Group
 
编程语言的历史
编程语言的历史编程语言的历史
编程语言的历史
 
Person centered care_web
Person centered care_webPerson centered care_web
Person centered care_web
 
A presentation on job planning job manuals,
A presentation on job planning job manuals,A presentation on job planning job manuals,
A presentation on job planning job manuals,
 

Similaire à "Input/Ouput, 16 ans après" à Devoxx France 2012

Les nouveautés de java 7 et les promesses
Les nouveautés de java 7  et les promessesLes nouveautés de java 7  et les promesses
Les nouveautés de java 7 et les promessesEric Toguem
 
Java 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambdaJava 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambdaCh'ti JUG
 
Pres_ java_Fichier_Suite_cour sur les fichier en java.pdf
Pres_ java_Fichier_Suite_cour sur les fichier en java.pdfPres_ java_Fichier_Suite_cour sur les fichier en java.pdf
Pres_ java_Fichier_Suite_cour sur les fichier en java.pdfHERGALYOUSSEF
 
Cours de C++, en français, 2002 - Cours 3.4
Cours de C++, en français, 2002 - Cours 3.4Cours de C++, en français, 2002 - Cours 3.4
Cours de C++, en français, 2002 - Cours 3.4Laurent BUNIET
 
Le système d&rsquo;E/S en Java
Le système d&rsquo;E/S en JavaLe système d&rsquo;E/S en Java
Le système d&rsquo;E/S en JavaKorteby Farouk
 
Nouveautés dans TYPO3 CMS 6.0
Nouveautés dans TYPO3 CMS 6.0Nouveautés dans TYPO3 CMS 6.0
Nouveautés dans TYPO3 CMS 6.0Idéative
 
Entrees sorties
Entrees sortiesEntrees sorties
Entrees sortiesyazidds2
 
code4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABEScode4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABESABES
 
Programmation Android - 09 - Web services
Programmation Android - 09 - Web servicesProgrammation Android - 09 - Web services
Programmation Android - 09 - Web servicesYann Caron
 
log file sous Netbeans et J2ME
log file sous Netbeans et J2MElog file sous Netbeans et J2ME
log file sous Netbeans et J2MEZied
 
POO Licence L2 Partie I.pdf
POO Licence L2 Partie I.pdfPOO Licence L2 Partie I.pdf
POO Licence L2 Partie I.pdfLarbaSAWADOGO2
 
MarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presqueMarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presqueAlexis Hassler
 
Langage Java et Programmation Orienté Objet
Langage Java et Programmation Orienté ObjetLangage Java et Programmation Orienté Objet
Langage Java et Programmation Orienté ObjetMohammed Jaafar
 
Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...
Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...
Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...Normandie Web Xperts
 
Play Framework
Play FrameworkPlay Framework
Play FrameworkArmaklan
 

Similaire à "Input/Ouput, 16 ans après" à Devoxx France 2012 (20)

NIO 2
NIO 2NIO 2
NIO 2
 
Les nouveautés de java 7 et les promesses
Les nouveautés de java 7  et les promessesLes nouveautés de java 7  et les promesses
Les nouveautés de java 7 et les promesses
 
Java 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambdaJava 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambda
 
Introduction à Laravel
Introduction à LaravelIntroduction à Laravel
Introduction à Laravel
 
Présentation nouveauté java7
Présentation nouveauté java7Présentation nouveauté java7
Présentation nouveauté java7
 
Pres_ java_Fichier_Suite_cour sur les fichier en java.pdf
Pres_ java_Fichier_Suite_cour sur les fichier en java.pdfPres_ java_Fichier_Suite_cour sur les fichier en java.pdf
Pres_ java_Fichier_Suite_cour sur les fichier en java.pdf
 
Cours de C++, en français, 2002 - Cours 3.4
Cours de C++, en français, 2002 - Cours 3.4Cours de C++, en français, 2002 - Cours 3.4
Cours de C++, en français, 2002 - Cours 3.4
 
Le système d&rsquo;E/S en Java
Le système d&rsquo;E/S en JavaLe système d&rsquo;E/S en Java
Le système d&rsquo;E/S en Java
 
Nouveautés dans TYPO3 CMS 6.0
Nouveautés dans TYPO3 CMS 6.0Nouveautés dans TYPO3 CMS 6.0
Nouveautés dans TYPO3 CMS 6.0
 
Entrees sorties
Entrees sortiesEntrees sorties
Entrees sorties
 
code4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABEScode4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABES
 
Programmation Android - 09 - Web services
Programmation Android - 09 - Web servicesProgrammation Android - 09 - Web services
Programmation Android - 09 - Web services
 
log file sous Netbeans et J2ME
log file sous Netbeans et J2MElog file sous Netbeans et J2ME
log file sous Netbeans et J2ME
 
POO Licence L2 Partie I.pdf
POO Licence L2 Partie I.pdfPOO Licence L2 Partie I.pdf
POO Licence L2 Partie I.pdf
 
SdE - Introduction
SdE - IntroductionSdE - Introduction
SdE - Introduction
 
Tp n 3 linux
Tp n 3 linuxTp n 3 linux
Tp n 3 linux
 
MarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presqueMarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presque
 
Langage Java et Programmation Orienté Objet
Langage Java et Programmation Orienté ObjetLangage Java et Programmation Orienté Objet
Langage Java et Programmation Orienté Objet
 
Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...
Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...
Conférence #nwxtech5 : Django, du framework pour les perfectionnistes au pony...
 
Play Framework
Play FrameworkPlay Framework
Play Framework
 

Plus de Jean-Michel Doudoux

Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdfLes nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdfJean-Michel Doudoux
 
Les nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdfLes nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdfJean-Michel Doudoux
 
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023Jean-Michel Doudoux
 
En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023Jean-Michel Doudoux
 
Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20Jean-Michel Doudoux
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Jean-Michel Doudoux
 
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDKVoxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDKJean-Michel Doudoux
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfJean-Michel Doudoux
 

Plus de Jean-Michel Doudoux (8)

Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdfLes nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
 
Les nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdfLes nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdf
 
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
 
En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023
 
Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
 
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDKVoxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
 
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
 

"Input/Ouput, 16 ans après" à Devoxx France 2012

  • 1. 1
  • 2. Abstract • Revue rapide des I/O avec Java • Vue d’ensemble de l’API NIO2 • Fournie avec Java SE 7 • Pour les développeurs que nous sommes 2
  • 3. Speaker http://www.jmdoudoux.fr @jmdoudoux Auteur de 2 didacticiels sous licence GNU FDL Développons en Java (2400 pages) Développons en Java avec Eclipse (600 pages) Membre du et du CA du 3
  • 4. Agenda • Les entrées / sorties avec Java • NIO 2 • L’API Filesystem • Lectures / écritures : API mises à jour • Les E/S asynchrones (Asynchronous I/O) 4
  • 5. Les entrées / sorties avec Java 5
  • 6. L’API java.io • Depuis Java 1.0 • Flux : octets (Input/OutputStream) caractères (Reader/Writer) • Fichiers, In Memory, Pipes, Sérialisation, … • Filtre, Buffer, … (adaptateur, décorateur) • La classe File 6
  • 7. Les évolutions de la classe File Java 1.1 getCanonicalPath() Java 1.2 getParentFile(), getAbsoluteFile(), getCanonicalFile(), toURL(), isHidden(), createNewFile(), deleteOnExit(), listFiles(), setLastModified(), setReadOnly(), listRoots(), createTempFile(), compareTo() Java 1.4 création à partir d’une URI, toURI() Java 6 setWritable(), setReadable(), setExecutable(), canExecute(), getTotalSpace(), getFreeSpace(), getUsableSpace() 7
  • 8. Les défauts de java.io • Le manque d’opérations basiques (copie, déplacement de fichiers, …) • Ne fonctionne pas de la même manière sur toutes les plateformes • Support limité des liens symboliques et des méta-données • … 8
  • 9. Les défauts de la classe File • Encapsule le chemin et les opérations • Gestion de certaines erreurs : certaines méthodes renvoient un booléen sans lever d’exceptions (delete() par exemple) • Manque de performance de certaines méthodes • … 9
  • 10. New IO (NIO) • Java 1.4 • utilisation de blocs et non de flux • les canaux et sélecteurs (channels et selectors), • les tampons (buffers), • encodage et décodage de caractères (charset) 10
  • 11. NIO 2 11
  • 12. NIO 2 Inclus dans Java SE 7 JSR 203 : ajout de fonctionnalités à l’API NIO • Accès et manipulation du système de fichiers • Mise à jour de l’API existante • Canaux asynchrones (asynchronous channels) • … 12
  • 13. L’API FileSystem • API moderne et complète • Accès et gestion des systèmes de fichiers (fichiers, répertoires, liens symboliques, …) • Support des méta-datas • Parcours des répertoires, notifications • Extensible 13
  • 16. L’interface Path • Immuable, encapsule tout ou partie du chemin d’un élément du système de fichiers • Dépendant du système de fichier • Chemin encapsulé absolu ou relatif existe ou non • Pas de gestion des extensions des fichiers 16
  • 17. Obtenir une instance de type Path Paths.get("monfichier.txt"); Paths.get("jm/AppData/Local/Temp/monfichier.txt"); Paths.get("C:/Users/jm/AppData/Local/Temp/monfichier.txt"); Paths.get("C:UsersjmAppDataLocalTempmonfichier.txt"); Paths.get(URI .create("file:///C:/Users/jm/AppData/Local/Temp/monfichier.txt")); Paths.get(System.getProperty("java.io.tmpdir"), "monfichier.txt"); FileSystems.getDefault().getPath("logs", "access.log"); // Sur Unix // Path path = Paths.get("/home/jm/temp/monfichier.txt"); 17
  • 18. Path : gérer les éléments Méthodes pour gérer les éléments hiérarchiques du chemin Path getFileName() nom du dernier élément Path getParent() chemin parent ou null Path getRoot() racine du chemin ou null Path subPath(int, int) sous chemin Path getName(int) élément à l’index fourni int getNameCount() nombre d’éléments dans le chemin 18
  • 19. Path : gérer les éléments toString() = C:UsersjmAppDataLocalTempmonfichier.txt getFileName() = monfichier.txt getRoot() = C: getName(0) = Users getNameCount() = 6 getParent() = C:UsersjmAppDataLocalTemp subpath(0,3) = UsersjmAppData toString() = jmAppDataLocalTempmonfichier.txt getFileName() = monfichier.txt getRoot() = null getName(0) = jm getNameCount() = 5 getParent() = jmAppDataLocalTemp subpath(0,3) = jmAppDataLocal 19
  • 20. Path : manipuler le chemin • Path normalize() : supprime les éléments redondants (par exemple . et ..), purement syntaxique • Path resolve(Path) : combiner deux chemins • Path relativize(Path) : chemin relatif entre le chemin et celui fourni 20
  • 21. Manipuler un Path path = Paths.get("C:/Users/admin/ ./../jm/AppData/Local/Temp/./monfichier.txt"); System.out.println("normalize() = " + path.normalize()); normalize() = C:UsersjmAppDataLocalTempmonfichier.txt Path path = Paths.get("C:/Users/jm/AppData/Local/"); Path nouveauPath = path.resolve("Temp/monfichier.txt"); System.out.println(nouveauPath); nouveauPath = path.resolve("C:/Temp"); System.out.println(nouveauPath); C:UsersjmAppDataLocalTempmonfichier.txt C:Temp 21
  • 22. Path : comparer des chemins Plusieurs méthodes pour comparer les chemins • int compareTo(Path other) • boolean endsWith(Path other) boolean endsWith(String other) • boolean startsWith(Path other) boolean startsWith(String other) • … 22
  • 23. Path : convertir des chemins Plusieurs méthodes pour convertir les chemins • Path toAbsolutePath() : retourner le chemin absolu du chemin • Path toRealPath(LinkOption…) : retourner le chemin physique avec résolution des liens symboliques selon les options fournies 23
  • 24. Path : intégration dans l’existant • Path File.toPath() • File Path.toFile() • URI Path.toUri() : retourner le chemin sous la forme d’une URI 24
  • 25. La manipulation des fichiers et des répertoires 25
  • 26. Glob • Pattern à appliquer sur un élément du système de fichiers • Sous ensemble des expressions régulières : * ** ? [] {} *.java éléments dont le nom fini par .java Exemples : ??? éléments dont le nom est composé de trois alphanumériques A*.java éléments dont le nom commence par un a et se termine par .java *[0-9]* éléments dont le nom contient au moins un chiffre *.{htm,html} éléments dont le nom se termine par htm ou html 26
  • 27. Glob final Path file1 = Paths.get("C:/java/test/test.java"); final Path file2 = Paths.get("C:/java/test/test.txt"); final Path file3 = file1.getFileName(); String pattern = "glob:**/*.{java,class}"; System.out.println("Pattern " + pattern); PathMatcher matcher = FileSystems.getDefault().getPathMatcher(pattern); System.out.println(file1 + " " + matcher.matches(file1)); System.out.format("%-22s %bn", file2, matcher.matches(file2)); System.out.format("%-22s %bn", file3, matcher.matches(file3)); System.out.println(""); pattern = "glob:*.java"; System.out.println("Pattern " + pattern); matcher = FileSystems.getDefault().getPathMatcher(pattern); System.out.println(file1 + " " + matcher.matches(file1)); System.out.format("%-22s %bn", file3, matcher.matches(file3)); 27
  • 28. La classe Files • Création : createDirectory(), createFile(), createLink(), createSymbolicLink(), createTempFile(), createTempDirectory(), … • Manipulation : delete(), move(), copy(), … • Type d’un élément : isRegularFile(), isDirectory(), probeContentType(), … • Méta-données et permissions : getAttributes(), getPosixFilePermissions(), isReadable(), isWriteable(), size(), getFileAttributeView(), … 28
  • 29. Copier un fichier Path source = Paths.get("c:/java/fichier.txt"); Path cible = Paths.get("c:/java/fichier_copie.txt"); try { Files.copy(source, cible, REPLACE_EXISTING, COPY_ATTRIBUTES); // java.lang.UnsupportedOperationException // Files.move(source, cible, REPLACE_EXISTING, // COPY_ATTRIBUTES, ATOMIC_MOVE); } catch(IOException ioe) { // traitement en cas d’erreur } Copie d’un répertoire 29
  • 30. Déplacer ou renommer un fichier Path source = Paths.get("c:/java/fichier.txt"); Path cible = Paths.get("c:/java/fichier_copie.txt"); try { Files.copy(source, cible, REPLACE_EXISTING, COPY_ATTRIBUTES); // java.lang.UnsupportedOperationException // Files.move(source, cible, REPLACE_EXISTING, // COPY_ATTRIBUTES, ATOMIC_MOVE); } catch(IOException ioe) { // traitement en cas d’erreur } Déplacement d’un répertoire 30
  • 31. Supprimer un fichier Path path = Paths.get("C:/java/test/monfichier_copie.txt"); try { Files.delete(path); } catch (NoSuchFileException nsfee) { // traitement en cas d’erreur } catch (DirectoryNotEmptyException dnee) { // traitement en cas d’erreur } catch (IOException ioe) { // traitement en cas d’erreur } Path path = Paths.get("C:/java/test/monfichier_copie.txt"); try { Files.deleteIfExists(path); } catch (DirectoryNotEmptyException dnee) { // traitement en cas d’erreur } catch (IOException ioe) { // traitement en cas d’erreur } Suppression d’un répertoire vide 31
  • 32. Les liens symboliques • Support optionnel selon le FS (Unix) • Suivis par défaut avec quelques exceptions : delete(), move(), walkFileTree() • Files.isSameFile() • Files.isSymbolicLink() • Files.readSymbolicLink() 32
  • 33. Créer un lien / un lien symbolique Path lien = Paths.get("C:/java/test/monlien"); Path cible = Paths.get("C:/java/test/monfichier.txt"); Files.createLink(lien, cible); if (Files.isSameFile(lien, cible)) { System.out.println("Identique"); } else { System.out.println("Non identique"); } Path lien = Paths.get("/home/jm/monlien"); Path cible = Paths.get("/home/jm/monfichier.txt"); Files.createSymbolicLink(lien, cible); if (Files.isSameFile(lien, cible)) { System.out.println("Identique"); } else { System.out.println("Non identique"); } 33
  • 34. Les événements sur un répertoire 34
  • 35. L’interface WatchService • Notifications de changements dans un répertoire • Abonnement à des événements lors de la création, modification, suppression de fichiers • Evite d’avoir à écrire du code de type pooling ou une API open source (JNotify ou JPathWatch) • Non récursif, performant 35
  • 36. L’utilisation de WatchService Mise en œuvre particulière : • Instanciation avec FileSystem.newWatchService() • Enregistrement avec Path.register() (Path implémente Watchable) • Obtenir et traiter les événements 36
  • 37. WatchService WatchService watcher = FileSystems.getDefault().newWatchService(); Path dir = Paths.get("c:/java/test"); WatchKey key = dir.register(watcher, ENTRY_CREATE) for (;;) { try { key = watcher.take(); } catch (InterruptedException ex) { ex.printStackTrace(); } for (WatchEvent<?> event : key.pollEvents()) { if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) { Path name = (Path) event.context(); System.out.format(event.kind() + " " + "%s created", name); } } key.reset(); } 37
  • 39. Les attributs • Gestion complète des attributs qui sont dépendants du système sous jacent • Taille, type d’éléments, caché, … • Attributs communs (BasicFileAttributes) et spécifiques (DosFileAttributes, PosixFileAttributes) • Méthodes de la classe Files 39
  • 40. Les attributs DOS Path fichier = Paths.get("c:/java/test/test.txt"); FileTime now = FileTime.fromMillis(System.currentTimeMillis()); Files.setLastModifiedTime(fichier, now); Files.setAttribute(fichier, "dos:hidden", true); DosFileAttributes attr = Files.readAttributes(fichier, DosFileAttributes.class); System.out.println(attr.isReadOnly()); System.out.println(attr.isHidden()); System.out.println(attr.isRegularFile()); System.out.println(attr.isSystem()); System.out.println(attr.lastModifiedTime()); 40
  • 41. Les attributs Posix • Énumération PosixFilePermission • PosixFilePermissions : helper • FileAttribute : encapsule les attributs Attention aux restrictions de droits via umask ou via le répertoire parent 41
  • 42. Les attributs Posix Path fichier = Paths.get("/home/jm/test.txt"); PosixFileAttributes attrs = Files.readAttributes(fichier, PosixFileAttributes.class); UserPrincipal owner = attrs.owner(); GroupPrincipal group = attrs.group(); System.out.println(owner); System.out.println(group); Path fichier = Paths.get("/home/jm/test.txt"); Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-rw-rw-"); FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms); Files.createFile(fichier, attr); 42
  • 43. Les attributs avec les vues • Les vues permettent d’obtenir les attributs d’un même groupe en bloc -> performance • Les vues sont spécialisées • Readonly ou mutable • Création possible de vues personnalisées 43
  • 44. Les différentes vues AttributeView FileAttributeView BasicFileAttributeView DosFileAttributeView PosixFileAttributeView FileOwnerAttributeView AclFileAttributeView PosixFileAttributeView UserDefinedFileAttributeView FileStoreAttributeView 44
  • 45. BasicFileAttributView Path fichier = Paths.get("c:/java/test.txt"); BasicFileAttributeView view = Files.getFileAttributeView(fichier, BasicFileAttributeView.class); BasicFileAttributes attributes = view.readAttributes(); FileTime creationTime = attributes.creationTime(); FileTime lastAccessTime = attributes.lastAccessTime(); boolean isRegularFile = attributes.isRegularFile(); 45
  • 46. La classe FileStore • Encapsule un système de stockage : un disque dur, une partition, … • Obtenir des informations • Connaître les AttributViews supportées • FileStore Files.getFileStore(Path) 46
  • 47. FileStore for (final FileStore store : FileSystems.getDefault().getFileStores()) { System.out.println(store); System.out.println("nom : " + store.name() + ", type : " + fileStore.type()); System.out.println("Support BasicFileAttribute : " + store.supportsFileAttributeView(BasicFileAttributeView.class)); System.out.println("Support DosFileAttribute : " + store.supportsFileAttributeView(DosFileAttributeView.class)); System.out.println("Support PosixFileAttribute : " + store.supportsFileAttributeView(PosixFileAttributeView.class)); } final int UN_GIGA = 1024 * 1024 * 1024; for (final FileStore store : FileSystems.getDefault().getFileStores()) { try { final long total = store.getTotalSpace() / UN_GIGA; final long used = (store.getTotalSpace() - store.getUnallocatedSpace()) / UN_GIGA; final long avail = store.getUsableSpace() / UN_GIGA; System.out.format("%-20s total=%5dGo used=%5dGo avail=%5dGo%n", store, total, used, avail); } catch (final IOException e) { e.printStackTrace(); } } 47
  • 48. La classe FileSystem • Encapsule un système de fichiers • Fabrique pour des objets de l’API • Obtenir l’instance du système par défaut FileSystem fs = FilesSystems.getDefault(); 48
  • 49. La classe FileSystem • Extensible • Peut permettre d’offrir différentes vues d’un système de fichiers (cacher des fichiers sensibles, accès en lecture seule, …) • N’a pas besoin d’être lié à un « vrai » système de fichiers 49
  • 50. Les providers de FileSystem • Invoquer une fabrique (FileSystems) pour obtenir une implémentation spécifique • Utiliser ou de créer des fournisseurs de FileSystem class MonFileSystem extends FileSystem; • java.nio.file.spi.FileSystemProvider 50
  • 51. Un provider pour les zip • Permet de traiter le contenu d’un zip comme un système de fichiers • Facilite l’utilisation des archives de type zip • Fourni en standard 51
  • 52. Afficher un fichier d’un zip Path jarfile = Paths.get("c:/java/archive.jar"); FileSystem fs = FileSystems.newFileSystem(jarfile, null); Path mf = fs.getPath("META-INF", "MANIFEST.MF"); try (BufferedReader readBuffer = Files.newBufferedReader(mf, Charset.defaultCharset())) { String ligne = ""; while ((ligne = readBuffer.readLine()) != null) { System.out.println(ligne); } } 52
  • 53. Extraire et ajouter un fichier à un zip Path jarfile = Paths.get("c:/java/archive.jar"); FileSystem fs = FileSystems.newFileSystem(jarfile, null); Path cible = Paths.get("c:/java/MANIFEST.MF"); Files.deleteIfExists(cible); // extaire un élément de l'archive Files.copy(fs.getPath("/META-INF/MANIFEST.MF"), cible); 53
  • 54. Parcourir le contenu d’un répertoire DirectoryStream et WalkFileTree 54
  • 55. L’interface DirectoryStream • Itération sur le contenu d’un répertoire • Performance sur de gros répertoires, consomme moins de ressources • Possibilité d’appliquer un filtre avec un glob • Invoquer la méthode close() après utilisation 55
  • 56. DirectoryStream Path dir = Paths.get("C:/java/projets"); try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.java")) { for (Path entry : stream) { System.out.println(entry.getFileName()); } } 56
  • 57. WalkFileTree avec FileVisitor • Parcourir une arborescence en utilisant le design pattern Visiteur (opérations récursives) • Files.walkFileTree() • FileVisitor invoqué sur chaque fichier (visitFile() / visitFileFailed()) sur chaque répertoire (preVisitDirectory()/postVisitDirectory()) 57
  • 58. WalkFileTree avec FileVisitor • SimpleFileVisitor : contrôle du parcours par la valeur de retour (CONTINUE, SKIP_SUBTREE, TERMINATE, …) • Liens symboliques non suivis par défaut (FileVisitOption.FOLLOW_LINKS) • détection des références circulaires (méthode visitFileFailed() avec FileSystemLoopException) 58
  • 59. WalkFileTree Path dir = Paths.get("C:/java/projets"); Files.walkFileTree(dir, new SimpleFileVisitor<Path>() { public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { String nom = file.getFileName().toString(); if (nom.endsWith(".java")) { System.out.println("Fichier : " + nom); } return FileVisitResult.CONTINUE; } public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { System.out.println("Repertoire : " + dir); return FileVisitResult.CONTINUE; } }); 59
  • 60. Lectures / écritures Mises à jour de l’API 60
  • 61. Gestion des IO avec Java IO NIO NIO 2 Java 1.0 Java 1.4 (JSR 51) Java 7 (JSR 203) Synchrone Synchrone ASynchrone Bloquant Non bloquant Non bloquant File FileChannel Path InputStream SocketChannel AsynchronousFileChannel OutputStream ServerSocketChannel AsynchronousByteChannel Reader (Charset, Selector, AsynchronousSocketChannel Writer ByteBuffer) AsynchronousServerSocketChannel Socket SeekableByteChannel RandomAccessFile 61
  • 62. Les méthodes de la classe Files Besoins Besoins simples avancés 62
  • 63. Lire et écrire tout le contenu d’un fichier byte[] bytes = Files.readAllBytes(path); List<String> lignes = Files.readAllLines(path, Charset.defaultCharset()); Files.write(path, bytes); Files.write(path, lignes, Charset.defaultCharset()); 63
  • 64. Ecrire dans un fichier texte final Path fichier = Paths.get("c:/java/test/donnees.txt"); final Charset charset = Charset.forName("UTF8"); final String contenu = "Prix 10€"; Files.deleteIfExists(fichier); try (BufferedWriter writer = Files.newBufferedWriter(fichier, charset)) { writer.write(contenu, 0, contenu.length()); } catch (IOException ioe) { // traitement de l'erreur } } 64
  • 65. L’interface SeekableByteChannel • ByteChannel qui gère une position • Channel équivalent à RandomAccessFile • Files.newSeekableByteChannel() • CREATE, CREATE_NEW, READ, WRITE, APPEND, TRUNCATE_EXISTING, NOFOLLOW_LINKS, SYNC, DSYNC, … 65
  • 66. SeekableByteChannel ByteBuffer donneesBonjour = ByteBuffer.wrap("Bonjour".getBytes()); ByteBuffer donneesBonsoir = ByteBuffer.wrap("Bonsoir".getBytes()); Path path = Paths.get("C:/java/test/fichier.bin"); Files.deleteIfExists(path); try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.SYNC)) { fileChannel.position(100); fileChannel.write(donneesBonjour); } try (SeekableByteChannel sbc = Files.newByteChannel(path, StandardOpenOption.WRITE, StandardOpenOption.SYNC)) { sbc.position(200); sbc.write(donneesBonsoir); } 66
  • 67. Lectures / écritures asynchrones 67
  • 68. Les canaux asynchrones • Channel : opérations non bloquantes (lecture, écriture) • AsynchronousChannel : opérations asynchrones (exécutées dans un thread) • Contrôle des opérations après leur initialisation via deux solutions : java.util.concurrent.Future java.nio.channels.CompletionHandler 68
  • 69. Canaux async avec CompletionHandler • Callback qui sera invoqué lorsque l’opération se termine (bien ou mal) • Paramétré avec le type de résultat et un objet en attachement (contexte qui peut être null) interface CompletionHandler<V, A> { void completed(V result, A attachment); void failed(Throwable t, A attachment); } 69
  • 70. Canaux async : les groupes • Les CompletionHandler sont invoqués par les threads • AsynchronousChannelGroup encapsule un pool de threads • FixedThreadPool • CachedThreadPool 70
  • 72. Conclusion • NIO2 apporte de nombreuses fonctionnalités, attendues depuis longtemps • Implémentation de bas niveau de certaines, mais utilisables dans différents contextes • Pour allez plus loin : Javadoc, Java tutorials (Basic I/O), exemples du JDK (sample/nio/file) 72
  • 73. 73