Comment lire un fichier en Java

Présentation

Dans ce didacticiel, nous allons explorer différentes manières de lire à partir d’un fichier en Java .

Premièrement, nous allons apprendre à charger un fichier à partir du chemin de classe, d’une URL ou d’un fichier JAR en utilisant des classes Java standard.

Deuxièmement, nous allons voir comment pour lire le contenu avec BufferedReader, Scanner, StreamTokenizer, DataInputStream, SequenceInputStream et FileChannel. Nous verrons également comment lire un fichier encodé en UTF-8.

Enfin, nous explorerons les nouvelles techniques de chargement et lire un fichier en Java 7 et Java 8.

Cet article fait partie de la série « Java – Back to Basic » sur Baeldung.

Lectures complémentaires:

Java – Créer un fichier

Comment créer un fichier en Java en utilisant JDK 6, JDK 7 avec NIO ou Commons IO.
En savoir plus →

Java – Écrire dans un fichier

Les nombreuses façons d’écrire des données dans un fichier à l’aide de Java.
En savoir plus →

Configuration

2.1 Fichier d’entrée

Dans la plupart des exemples de cet article, nous allons lire un fichier texte avec le nom de fichier fileTest.txt qui contient une ligne:

Pour quelques exemples, nous utiliserons un fichier différent; dans ces cas, nous mentionnerons explicitement le fichier et son contenu.

2.2 Méthode d’assistance

Nous utiliserons un ensemble d’exemples de test avec core Classes Java uniquement, et dans les tests, nous utiliserons des assertions avec des correspondants Hamcrest.

Les tests partageront une méthode readFromInputStream commune qui transforme un InputStream en String pour une affirmation plus facile des résultats:

Notez qu’il existe d’autres moyens d’atteindre ce même résultat. Nous pouvons consulter cet article pour quelques alternatives.

Lire un fichier à partir du chemin de classe

3.1 . Utilisation de Java standard

Cette section explique comment lire un fichier disponible sur un chemin de classe. Nous allons lire le « fileTest.txt » disponible sous src / main / resources :

Dans l’extrait de code ci-dessus, nous avons utilisé la classe actuelle pour charger un fichier en utilisant la méthode getResourceAsStream et avons passé le chemin absolu du fichier à charger.

La même méthode est disponible sur une instance ClassLoader également:

Nous obtenons le classLoa der de la classe actuelle en utilisant getClass (). getClassLoader ().

La principale différence est que lors de l’utilisation de getResourceAsStream sur une instance de ClassLoader, le chemin est traité comme absolu à partir de la racine du chemin de classe.

Lorsqu’il est utilisé avec une instance de classe, le chemin peut être relatif au package, ou un chemin absolu, qui est indiqué par la barre oblique principale.

Bien sûr, notez qu’en pratique , les flux ouverts doivent toujours être fermés, comme le InputStream dans notre exemple:

3.2. Utilisation de la bibliothèque commons-io

Une autre option courante consiste à utiliser la classe FileUtils du paquet commons-io:

Ici, nous passons l’objet File au méthode readFileToString () de la classe FileUtils. Cette classe utilitaire parvient à charger le contenu sans avoir besoin d’écrire de code standard pour créer une instance InputStream et lire des données.

La même bibliothèque propose également la classe IOUtils:

Ici, nous passez l’objet FileInputStream à la méthode toString () de la classe IOUtils. Cette classe utilitaire agit de la même manière que la précédente pour créer une instance InputStream et lire des données.

Lecture avec BufferedReader

Maintenant, laissez  » s se concentrent sur différentes manières d’analyser le contenu d’un fichier.

Nous allons commencer par une façon simple de lire un fichier en utilisant BufferedReader:

Notez que readLine () retournera null lorsque la fin du fichier est atteinte.

Lecture à partir d’un fichier à l’aide de Java NIO

Dans JDK7, le package NIO a été considérablement mis à jour.

Regardons un exemple utilisant la classe Files et la méthode readAllLines. La méthode readAllLines accepte un Path.

La classe Path peut être considérée comme une mise à jour du fichier java.io.File avec quelques opérations supplémentaires en place.

5.1. Lire un petit fichier

Le code suivant montre comment lire un petit fichier en utilisant la nouvelle classe Files:

Notez que nous pouvons utiliser la fonction readAllBytes () méthode également si nous avons besoin de données binaires.

5.2. Lecture d’un gros fichier

Si nous voulons lire un gros fichier avec la classe Files, nous pouvons utiliser BufferedReader.

Le code suivant lit le fichier en utilisant la nouvelle classe Files et BufferedReader:

5.3. Lire un fichier en utilisant Files.lines ()

JDK8 propose la méthode lines () dans la classe Files. Il renvoie un flux d’éléments String.

Voyons un exemple de lecture des données en octets et de décodage à l’aide du jeu de caractères UTF-8.

Le code suivant lit le fichier en utilisant le nouveau Files.lines ():

En utilisant Stream avec des canaux IO comme les opérations sur les fichiers, nous devons fermer le flux explicitement en utilisant la méthode close ().

Comme nous pouvons le voir, l’API Files offre un autre moyen simple de lire le contenu du fichier dans une chaîne.

Dans les sections suivantes, nous examinerons d’autres méthodes moins courantes de lire un fichier qui peut être approprié dans certaines situations.

Lecture avec un scanner

Ensuite, utilisons un scanner pour lire le fichier. Ici, nous allons utiliser un espace blanc comme délimiteur:

Notez que le délimiteur par défaut est l’espace blanc, mais plusieurs délimiteurs peuvent être utilisés avec un Scanner.

La classe Scanner est utile lors de la lecture contenu de la console, ou lorsque le contenu contient des valeurs primitives, avec un délimiteur connu (par exemple: une liste d’entiers séparés par un espace).

Lecture avec StreamTokenizer

Maintenant, lisons un fichier texte en jetons en utilisant un StreamTokenizer.

Le tokenizer fonctionne en déterminant d’abord quel est le prochain jeton, String ou nombre. Nous faisons cela en regardant le champ tokenizer.ttype.

Ensuite, nous lirons le jeton réel basé sur ce type:

  • tokenizer.nval – si le type était un nombre
  • tokenizer.sval – si le type était une chaîne

Dans cet exemple, nous utiliserons un fichier d’entrée différent qui contient simplement:

Le code suivant lit dans le fichier à la fois la chaîne et le numéro:

Notez comment le jeton de fin de fichier est utilisé à la fin.

Cette approche est utile pour analyser un flux d’entrée en jetons.

Lecture avec DataInputStream

Nous pouvons utiliser DataInputStream pour lire des binaires ou les types de données primitifs d’un fichier.

Le test suivant lit le fichier à l’aide d’un DataInputStream:

Lecture avec FileChannel

Si nous lisent un fichier volumineux, FileChannel peut être plus rapide que IO standard.

Le code suivant lit les octets de données du fichier en utilisant FileChannel et RandomAccessFile:

Lecture d’un encodage UTF-8 Fichier ed

Voyons maintenant comment lire un fichier encodé en UTF-8 en utilisant BufferedReader. Dans cet exemple, nous lirons un fichier contenant des caractères chinois:

Lecture du contenu depuis une URL

Pour lire le contenu depuis une URL, nous utiliserons URL « / » dans notre exemple:

Il existe également d’autres moyens de se connecter à une URL. Ici, nous avons utilisé l’URL et la classe URLConnection disponibles dans le SDK standard.

Lire un fichier à partir d’un JAR

Pour lire un fichier qui se trouve dans un JAR, nous aurons besoin d’un JAR avec un fichier à l’intérieur. Pour notre exemple, nous lirons « LICENSE.txt » du fichier « hamcrest-library-1.3.jar »:

Ici, nous voulons charger LICENSE.txt qui réside dans la bibliothèque Hamcrest, nous allons donc utiliser la classe de Matcher qui aide à obtenir une ressource. Le même fichier peut également être chargé en utilisant le classloader.

Conclusion

Comme nous pouvons le voir, il existe de nombreuses possibilités pour charger un fichier et en lire des données en utilisant Java ordinaire.

Nous pouvons charger un fichier à partir de divers emplacements comme le chemin de classe, l’URL ou les fichiers jar.

Ensuite, nous peut utiliser BufferedReader pour lire ligne par ligne, Scanner pour lire à l’aide de différents délimiteurs, StreamTokenizer pour lire un fichier en jetons, DataInputStream pour lire les données binaires et les types de données primitifs, SequenceInput Stream pour lier plusieurs fichiers en un seul flux, FileChannel pour lire plus rapidement à partir de grands fichiers, etc.

Write a Comment

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *