Interface de chemin
1. Le chemin représente une séquence de noms de répertoire, suivi d'un nom de fichier. Lorsque le premier composant du chemin est le composant racine, c'est le chemin absolu, tel que / ou c: /, et le composant racine autorisé à être accessible dépend du système de fichiers;
2. Le chemin commençant par le composant racine est un chemin absolu, sinon c'est un chemin relatif;
3. La méthode des chemins statiques. Ensuite analyser les résultats connectés. S'il ne s'agit pas d'un chemin juridique, une exception invalidpathexception sera lancée, sinon un objet de chemin sera retourné;
// Supposons que ce soit le Système de fichiers UNIX Path Absolute = paths.get ("/ home", "cat"); // Path Absolute Path Relative = Pahts.get ("ixenos", "config", "user.properties"); // chemin relatif4. Obtenez l'objet Path du chemin de chaîne
GET peut également obtenir un chemin entier (c'est-à-dire une seule chaîne composée de plusieurs composants), par exemple, lisez le chemin d'accès à partir d'un fichier de configuration:
String-Basedir = Properties.getProperty ("Base.Dir"); // peut être obtenu / opt / ixenos ou c: / programme files / ixenos path basepath = paths.get (basaseir);5. Combinaison ou analyse des chemins
1) Appeler P.Resolve (Q) renverra un chemin en fonction des règles suivantes: Si Q est un chemin absolu, renvoyez Q, sinon le chemin annexé renverra P / Q ou P / Q
Path workRellative = paths.get ("work"); path workPath = BasEpath.Resolve (workrelative); // Resolve peut également accepter les paramètres de chaîne Path WorkPath = BasEpath.Resolve ("Work");2) L'appel P.Resolvesibling ("Q") résoudra le chemin parent o du chemin spécifié P et générera le chemin de frère O / Q
PATH TEMPPATH = WorkPath.ResolVesibling ("Temp"); / * Si WorkPath est / opt / ixenos / work, alors / / opt / ixenos / tempor sera créé * /3) L'appel p.relativize (R) générera un chemin redondant q. l'analyse Q générera un chemin relatif r. En fin de compte, R ne contient pas le chemin d'intersection avec p.
/ * patha est / home / brust pathb est / home / ixenos / config maintenant patha a relativisé pathB, qui générera un chemin redondant * / path pathc = patha.relatiVize (pathB); // À l'heure actuelle, PathC est ../ixenos/config/* La méthode de normalisation supprimera la pièce redondante * / path pathd = pathc.Normalize (); // pathd est / ixenos / config
4) Toabsolutepath produira le chemin absolu du chemin donné, à partir de la composante racine
5 ans
6) Path a une méthode ToFile pour gérer les classes de fichiers héritées, et la classe de fichiers a également une méthode TOPATH
Classe d'outils de fichiers
1. Lire et écrire des fichiers
Signature de la méthode:
Écriture de chemin statique (chemin de chemin, octets [] octets, OpenOption ... Options)
Écriture de chemin statique (chemin de chemin, itérable <? Étend les lignes de charbon>, OpenOption ... Options)
Voici uniquement les méthodes utilisées ci-dessous. Pour plus de méthodes, veuillez consulter la documentation de l'API ...
Parmi eux, OpenOption est une interface NIO, StandardOpenOption est sa classe d'implémentation d'énumération. Veuillez vérifier la documentation de l'API pour chaque fonction d'instance d'énumération.
/ * La méthode simple fournie par les fichiers convient au traitement des fichiers texte de longueur moyenne. Si le fichier à traiter est grand ou binaire, vous devez toujours utiliser le flux IO classique * /// lire tous les contenus du fichier dans le tableau d'octet octet [] bytes = files.readallbytes (path); // transmet dans l'objet path // Après cela, vous pouvez créer la chaîne en fonction de la chaîne de caractères contenu = new String (bytes, charset); // vous pouvez également le lire directement en tant que séquence de lignes dans la liste <string> lignes = files.readalllines (path, charset); // sur le contraire, vous pouvez également écrire une chaîne dans le fichier, qui consiste à remplacer les fichiers.write (path, contenu.get.get (charset); // pause byte [] // contenu append, déterminez les fonctions d'ajout telles que ADD en fonction des paramètres files.write (path, contenu.getBytes (charse), standardOpenOption.Apend); // suscite l'objet d'énumération et activez le commutateur APPEND // Écrivez une liste de collecte d'une chaîne de ligne dans le fichier files.write (path, lignes);
2. Copier, couper, supprimer
Signature de la méthode:
Copie de chemin statique (source de chemin, cible de chemin, CopyOption ... Options)
Déplacement du chemin statique (source de chemin, cible de chemin, copie ... Options)
STATIC VOID DELLETE (chemin de chemin) // Si le chemin n'existe pas, une exception sera lancée. Il vaut mieux appeler le suivant pour le moment
Deleteifexistes booléens statiques (chemin de chemin)
Voici uniquement les méthodes utilisées ci-dessous. Pour plus de méthodes, veuillez consulter la documentation de l'API ...
Parmi eux, CopyOption est une interface NIO, StandardCopyOption est sa classe d'implémentation d'énumération. Veuillez vérifier la documentation de l'API pour chaque fonction d'instance d'énumération.
Il existe un atomic_move qui peut être rempli pour assurer les opérations atomiques, soit le mouvement est terminé avec succès, soit le fichier source est conservé dans sa position d'origine.
// Copy Files.copy (FromPath, Topath); // Cut Files.move (FromPath, Topath); / * Si Topath existe déjà, l'opération échoue. Si vous souhaitez écraser, vous devez passer dans le paramètre Remplace_existing. Copiez également les attributs de fichiers, passez dans copy_attributes * / files.copy (FromPath, Topath, StandardCopyOption.replace_existing, StandardCopyOption.copy_attributes);
3. Créer des fichiers et des répertoires
// Créer un nouveau répertoire, à l'exception du dernier composant, les autres doivent être les fichiers existants.CreateDirectory (Path); // Créez le répertoire intermédiaire dans le chemin d'accès, qui peut créer les fichiers de composants intermédiaires inexistants. S'il existe déjà, une exception sera jetée pour vérifier l'existence du fichier. Par conséquent, l'opération de création de fichiers ne peut pas être effectuée dans le processus * / files.createFile (path); // ajouter le pré- / suffixe pour créer un fichier temporaire ou un répertoire temporaire newpath = files.createTEmpFile (dir, prefix, suffix); path newpath = files.createTeTETPDirectory (dir, préfixe);
4. Obtenir des informations sur les fichiers
omis, consultez la documentation de l'API pour plus de détails, ou corejava Page51
5. Ilaster les fichiers dans le répertoire
L'ancienne classe de fichiers dispose de deux méthodes pour obtenir un tableau de chaîne composé de tous les fichiers dans le répertoire, String [] list () et String [] List (FileFilter Filter), mais lorsque le répertoire contient un grand nombre de fichiers, les performances de ces deux méthodes seront très faibles.
Analyse des causes:
1. // Liste de classe de fichiers Tous les fichiers publics public string [] list () {SecurityManager Security = System.getSecurityManager (); // Les autorisations du système de fichiers obtiennent if (Security! = Null) {Security.CheckRead (path); } if (isInvalid ()) {return null; } return fs.list (this); // l'appel sous-jacent à la liste du système de fichiers} // La liste de la classe abstraite du système de fichiers // Les autorisations du système de fichiers définissent if (Security! = Null) {Security.CheckRead (path); } if (isInvalid ()) {return null; } return fs.list (this); // l'appel sous-jacent à la liste du système de fichiers} // La liste de la classe abstraite du système de fichiers // La classe de fichiers définit FS est un système de fichiers final statique privé généré statiquement par DefaultFileSystem fs = DefaultFileSystem.getFileSystem (); Objet de système de fichiers pour la plate-forme Windows. * / public static fileSystem getFileSystem () {return new winntFileSystem (); }} // La classe WinntFileSystem hérite de la classe abstraite du système de fichiers. Ici, nous observons principalement sa liste de listes (fichier) Méthode @OverridePublic Native String [] List (Fichier F); / * Nous pouvons voir qu'il s'agit d'une méthode native, qui montre que le fonctionnement de la liste est contrôlé par le système de fichiers du système d'exploitation. Lorsque le répertoire contient un grand nombre de fichiers, les performances de cette méthode seront très faibles. Par conséquent, afin de le remplacer, la classe de fichiers de Nio a conçu NewDirectoryStream (Path Dir) et sa méthode surchargée, qui générera un objet itérable (peut être itéré ForEach) * /// ~ 2. // Rappel de la chaîne publique du filtre (] List (List (); // appelle la liste all if ((noms == null) || (filter == null)) {renvoie noms; } List <string> v = new ArrayList <> (); for (int i = 0; i <names.length; i ++) {if (filter.accept (this, names [i])) {// rappeler la méthode d'acceptation de l'objet filenameFileter v.add (noms [i]); }} return v.toArray (new String [v.size ()]); }À l'heure
Passez un chemin de répertoire, traversez le répertoire descendants et renvoyez un flux de chemin de répertoire. Notez que tous les chemins impliqués ici sont des répertoires plutôt que des fichiers!
Par conséquent, la classe de fichiers conçoit newDirectoryStream (Path Dir) et sa méthode surchargée, qui générera un objet itérable (peut être utilisé pour itérer)
Itérer dans le répertoire pour obtenir une collection itérable de fichiers descendants
staticDirectoryStream<Path> | newDirectoryStream(Path dir) ouvre un répertoire, renvoyant un DirectoryStream pour itérer toutes les entrées du répertoire. |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter) ouvre un répertoire, renvoyant un DirectoryStream pour itérer sur les entrées du répertoire. |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, String glob) |
Le retour d'un flux d'annuaire peut être considéré comme une collection qui stocke tous les chemins qui implémentent iTable.
Par conséquent, les itérateurs ou les itérates de Forach, mais lorsque vous utilisez des itérateurs, veillez à ne pas invoquer un autre itérateur:
Alors que DirectoryStream s'étend ITRIBLE, il n'est pas un itérable général car il ne prend en charge qu'un seul itérateur; Invoquer la méthode Iterator pour obtenir un deuxième ou un itérateur ultérieur lance illégalStateException.
Exemple:
Try (DirectoryStream <Tath> Entries = files.newDirectoryStream (dir)) {for (Path Entry: Entrées) {...}}Vous pouvez transmettre des paramètres GLOB, c'est-à-dire utiliser le mode glob pour filtrer les fichiers (au lieu de la liste (filtre FileFilter)):
NewDirectoryStream (Path Dir, String Glob) Remarque qu'il s'agit du type de chaîne
Try (DirectoryStream <Tath> Entries = files.newDirectoryStream (dir, "* .java")) // {...}mode glob
Le motif soi-disant globe fait référence à l'expression régulière simplifiée utilisée par la coquille.
1. ASTERISK * correspond à 0 ou plusieurs caractères dans le composant de chemin; Par exemple * .java correspond à tous les fichiers Java dans le répertoire actuel
2. Deux astérisques ** correspondent 0 ou plus à travers les limites du répertoire; Par exemple, **. Java correspond aux fichiers Java dans tous les sous-répertoires
3. Le point d'interrogation (?) Ne correspond qu'un seul personnage; Par exemple, ????. Java correspond aux quatre caractères des fichiers Java, à l'exclusion des extensions; utiliser ? Parce que * est un caractère générique et ne spécifie pas le numéro
4. [...] Pour correspondre à un jeu de caractères, vous pouvez utiliser la connexion [0-9] et le caractère inverse [! 0-9]; Par exemple, TEST [0-9A-F] .Java pour correspondre à TestX.Java, en supposant que X est un numéro hexadécimal, [0-9A-F] est de correspondre à un seul caractère comme un numéro hexadécimal, comme B (hexadécimal est-insensible au cas)
Si vous utilisez Dash dans les crochets pour séparer deux caractères, cela signifie que tous ceux dans la plage de ces deux caractères peuvent être appariés (par exemple, [0-9] signifie faire correspondre tous les nombres 0 à 9).
5. {...} Faites correspondre l'une des multiples options facultatives séparées par des virgules; Par exemple *. {Java, classe} Faites correspondre tous les fichiers Java et les fichiers de classe
6. / Échapper aux caractères dans l'un des modèles ci-dessus; Par exemple * / ** correspond aux fichiers avec des noms de fichiers dans toutes les sous-répertoires avec *, voici ** Escape, précédé de 0 ou plusieurs caractères ou plus
Ce qui suit est le modèle GLOB résumé par des internautes:
| Mode glob | décrire |
|---|---|
| *.SMS | Faites correspondre tous les fichiers avec l'extension .txt |
| *. {html, htm} | Faites correspondre tous les fichiers avec des extensions de .html ou .htm. {} est utilisé pour le mode groupe, qui est séparé par des virgules |
| ?.SMS | Faites correspondre tout caractère unique comme nom de fichier et extension .txt |
| . | Faites correspondre tous les fichiers avec des extensions |
| C: / utilisateurs / * | Faites correspondre tous les fichiers dans le répertoire des utilisateurs du lecteur C. Bombardement "/" est utilisé pour échapper aux caractères immédiatement suivants |
| /maison/** | Faites correspondre tous les répertoires et fichiers à domicile en sous-répertoires sur la plate-forme UNIX. ** Utilisé pour correspondre au répertoire actuel et à tous ses sous-répertoires |
| [xyz] .txt | Faites correspondre tous les caractères uniques en tant que noms de fichiers, et un seul caractère ne contient qu'un seul de "x" ou "y" ou "z", et a une extension de .txt. Les crochets [] sont utilisés pour spécifier une collection |
| [ac] .txt | Faites correspondre tous les caractères uniques en tant que noms de fichiers, et un seul caractère ne contient qu'un seul des trois types de "A" ou "B" ou "C", et a une extension de .txt. Le signe moins "-" est utilisé pour spécifier une plage et ne peut être utilisé que sur des crochets [] |
| [! A] .txt | Faites correspondre tous les caractères uniques en tant que noms de fichiers, et un seul caractère ne peut pas contenir la lettre "A" et l'extension est .txt. Marque d'exclamation "!" est utilisé pour nier |
N'est-il pas bon de parcourir toutes les collections de fichiers descendants dans un certain répertoire? Allez, traversons directement tous les descendants (y compris les répertoires et les fichiers) d'un répertoire.
Nous pouvons appeler la méthode WalkFileTree de la classe Fichiers et passer dans un objet de type d'interface FileVisitor (il y a plus de méthodes qui vous attendent à découvrir dans l'API ...)
/ * Passez un objet anonyme de la sous-classe FileVisitor * / files.walkFileTree (dir, new SimpleFileVisitor <Athath> () {// WalkFileTree Rappel Cette méthode est utilisée pour traverser tous les descendants publics filevisiResult VisitFile (Path Path, BasicFileAttributes Attir Code, qui n'a rien à voir avec le but de WalkFileTree (Traversing All descendants) System.out.println (Path);Résumons-le,
Files.NewDirectoryStream (Path Dir) renvoie une collection itérable de fichiers descendants après Traversal;
Files.WalkFileTree (Path Dir, FileVisitor FV) est un processus de traversée les répertoires et les fichiers des descendants;
Système de fichiers zip
Comme nous le savons ci-dessus, la classe PATHS recherchera des chemins dans le système de fichiers par défaut, c'est-à-dire des fichiers sur le disque local de l'utilisateur.
En fait, nous pouvons également avoir d'autres systèmes de fichiers, tels que des systèmes de fichiers zip.
/ * Supposons que Zipname soit le nom d'un fichier zip * / fileSystem fs = filesystems.newFileSystem (paths.get (zipname), null);
Le code ci-dessus créera un système de fichiers basé sur le nom Zipn qui contient tous les fichiers du document ZIP.
1) Si vous connaissez le nom du fichier (type de chaîne), il est facile de copier le fichier à partir de ce document zip:
Files.copy (fs.getPath (nom de fichier), ciblePath);
Q: Fs.getPath utilise le système de fichiers ZIP pour geler, donc le système de fichiers par défaut peut être appelé?
R: Oui. Il existe une méthode statique getDefault () dans la classe de système de fichiers, qui renvoie un objet de système de fichiers par défaut, qui peut également être obtenu par le nom de fichier getPath.
À des fins spécifiques, que GetPath (nom de chaîne) soit traversé ou accès aléatoire, allez voir l'implémentation du code source lorsque vous avez le temps.
2) Pour répertorier tous les fichiers du document ZIP, vous pouvez également utiliser WalkFileTree pour traverser l'arborescence de fichiers
FileSystem fs = filesystems.newFileSystem (paths.get (nom de fichier), null); // walkFileTree doit passer dans un chemin de répertoire à parcourir, et un fichier d'objet filevisitor Exception {System.out.println (fichier);L'exemple ci-dessus de l'interface Java Nio Path et des fichiers de fichiers fonctionnant ensemble est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.