IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Fichier ZIP et propriétés à fournir à la fonction FileSystems.newFileSystem()


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 62
    Points : 59
    Points
    59
    Par défaut Fichier ZIP et propriétés à fournir à la fonction FileSystems.newFileSystem()
    Bonjour ou plutôt bonsoir

    En fin de post, un petit programme de test permettant de créer une archive ZIP. Je suis ouvert aux remarques / suggestions / améliorations quant au code, mais j'ai surtout une question s'agissant du second paramètre à fournir à la fonction FileSystems.newFileSystem(). Outre la propriété "create" à "true", y-a-t-il d'autres propriétés qu'il conviendrait d'ajouter ? Dans quelques bouts de code trouvés sur le net, j'ai vu par exemple "encoding" à la valeur "UTF-8", mais ça semble marcher sans ? Quelles propriétés utilisez-vous, dans quelles situations ? Existe-t-il une page listant les propriétés utiles pour travailler avec des fichiers ZIP ?

    D'avance merci !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    package testjava2;
     
    import java.io.IOException;
    import java.net.URI;
    import java.nio.file.DirectoryStream;
    import java.nio.file.FileSystem;
    import java.nio.file.FileSystems;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Map;
     
    public class TestJava2 
    {
        private static final Path PATH_FICHIER_ZIP = Paths.get( "D:\\test_creation.zip" );
        private static final Path PATH_DOSSIER_SRC = Paths.get( "D:\\projet\\www\\monsite" );
        private static final int PROFONDEUR_DOSSIER_SOURCE = PATH_DOSSIER_SRC.getNameCount();
     
        private static ArrayList<Path> scanDossier(Path path) throws IOException
        {
        	ArrayList<Path> liste = new ArrayList<>();
     
        	try( DirectoryStream<Path> ds = Files.newDirectoryStream( path ) )
        	{
        		for( Path pathEnCours : ds )
        		{
        			liste.add( pathEnCours );
        			if( Files.isDirectory(pathEnCours)) liste.addAll( scanDossier(pathEnCours) );
        		}
        	}
     
        	return liste;
        }
     
        public static void main(String[] args) 
        {
        	System.out.println("Création de l'archive : " + PATH_FICHIER_ZIP.toString() );
        	System.out.println("Dossier source        : " + PATH_DOSSIER_SRC.toString() );
     
        	// ZIP : URI du fichier à créer
        	// jar:file:///D:/test_creation.zip
        	URI zipURI = URI.create("jar:" + PATH_FICHIER_ZIP.toUri().toString());
     
        	// ZIP : Map of provider specific properties to configure the file system
        	Map<String, String> zipProp = new HashMap<>();
        	zipProp.put( "create", "true");
     
        	try( FileSystem zipFS = FileSystems.newFileSystem(zipURI, zipProp) )
        	{
        		// Scan du dossier source et tri des items (fichiers et dossiers)
        		ArrayList<Path> arrPath = scanDossier(PATH_DOSSIER_SRC);
        		Collections.sort( arrPath );
     
        		// Ajout au fichier ZIP
        		for(Path pathSource : arrPath )
        		{
        			Path pathInterneZIP = zipFS.getPath( 
        					pathSource.subpath(
        							PROFONDEUR_DOSSIER_SOURCE, 
        							pathSource.getNameCount()
        					).toString() 
        			);
     
        			System.out.println( pathSource + " >>> " + pathInterneZIP);
        			Files.copy(pathSource, pathInterneZIP);
        		}
     
        		System.out.println("Terminé");
        	}
        	catch( IOException e )
        	{
        		System.out.println("Une erreur est survenue : " +e.toString());
        	}
        }
    }

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Isidore.76 Voir le message
    Outre la propriété "create" à "true", y-a-t-il d'autres propriétés qu'il conviendrait d'ajouter ? Dans quelques bouts de code trouvés sur le net, j'ai vu par exemple "encoding" à la valeur "UTF-8", mais ça semble marcher sans ? Quelles propriétés utilisez-vous, dans quelles situations ? Existe-t-il une page listant les propriétés utiles pour travailler avec des fichiers ZIP ?
    Il y a juste deux propriétés : "create" et "encoding", dont les valeurs par défaut sont respectivement "false" et "utf8"

    http://docs.oracle.com/javase/7/docs...iderprops.html



    Sinon quelques remarques au niveau du code :
    • Tu peux utiliser la méthode relativize() pour obtenir le chemin relatif d'un fichier par rapport à un autre.
      C'est plus sûr que le découpage via getNameCount() dans le cas où il y a des chemin relatif...
    • Il y a un intérêt de trier les fichiers ??
      Parce que dans le cas inverse la méthode récursive scanDossier() pourrait être remplacé par un Files.walkFileTree()...
    • Le traitement des exceptions n'est pas tip-top. Il vaut mieux laisser l'exception remonter...
    • Pourquoi utiliser des attributs static ? Autant créer une méthode indépendante avec des paramètres, ce qui permettra de la réutiliser.
    • Enfin il faudrait préciser le comportement lorsque le fichier ZIP existe déjà...


    Cela donnerait quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    	public static void createZip(final Path directory, final Path zipFileName) throws IOException {
    		Objects.requireNonNull(directory);
    		Objects.requireNonNull(zipFileName);
     
    		System.out.println("Création de l'archive : " + zipFileName);
    		System.out.println("Dossier source        : " + directory);
     
    		// ZIP : URI du fichier à créer
    		// jar:file:///D:/test_creation.zip
    		URI zipURI = URI.create("jar:" + zipFileName.toUri().toString());
     
    		// ZIP : Map of provider specific properties to configure the file
    		// system
    		Map<String, String> zipProp = new HashMap<>();
    		zipProp.put("create", "true");
     
    		try (FileSystem zipFS = FileSystems.newFileSystem(zipURI, zipProp)) {
    			// Scan du dossier source : 
    			Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
     
    				// Retourne le chemin à l'intérieur du jar :
    				private Path internalPath(Path p) {
    					return zipFS.getPath("/" + directory.relativize(p));
    				}
     
    				// Lorsqu'on visite un répertoire,
    				// on force la création de ce dernier dans le ZIP :
    				@Override
    				public FileVisitResult preVisitDirectory(Path dir,
    						BasicFileAttributes attrs) throws IOException {
    					Path internalPath = internalPath(dir);
    					System.out.println(dir + " >>> " + internalPath);
    					Files.createDirectories(internalPath(dir));
    					return FileVisitResult.CONTINUE;
    				}
     
    				// Lorsqu'on visite un fichier,
    				// on le recopie à l'intérieur du jar :
    				@Override
    				public FileVisitResult visitFile(Path file,
    						BasicFileAttributes attrs) throws IOException {
    					Path internalPath = internalPath(file);
    					System.out.println(file + " >>> " + internalPath);
    					Files.copy(file, internalPath);
    					return FileVisitResult.CONTINUE;
    				}				
    			});
    			System.out.println("Terminé");
    		}
    	}

    a++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 62
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Il y a juste deux propriétés : "create" et "encoding", dont les valeurs par défaut sont respectivement "false" et "utf8"

    http://docs.oracle.com/javase/7/docs...iderprops.html
    Merci pour le lien ! Je m'attendais à ce qu'il y ait d'autres propriétés, permettant par exemple d'indiquer le niveau de compression souhaité, mais à priori non !


    Citation Envoyé par adiGuba Voir le message
    Il y a un intérêt de trier les fichiers ??
    Parce que dans le cas inverse la méthode récursive scanDossier() pourrait être remplacé par un Files.walkFileTree()...
    Oui, il y a un intéret. Prenons un fichier situé dans un sous-sous-dossier, mettons /a/b/c.txt : il faut préalablement créer a/ puis b/ et enfin c.txt. D'où le tri (/a avant /a/b avant /a/b/c.txt). Sauf qu'à la réflexion, la façon dont l'ArrayList est récursivement rempli respecte l'ordre attendu ! Finalement le tri est indispensable mais le tri "supplémentaire" n'est en rien utile


    Citation Envoyé par adiGuba Voir le message
    Pourquoi utiliser des attributs static ? Autant créer une méthode indépendante avec des paramètres, ce qui permettra de la réutiliser.
    Enfin il faudrait préciser le comportement lorsque le fichier ZIP existe déjà...
    Vrai. Mais ce code n'est pas prévu pour être utilisé dans un vrai projet, il est plutôt question de se faire la main sur java.nio en général et présentement sur les fichiers ZIP !

    Merci aussi pour le bout de code !

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/02/2009, 17h28
  2. [Zip] Créer un fichier zip
    Par Mykeul dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 07/03/2005, 16h38
  3. Executer un fichier zip
    Par Sébastien THEVOT dans le forum C++Builder
    Réponses: 15
    Dernier message: 11/10/2004, 10h35
  4. Extraction d'un fichier zip
    Par dyason dans le forum Général Python
    Réponses: 2
    Dernier message: 13/07/2004, 12h35
  5. [Fichier Zip] Comment zipper un fichier
    Par caro_a dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 27/05/2004, 09h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo