Préface
À partir de cet article, nous commencerons à apprendre le système Java IO, qui lit et écrit essentiellement des fichiers. Cela semble simple, mais ce n'est pas facile. Le système IO de Java a amélioré et amélioré et a conçu un grand nombre de classes. Ce n'est qu'en comprenant la signification de ces types conçue et leurs scénarios d'application respectifs que nous pouvons améliorer la compréhension du fichier IO.
Ainsi, la première étape consiste à résoudre le problème de la façon de représenter un fichier. Dans le monde Java, "tout est un objet", et comment correspondre à un fichier de disque ou un répertoire réel à un objet Java est notre principal problème.
Le fichier est utilisé dans Java pour abstraction d'un fichier, qu'il s'agisse d'un fichier normal ou d'un répertoire, il peut correspondre à un objet de fichier. Je pense que tout le monde doit être précis dans le positionnement du type de fichier: il représente simplement un fichier ou un répertoire sur le disque, et il s'appuie en fait sur une classe de système de fichiers locaux indépendante de la plate-forme, et le fichier ne peut effectuer aucune opération de lecture et d'écriture sur le contenu de fichier qu'il représente (c'est ce que fait Stream).
Créer une instance de fichier
Avant d'introduire réellement la méthode du constructeur d'instance de fichier, nous devons jeter un œil à ses plusieurs membres d'attribut importants.
STATIQUE FILSE STATIQUE PRIVÉ FSYSTEM FS = DefaultFileSystem.getFileSystem ();
Il s'agit du membre le plus principal de la classe de fichiers, qui est représenté comme l'API du système de fichiers du système actuel. Toutes les opérations émises au disque sont basées sur cette propriété.
Path de chaîne finale privée;
Le chemin représente le nom de chemin complet de l'instance actuelle. Si l'instance de fichier actuel représente un répertoire, la valeur du chemin est le nom complet du répertoire. S'il représente un fichier pur, la valeur de ce chemin est égale au chemin complet du fichier + le nom de fichier.
Public statique final char séparateur (fs.getSeparator (); public static final char pathseparatorChar = fs.getPathseparator ();
SéparatriceChar représente le séparateur entre les répertoires, et PathseparatorCar représente le séparateur sous différents chemins. Ces deux valeurs sont différentes sous différentes plates-formes système. Par exemple, les valeurs de ces deux sous Windows sont: "" et ";", où l'interdiction est utilisée pour séparer plusieurs chemins différents.
La classe de fichiers fournit quatre constructeurs différents pour instancier un objet de fichier, mais seuls trois sont plus couramment utilisés. Nous nous concentrons également sur l'apprentissage des trois premiers constructeurs.
Fichier public (String PathName)
C'est le moyen le plus courant d'instancier un objet de fichier. La valeur PathName peut être un répertoire ou un nom de fichier ordinaire. Par exemple:
File file = new File ("C: // Users // Yanga // Desktop"); fichier file1 = new File ("c: //users//yanga//desktop//a.txt"); fichier file2 = new file ("a.txt");Bien sûr, vous pouvez également spécifier explicitement un chemin parent:
Fichier public (String Parent, String Child)
À l'intérieur du constructeur, le programme épissera un chemin de fichier complet pour nous, par exemple:
File file = new File ("C: // Users // Yanga // Desktop", "a.txt"); fichier file1 = new File ("C: // Users // Yanga // Desktop", "java");Le troisième constructeur est essentiellement le même que le second, sauf qu'il ajoute un processus d'encapsulation de l'instance de fichier parent:
Fichier public (Fichier Parent, String Child)
Des situations similaires ne seront pas expliquées. Nous n'avons pas plongé ici dans la mise en œuvre spécifique interne de ces constructeurs. Ce n'est pas que c'est simple. Au lieu de cela, le fichier s'appuie trop sur le système de fichiers local et la mise en œuvre de nombreuses méthodes ne peut pas être directement vue. Par conséquent, pour l'apprentissage du fichier, il suffit de maîtriser le maîtriser, et l'implémentation spécifique ne peut pas être apprise en profondeur pour le moment.
Obtenir des informations liées au nom ou au chemin du fichier
La méthode GetName peut être utilisée pour obtenir le nom du fichier:
public String getName () {int index = path.LastIndexof (séparateur); if (index <prefixLength) return path.substring (prefixLength); return path.substring (index + 1);}Rappelez-vous ce que représente notre séparateur?
Il est représenté comme un séparateur de chemin, le symbole "" dans Windows est stocké dans l'attribut Path, et le nom de chemin complet de l'instance de fichier actuelle, de sorte que tous les caractères après la dernière occurrence doivent être notre nom de fichier.
Bien sûr, vous devez avoir découvert que pour les fichiers purs, cette méthode peut renvoyer le nom simple du fichier, tandis que pour un répertoire, la valeur de retour sera le nom du répertoire le plus récent. Par exemple:
File file = new File ("c: //users//yanga//desktop//a.txt"); system.out.println (file.getName ()); file file1 = new File ("c: // users // yanga // dektop"); system.out.println (file1.getname ());La sortie ne vous surprendra pas:
a.txtdesktop
La méthode Getparent est utilisée pour renvoyer le répertoire parent du fichier actuel. Que vous soyez un fichier simple ou un répertoire, vous aurez éventuellement votre répertoire parent (bien sûr, les fichiers temporaires générés par la machine virtuelle ne sont pas bien sûr).
public String getParent () {int index = path.lastIndexof (séparateur); if (index <prefixLength) {if ((prefixLength> 0) && (path.length ()> prefixLength)) return path.subString (0, prefixLength); retourner null; } return path.substring (0, index);}La mise en œuvre de la méthode est très simple, donc je n'entrerai pas dans les détails.
La méthode GetPath peut renvoyer le nom de fichier complet de l'instance de fichier actuelle:
public String getPath () {return path;}Voici quelques opérations connexes liées aux répertoires, qui sont relativement simples à mettre en œuvre. Voici une brève liste:
Ici, nous devons expliquer une explication de GetCanonicalPath, qu'est-ce qu'un chemin standard, et y a-t-il une différence entre un chemin absolu?
D'une manière générale, "../" signifie le répertoire précédent du répertoire où se trouve le fichier source, "../../" signifie le répertoire précédent du répertoire où le fichier source est situé, etc. La méthode GetAbsolutepath n'effectue pas de telles opérations de conversion, tandis que la méthode GetCanonicalPath reconnaît ces caractères spéciaux et prend une sémantique appropriée.
Par exemple:
File file = new File ("..// a.txt"); System.out.println (file.getAbsolutepath ()); System.out.println (file.getCanonicalPath ());Résultat de sortie:
C: / Users / Yanga / Desktop / Java / Workspace2017 / TestFile /../ A.TXT
C: /users/yanga/desktop/java/workspace2017/a.txt
Le premier utilisera "../a.txt" dans le cadre du nom du chemin du fichier, tandis que le second peut reconnaître que "../a.txt" signifie que "a.txt" est situé dans le répertoire supérieur du répertoire actuel. Il s'agit de la plus grande différence entre les deux, adaptées à différentes situations.
Obtenez les informations d'attribut du fichier
Le fonctionnement de cette partie du fichier est en fait très simple, ce n'est rien de plus que certaines questions sur les autorisations de fichiers, qu'elle soit lisible, qu'elle soit écrivative, qu'il s'agisse d'un fichier caché, etc. Voyons ces méthodes en détail:
Il convient de noter que la méthode de longueur peut renvoyer correctement le nombre total d'octets du fichier pour un fichier pur, mais pour un répertoire, la valeur de retour sera une valeur "non spécifiée", qui n'est ni le nombre total d'octets de tous les fichiers dans le répertoire ni zéro, mais n'est qu'une valeur non spécifiée, qui n'a aucune signification.
Opération de dossier
Le fonctionnement des fichiers n'est rien de plus que "l'ajout, la suppression, la modification et la recherche". Jetons un coup d'œil ensemble.
Bien sûr, lorsqu'il s'agit des deux nouvelles opérations de création et de suppression simples ci-dessus, la classe de fichiers fournit également les opérations dites de "requête", que nous devons apprendre attentivement. Par exemple:
public String [] list () {SecurityManager Security = System.getSecurityManager (); if (Security! = null) {Security.CheckRead (path); } if (isInvalid ()) {return null; } return fs.list (this);}Cette méthode récupérera tous les noms simples des "fichiers purs" et "répertoire" dans le répertoire représenté par l'instance actuelle. Par exemple:
File file = new File ("C: // Users // Yanga // Desktop"); String [] list = file.list (); for (String str: list) {System.out.println (str);}Le résultat de sortie du programme imprimera les noms simples de tous les fichiers de mon répertoire de bureau d'ordinateur, donc je ne vous le montrerai pas.
Une chose à noter est que si notre instance de fichier ne correspond pas à un répertoire mais à un fichier ordinaire, alors la liste reviendra NULL.
Ensuite, examinons une méthode pour récupérer les fichiers de répertoire:
public String [] list (fileNameFilter Filter) {String Names [] = list (); if ((noms == null) || (filter == null)) {return names; } List <string> v = new ArrayList <> (); for (int i = 0; i <names.length; i ++) {if (filter.accept (this, names [i])) {v.add (names [i]); }} return v.ToArray (nouvelle chaîne [v.size ()]);}Cette méthode est en fait une version surchargée de la liste, qui vous permet de passer un filtre pour filtrer uniquement les fichiers et les répertoires dont nous avons besoin lors de la recherche de répertoires.
Mais la définition de l'interface FileNameFilter est si simple:
interface publique filenameFilter {booléen accepte (fichier dir, nom de chaîne);}Vous n'avez qu'à remplacer cette méthode d'acceptation. Chaque fois que la liste de Loop obtient un fichier ou un répertoire, il essaiera d'abord d'appeler cette méthode de filtrage. Si vous passez le filtrage, le nom simple du fichier actuel sera ajouté à la collection de retour.
Par conséquent, la réécriture de cette méthode d'acceptation détermine quels fichiers peuvent passer le filtrage et lesquels ne peuvent pas. Regardons un exemple:
Les fichiers du dossier de test sur mon bureau sont les suivants:
File file = new File ("C: // Users // Yanga // Desktop // test"); String [] list = file.list (new FileNameFilter () {@Override public boolean accepte (fichier dir, nom de chaîne) {// L'objet de fichier actuel représenté par dir // name est le nom simple de l'élément de fichier actuellement travé;}}); for (String str: list) {System.out.println (str); }Ici, nous utilisons une classe intérieure anonyme pour créer une instance de sous-classe de filenameFilter, puis implémenter sa méthode d'acceptation. L'implémentation spécifique est très simple, filtrant tous les répertoires et éliminant les noms simples de tous les fichiers simples.
Le résultat de sortie final est le suivant:
3.TXT
4.txt
Bien sûr, il existe également deux méthodes de liste "mutée" dans la classe de fichiers, telles que:
Ils ne renvoient plus les noms simples des "fichiers purs" et "répertoires" dans le répertoire cible, mais renvoient l'objet de fichier correspondant. En fait, ce n'est rien. Le répertoire cible + un nom simple peut créer ces instances de fichier.
Par conséquent, essentiellement, la méthode de liste ne traversera pas tous les fichiers du répertoire cible, c'est-à-dire que les fichiers du sous-répertoire du répertoire cible ne seront pas accessibles et traversés.
Vous devriez donc réfléchir à la façon de traverser tous les fichiers du répertoire cible, y compris des fichiers profonds dans les sous-répertoires de premier niveau. La réponse sera donnée à la fin de l'article.
Les deux méthodes suivantes sont liées à la création de dossiers:
Les deux sont basés sur l'instance de fichier actuelle pour créer des dossiers. En ce qui concerne leurs différences, regardons d'abord un morceau de code:
File file = new File ("C: // Users // yanga // Desktop // test2"); System.out.println (file.mkdir ()); file file2 = new File ("c: // utilisateurs // yanga // dektop // test3 // bonjour"); system.out.println (file2.mkdir ());Parmi eux, Test2 et Test3 n'existent pas avant l'exécution du programme.
Le résultat de sortie est le suivant:
vrai
FAUX
Pourquoi ce dernier n'a-t-il pas créé?
Cela est dû au fait que la méthode MKDIR ne peut créer qu'un seul dossier à la fois, ce qui entraînera une défaillance de la création si le parent ou le répertoire supérieur du répertoire donné existe un répertoire non créé.
La méthode MKDIRS est utilisée pour résoudre cette situation. Il créera tous les répertoires non créés sur le chemin cible, voir le code:
Fichier file3 = new File ("c: // utilisateurs // yanga // Desktop // test3 // Bonjour // 231"); System.out.println (file3.mkDirs ());Même si notre dossier Test3 n'existe pas, une fois le programme exécuté, les trois dossiers Test3, Hello et 231 seront créés.
De plus, le fichier a également une méthode pour créer des fichiers temporaires. Les fichiers soi-disant temporaires sont: ils existent pendant l'exécution et sont détruits lorsque la machine virtuelle est arrêtée. Vous pouvez l'étudier vous-même. Il est relativement simple à utiliser, donc je n'entrerai pas dans les détails ici.
À ce stade, nous avons appris à peu près le fichier de type de fichier. Je crois que tout le monde pense plus ou moins que la conception de la représentation de fichiers purs et de répertoires en utilisant le même type semble un peu déroutant et déraisonnable. Je sais que JDK1.7 Sun a lancé des fichiers et un chemin vers des fichiers et des répertoires séparés, et nous en apprendrons plus dans les futurs articles.
Tous les codes, images et fichiers de l'article sont stockés dans le cloud sur mon github:
(https://github.com/singleyam/overview_java)
Vous pouvez également choisir de télécharger localement.
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.