Ajout d'éléments de structure de données à partir d'un java. Java : travailler avec des fichiers - écrire, lire, supprimer. Quels problèmes allons-nous résoudre dans cette leçon ?

Bien qu'en utilisant les classes évoquées précédemment, vous puissiez écrire du texte dans des fichiers, leurs capacités d'écriture travail à part entière Avec fichiers texte pas assez. Et à cette fin, des classes complètement différentes sont utilisées, qui sont les héritiers cours abstraits Lecteur et écrivain.

Enregistrement de fichiers. Classe FileWriter

La classe FileWriter dérive de la classe Writer. Il est utilisé pour écrire des fichiers texte.

La bonne méthode consiste à utiliser les classes qui nous obligent à faire une déclaration explicite de codage de caractères, par ex. Un scanner est utilisé pour lire chaque ligne, et un deuxième scanner est utilisé pour analyser chaque ligne en une simple paire nom-valeur. Si vous exécutez l'exemple, il sera reçu.

La première chose à faire est d’importer ces classes et celles qui gèrent les exceptions. Ensuite, nous devons créer un objet à partir d'une de ces classes. Nous utiliserons ce dernier. N'oubliez pas que nous devons contrôler les exceptions. Regardons un exemple de création d'objets, nous fermons également les threads.

Pour créer un objet FileWriter, vous pouvez utiliser l'un des constructeurs suivants :

FileWriter(Fichier fichier) FileWriter(Fichier fichier, ajout booléen) FileWriter(FileDescriptor fd) FileWriter(String fileName) FileWriter(String fileName, booléen ajout)

Ainsi, soit le chemin du fichier sous forme de chaîne, soit un objet File faisant référence à un fichier texte spécifique est transmis au constructeur. Le paramètre append spécifie si les données doivent être ajoutées à la fin du fichier (si le paramètre est vrai) ou si le fichier doit être écrasé.

Comme nous pouvons le voir, nous écrivons le chemin du fichier. Nous allons maintenant voir comment écrire et lire du texte dans un fichier. Nous pouvons l'afficher à l'écran ou même le transférer vers un autre fichier. Une fois le fichier terminé, la méthode read est renvoyée. Voyons un exemple, écrivez d'abord dans un fichier, puis lisez-le.

L'idée est d'ouvrir un fichier, d'écrire ou de lire et de fermer le fichier. Nous n'avons pas besoin de faire quoi que ce soit pour déplacer le pointeur de fichier, lorsque nous lisons automatiquement un caractère, le pointeur se déplace. Si nous exécutons le code, il n’écrira rien à l’écran, mais s’il écrit dans un fichier, la question est : pourquoi ? La réponse est que lorsqu'un flux est fermé, c'est comme si nous cliquions pour enregistrer graphiquement, c'est-à-dire que si nous ne fermons pas le flux, c'est comme si le fichier était vide. Nous devons également nous rappeler que cela se produit parce que nous lisons et modifions le même fichier en même temps.

Écrivons du texte dans le fichier :

Importer java.io.* ; public class FilesApp ( public static void main(String args) ( try(FileWriterwriter = new FileWriter("C:\\SomeDir\\notes3.txt", false)) ( // écrit la ligne entière String text = "Maman lavé le cadre, la mère a lavé le cadre du savon"; écrivain.write(text); // écriture par caractères écrivain.append("\n"); écrivain.append("E"); écrivain.flush(); ) catch( IOException ex)(System.out.println(ex.getMessage());

Le constructeur a utilisé le paramètre append avec la valeur false - c'est-à-dire que le fichier sera écrasé. Ensuite, à l’aide des méthodes définies dans la classe de base Writer, les données sont écrites.

Si nous ne le faisons pas, nous écraserons tout le fichier lorsque nous écrirons quelque chose de nouveau. Nous allons maintenant voir le même exemple ci-dessus mais en utilisant des méthodes. La lecture et l'écriture de fichiers par un programme peuvent être très utiles, ou servir de fichier de configuration, et éviter d'avoir à effectuer des modifications fréquentes code source le programme lui-même pour chaque scénario ou simplement pour alimenter et sortir des données.

Création d'un fichier pour la lecture et l'écriture

Dans cet exemple, le fichier a été créé à l'aide d'un seul, mais le même peut être créé dans tous les cas, c'est au lecteur de sélectionner meilleure façon création d'un fichier. Initialement, ce fichier est vide, comme indiqué ci-dessous.


La méthode de lecture a comme paramètre d'entrée le chemin d'accès au fichier qui sera lu, comme indiqué dans la signature de la méthode.

Lecture de fichiers. Classe FileReader

La classe FileReader hérite de classe abstraite Reader et fournit des fonctionnalités pour lire des fichiers texte.

Pour créer un objet FileReader, nous pouvons utiliser l'un de ses constructeurs :

FileReader (String fileName) FileReader (Fichier fichier) FileReader (FileDescriptor fd)

Et en utilisant les méthodes définies dans la classe de base Reader, lisez le fichier :

Archiver après avoir utilisé le projet

Cette méthode a une fonction d'insertion nouvelle ligne caractères dans un fichier texte.


La classe contient un méthode statique, qui a pour fonction de lancer le manipulateur de fichiers, en passant aux méthodes du même chemin de fichier à manipuler.





Nous commencerons par montrer comment lire caractère par caractère à partir d'un fichier. Ensuite nous verrons comment lire les lignes. Enfin, nous verrons comment lire n'importe quel octet d'un fichier, qu'il s'agisse de texte, de vidéo, de musique ou de contenu binaire.

Importer java.io.* ; classe publique FilesApp ( public static void main(String args) ( try(Fichier Lecteur lecteur= new FileReader("C:\\SomeDir\\notes3.txt")) ( // lit int c caractère par caractère; while((c=reader.read())!=-1)( System.out.print (( char)c); ) ) catch(IOException ex)( System.out.println(ex.getMessage()); ) ) )

Classe Déposer emballer java.io utilisé pour gérer les informations sur les fichiers et les répertoires. Au niveau système opérateur les fichiers et les répertoires présentent des différences significatives, mais en Java, ils sont décrits par une seule classe Déposer. Un répertoire en Java est traité comme fichier régulier, mais avec une propriété supplémentaire - une liste de noms de fichiers, qui peuvent être visualisés à l'aide de la méthode liste.

Lire et écrire un fichier

Notez que les choses sont similaires à la casse des caractères. Cela ouvre et positionne déjà le lecteur d'octets pointant vers le premier octet du fichier. Notre programme qui lit 1 octet. Autrement dit, nous avons maintenant plusieurs, plusieurs octets à lire. Félicitations pour avoir pris l'initiative de publier ce super contenu, continuez comme ça, ce site est très bien.

Pour fournir création fiable fichiers, l'application doit être configurée de manière à ce que fichiers générés avaient les permis les plus restrictifs. Il s'agit d'une configuration du système d'exploitation et doit être prise en compte lors de l'installation de l'application. Une fois le fichier créé, l'application doit alors gérer ses autorisations pour configurer les paramètres.

Selon la destination de l'objet Déposer- fichier ou répertoire, vous pouvez utiliser l'un des constructeurs pour créer un objet :

Fichier (chaîne chemin_vers_répertoire) ; Fichier (String chemin_répertoire, Chaîne nom_fichier) ; Fichier (répertoire de fichiers, nom de fichier String);

Exemples de création d'objets Fichier

// Crée un fichier pour le répertoire File dir = new File("C://dir_test"); // Crée un fichier pour les fichiers qui se trouvent dans le répertoire File file1 = new File("C://dir_test", "Hello1.txt"); Fichier file2 = nouveau fichier (rép, "Hello2.txt");

Dans les applications Web qui s'exécutent toujours sous le même utilisateur, il est important que seul cet utilisateur ait accès aux fichiers créés. Pour les applications qui échangent des informations via des fichiers, il est important que les autorisations soient les suivantes.

Vous devriez éviter d'utiliser des fichiers pour l'enregistrement diverses applications, chaque candidature doit écrire fichier séparé. Comme vous le verrez, écrire des fichiers texte est très similaire à leur lecture. Quelques observations peuvent être faites à partir de cet exemple. Enfin, méthode privée Appelé à libérer des ressources. Sur à l'heure actuelle les données sont écrites dans le fichier, et si elles existaient auparavant, elles sont complètement vidées, et les nouvelles données surchargent ainsi les anciennes. Si vous souhaitez ajouter au fichier, c'est-à-dire ouvrir fichier existant et ajoutez les données à la fin, utilisez un constructeur de classe différent comme indiqué dans l'exemple suivant et donc les données écrites seront ajoutées à la fin du fichier sans écraser le contenu existant.

Propriétés et méthodes de la classe File

Pour définir les propriétés de fichier standard dans une classe Déposer Il existe différentes méthodes. Cependant Fichier de classe asymétrique, c'est-à-dire des méthodes pour déterminer les propriétés d'un objet existent, mais les fonctions correspondantes pour modifier ces propriétés manquent.

FonctionsDescription
Chaîne getName()Le nom du fichier ou du répertoire.
Chaîne getParent()Le nom du répertoire parent.
longue longueur()Fonction pour déterminer la taille du fichier en octets.
Chaîne getAbsolutePath()Fonction de détermination chemin absolu fichier ou répertoire.
booléen supprimer()Suppression d'un fichier ou d'un répertoire.
le booléen existe()Vérifie l'existence d'un fichier ou d'un répertoire.
booléen isDirectory()Vérifier si cet objet catalogue.
booléen isFile()Vérifier si l'objet donné est un fichier.
longue dernièreModification()Fonction permettant de déterminer la date de la dernière modification d'un fichier.
booléen canRead()Vérifier si les données peuvent être lues à partir d'un fichier.
booléen canWrite()Vérifier si les données peuvent être écrites dans un fichier.
booléen isHidden()Vérifier si un répertoire ou un fichier est masqué.
Liste de chaînes()Lecture d'un tableau de noms de fichiers et de sous-répertoires.
Liste de fichiersFichiers()Lecture d'un tableau de fichiers et de sous-répertoires.
booléen mkdir()Création d'un nouveau répertoire.
renameTo booléen (destination du fichier)Renommez un fichier ou un répertoire.

Dans l'exemple suivant, ouvrez le fichier "d:/test/MyFile.txt" (Windows) et extrayez ses caractéristiques :

Concernant les méthodes d’écriture, évitez toujours d’utiliser des méthodes de haut niveau. Très souvent, on souhaite lister le contenu d'un répertoire pour connaître tous les fichiers et sous-répertoires qu'il contient. Un fichier pour afficher tous les fichiers et sous-répertoires qu'il contient.

Ces méthodes se bloquent et reviennent une fois que le contenu a été complètement chargé dans la table des résultats. Leur appel peut donc être long dans un répertoire contenant de nombreux fichiers et sous-répertoires. Attention : le tableau renvoyé sera vide si le répertoire est vide ; mais cela se produira si répertoire fait référence à un fichier plutôt qu'à un répertoire, ou si une erreur se produit pendant l'opération.

Importer java.io.Fichier ; classe publique FileTest ( public static void main(String args) ( File fl = new File("d:\\test\\MyFile.txt"); System.out.println("Nom du fichier : " + fl .getName() ); System.out.println("Chemin : " + fl.getPath()); System.out.println(" Chemin complet: " + fl.getAbsolutePath()); System.out.println ("Répertoire parent : " + fl.getParent()); System.out.println (fl.exists() ? "Le fichier existe" : "Le fichier n'existe pas "); System.out.println (fl.canWrite() ? "Propriété - peut être écrite" : "Propriété - ne peut pas être écrite"); System.out.println (fl.canRead() ? "Propriété - peut être lu" : " Propriété - ne peut pas être lu"); System.out.println ("Est-ce un répertoire ? " + (fl.isDirectory() ? "yes": " no")); System.out.println ("Est-ce un fichier normal ? " + ( fl.isFile() ? "yes" : "no")); System.out.println("Dernière modification du fichier : " + fl. lastModified()); out.println("Taille du fichier : " + fl. length() + "octets");

Les fichiers peuvent être utilisés pour produire une séquence itérée de fichiers et de sous-répertoires chemin cible. Fichiers pour effectuer cette opération. Il agit comme intermédiaire entre la source de données et la destination. Objets qui fonctionnent avec des flux d'entrée, pour lire des flux, objets qui fonctionnent avec des flux de sortie, pour écrire des flux. Voici une autre ligne de test.

Vous pouvez nommer votre fichier de la même manière que le type de texte. Vous remarquerez que cet objet est très simple à utiliser et que ses méthodes sont très explicites. Le résultat est incroyable ! Vous conviendrez que les méthodes de cet objet peuvent être très utiles ! Maintenant que vous en savez un peu plus sur cet objet, nous pouvons commencer à travailler avec notre fichier !

Les informations suivantes seront imprimées dans la console :

Nom du fichier : MyFile.txt Chemin : d:\test\MyFile.txt Chemin complet : d:\test\MyFile.txt Répertoire parent : d:\test Le fichier existe Propriété - peut être écrit Propriété - peut être lu S'agit-il d'un répertoire ? non Est-ce un fichier normal ? oui Dernière modification du fichier : 1441710053162 Taille du fichier : 12 octets

Interface du filtre de fichiers

Classe Déposer inclut une méthode pour lire une liste de certains fichiers uniquement.

Lire dans un fichier, écrire dans un fichier. . Comme vous l’avez probablement deviné, il existe une hiérarchie de classes pour l’intérieur et l’extérieur. Diriez-vous le contraire ? Comme beaucoup de gens au début. Mais seulement parce que vous trouvez des fils de discussion par rapport à vous, et non à votre programme !

Nous allons enfin commencer à travailler avec notre fichier. Ce code est assez complexe, alors accrochez-vous à votre clavier ! En revanche, si vous ouvrez un flux d'écriture sur un fichier inexistant, il sera créé automatiquement ! Merci de faire attention à l'import pour pouvoir utiliser ces objets.

L'image suivante montre la sortie de ce code.


Ainsi, un système de codage a été développé pour afficher et manipuler les symboles. Gardez à l'esprit que chaque caractère que vous saisissez ou lisez dans un fichier est un code binaire, et ceci code binaire est un code décimal. Tableau de correspondance. Cependant, cet encodage s'est avéré trop restrictif pour les langues avec des caractères accentués, c'est pourquoi un ensemble complet d'encodages de caractères a été créé pour surmonter ce problème. Lorsque nous définissons un tableau d'octets de 8 octets, cela signifie que nous lirons 8 octets à la fois.

Liste de fichiers publicsFichiers (filtre FileFilter)

Contrairement à la méthode du même nom, mais sans paramètre, cette méthode sélectionne uniquement les fichiers de répertoire qui satisfont à une certaine condition. Le paramètre filter est destiné à définir cette condition. Dans ce cas, le type de paramètre FiltreFichier- ce n'est pas une classe, mais une interface qui n'a qu'une seule méthode qui renvoie vrai si le fichier remplit certaines conditions, et faux dans le cas contraire.

Vous pouvez voir que dans chaque boucle notre tableau d'octets contient huit valeurs, chacune correspondant à code décimal, qui correspond au personnage. Vous pouvez voir que les processus de threading suivent la logique et la syntaxe exactes ! Lorsque nous avons copié notre fichier, nous avons reçu quelques octets du flux entrant, que nous avons transmis au flux sortant. À chaque cycle, les données lues à partir de fichier source, sont écrits dans un fichier défini comme une copie.

Il existe maintenant des objets beaucoup plus faciles à utiliser, mais ils fonctionnent avec les deux objets que nous venons d'apprendre, et ces objets font également partie de la hiérarchie mentionnée ci-dessus, mais il existe une superclasse qui les définit. Ces deux classes sont en réalité des classes abstraites.

Acceptation booléenne publique (chemin d'accès au fichier)

Méthode listeFichiers appellera la méthode accept pour chaque fichier du répertoire, et ceux pour lesquels accept renvoie true seront inclus dans la liste résultante. Le reste sera ignoré.

Pour utiliser FiltreFichier vous devez créer un objet et y définir la méthode correspondante accepter.

Class Filter implémente FileFilter ( String ext; Filter(String ext) ( this.ext = ext.split(","); ) private String getExtension(File pathname) ( String filename = pathname.getPath(); int i = filename. lastIndexOf("."); if ((i > 0) && (i< filename.length()-1)) { return filename.substring(i+1).toLowerCase(); } return ""; } public boolean accept(File pathname) { if (!pathname.isFile()) return false; String extension = getExtension(pathname); for (String e: ext) { if (e.equalsIgnoreCase(extension)) return true; } return false; } }

La figure suivante montre un diagramme de classes schématisant leur hiérarchie.


Puisque ces classes prennent une instance de leur superclasse comme paramètre, vous pouvez accumuler des filtres et obtenir des choses comme celle-ci. Pour implémenter les améliorations apportées par ces classes, nous allons lire un énorme fichier texte de la manière habituelle avec l'objet vu précédemment puis avec le tampon.

Voici maintenant le code qui permet de tester le temps de lecture. Et le résultat vu sur la photo suivante est encore une fois bluffant.

Vous conviendrez que l’utilisation d’un tampon peut grandement améliorer les performances de votre code. Testons sans plus attendre avec la lettre.

Exemple d'utilisation du filtre FileFilter

Importer java.io.Fichier ; importer java.io.FileFilter ; public class FileTest ( public static void main(String args) ( // Définir le répertoire de fichiers dir = new File("."); // Lecture liste complète fichiers du répertoire Fichier lst1 = dir.listFiles();

// Lecture d'une liste de fichiers répertoire avec les extensions "png" et "jpg" Fichier lst2 = dir.listFiles(new Filter("png,jpg"));

System.out.println("lst1.length = " + lst1.length + ", lst2.length = " + lst2.length); ) ) Ici, la différence est encore plus nette, comme le montre la figure suivante. Nous allons créer le fichier à partir de zéro afin de pouvoir le lire plus tard. Le résultat suivant correspond à la sortie de ce code.

Le code est simple, clair et concis. Vous voyez bien que ce type d’objet n’a aucune fonctionnalité ! Jusqu'à présent, nous travaillons uniquement avec

types primitifs

, mais il est aussi possible de travailler avec des objets ! Il faut savoir que lorsque l'on veut écrire des objets dans des fichiers, cela s'appelle "sérialisation" : c'est le nom de l'action de sauvegarde des objets ! Il est temps de sauver vos sujets d'une mort certaine ! Voici la classe avec laquelle nous allons travailler. De quel type d'interface s'agit-il ? Vous n'avez même pas implémenté la méthode !, qui est un héritier de la classe InputStream et implémente toutes ses méthodes. Constructeur de la classe FileInputStream :

FileInputStream (String fileName) lève FileNotFoundException

Si le fichier ne peut pas être ouvert, une exception FileNotFoundException est levée.

Un exemple de lecture de données à partir d'un fichier et d'affichage du contenu sur la console :

Importer java.io.FileInputStream ; public class FilesApp ( public static void main(String args) ( try ( FileInputStream fis = new FileInputStream("C:\\test_dir\\test.txt"); System.out.println("Taille du fichier : " + fis.available () + " octet(s)"); int i = -1; while((i = fis.read()) != -1)( System.out.print((char)i); ) fis.close (); ) catch(IOException e)( System.out.println(e.getMessage()); ) ) )

Tampon d'octets = nouvel octet ; // lit le fichier dans le tampon fis.read (buffer, 0, fis.available()); System.out.println("Contenu du fichier :"); pour (int je = 0; je< buffer.length; i++){ System.out.print((char)buffer[i]); }

Classe Il faut savoir que lorsque l'on veut écrire des objets dans des fichiers, cela s'appelle "sérialisation" : c'est le nom de l'action de sauvegarde des objets ! Il est temps de sauver vos sujets d'une mort certaine ! Voici la classe avec laquelle nous allons travailler. De quel type d'interface s'agit-il ? Vous n'avez même pas implémenté la méthode ! conçu principalement pour travailler avec des fichiers binaires. Il peut être utilisé pour travailler avec des fichiers texte, mais d'autres classes sont encore plus adaptées à cette tâche.

Exemple d'utilisation Il faut savoir que lorsque l'on veut écrire des objets dans des fichiers, cela s'appelle "sérialisation" : c'est le nom de l'action de sauvegarde des objets ! Il est temps de sauver vos sujets d'une mort certaine ! Voici la classe avec laquelle nous allons travailler. De quel type d'interface s'agit-il ? Vous n'avez même pas implémenté la méthode ! pour lire un fichier de propriétés en encodage UTF-8 :

Fichier de propriétés "data.properties" en codage UTF-8 :

# # Paramètres du serveur SMTP # company=Gestionnaire des cornes et des sabots=Ostap Bender

Exemple de liste :

Importer java.io.Reader ; importer java.io.IOException ; importer java.io.InputStream ; importer java.io.FileInputStream ; importer java.io.InputStreamReader ; importer java.util.Properties ; public class Main ( public static void main(String args) ( try ( InputStream is = new FileInputStream("data.properties"); if (is != null) ( Reader reader = new InputStreamReader(is, "UTF-8") ; Propriétés props = new Properties(); props.load(reader); System.out.println(props.getProperty("company") + ", " props.getProperty("manager") ); ) ( e.printStackTrace(); ) ) )

Écrire dans FileOutputStream

Classe FichierOutputStream, est dérivé de la classe OutputStream, il hérite donc de toutes ses fonctionnalités.

Un exemple d'écriture d'une ligne dans un fichier :

Importez java.io.FileOutputStream ; public class FilesApp ( public static void main(String args) ( String text = " Bonjour le monde!"; // chaîne à écrire try ( FileOutputStream fos = new FileOutputStream("C:\\test_dir\\test.txt"); // conversion de la chaîne en octets byte buffer = text.getBytes(); fos.write( buffer , 0, buffer.length); ) catch(IOException e)( System.out.println(e.getMessage()); ) ) )

Pour créer un objet FichierOutputStream on utilise un constructeur qui prend en paramètre le chemin d'accès au fichier à écrire. Pour écrire une chaîne, nous la traduisons d’abord en un tableau d’octets et utilisons la méthode write pour écrire la chaîne dans un fichier. Il n'est pas nécessaire d'écrire l'intégralité du tableau d'octets. Utilisation de la surcharge de méthode écrire(), vous pouvez également écrire un seul octet :

Fos.write(tampon); // écrit uniquement le premier octet

Un exemple de réécriture de contenu d'un fichier à un autre :

Importer java.io.FileInputStream ; importer java.io.FileOutputStream ; public class FilesApp ( public static void main(String args) ( try ( FileInputStream fis = new FileInputStream("C:\\test_dir\\test.txt"); FileOutputStream fos = new FileOutputStream("C:\\test_dir\\new .txt"); byte buffer = nouvel octet; // lit le tampon fis.read(buffer, 0, buffer.length); // écrit du tampon dans le fichier fos.write(buffer, 0, buffer.length) ; fis. close(); fos.close(); ) catch(IOException e)( System.out.println(e.getMessage()); ) )

Classe FichierOutputStream destiné principalement à l'enregistrement fichiers binaires. Il peut être utilisé pour travailler avec des fichiers texte, mais d'autres classes sont encore plus adaptées à cette tâche.



Des questions ?

Signaler une faute de frappe

Texte qui sera envoyé à nos rédacteurs :