Comment lire un fichier en Java

Comment lire un fichier en Java

1. introduction

Dans cet article, nous verrons comment lire un fichier à partir d'un chemin de classe, d'une URL ou à l'intérieur d'un fichier JAR, à l'aide de classes Java standard.

Lectures complémentaires:

Java - Créer un fichier

Comment créer un fichier en Java avec JDK 6, JDK 7 avec NIO ou Commons IO.

Read more

Java - Écrire dans un fichier

Les nombreuses façons d'écrire des données dans un fichier à l'aide de Java.

Read more

2. Installer

Nous utiliserons un ensemble d'exemples de test utilisant uniquement les classes Java de base, et dans les tests, nous utiliserons des assertions utilisant les correspondancesHamcrest.

Les tests partageront une méthode commune dereadFromInputStream qui transforme unInputStream toString pour une affirmation plus facile des résultats:

private String readFromInputStream(InputStream inputStream)
  throws IOException {
    StringBuilder resultStringBuilder = new StringBuilder();
    try (BufferedReader br
      = new BufferedReader(new InputStreamReader(inputStream))) {
        String line;
        while ((line = br.readLine()) != null) {
            resultStringBuilder.append(line).append("\n");
        }
    }
  return resultStringBuilder.toString();
}

Notez qu'il existe d'autres moyens d'obtenir le même résultat. Vous pouvez consulterthis article pour quelques alternatives.

3. Lire le fichier depuis Classpath

Cette section explique comment lire un fichier disponible sur un chemin de classe. Nous lirons les «fileTest.txt» disponibles soussrc/main/resources:

@Test
public void givenFileNameAsAbsolutePath_whenUsingClasspath_thenFileData() {
    String expectedData = "Hello World from fileTest.txt!!!";

    Class clazz = FileOperationsTest.class;
    InputStream inputStream = clazz.getResourceAsStream("/fileTest.txt");
    String data = readFromInputStream(inputStream);

    Assert.assertThat(data, containsString(expectedData));
}

Dans l'extrait de code ci-dessus, nous avons utilisé la classe actuelle pour charger un fichier à l'aide degetResourceAsStream method et avons passé le chemin absolu du fichier à charger.

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

ClassLoader classLoader = getClass().getClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("fileTest.txt");
String data = readFromInputStream(inputStream);

On obtient leclassLoader de la classe courante en utilisantgetClass().getClassLoader().

La principale différence est que lors de l'utilisation de l'instancegetResourceAsStream fils aClassLoader instance, le chemin est traité comme absolu à partir de la racine du chemin de classe.

Lorsqu'il est utilisé avec une instanceClass , , le chemin peut être relatif au package, ou un chemin absolu, qui est indiqué par la barre oblique.

Of course, note that in practice, open streams should always be closed, comme lesInputStream dans notre exemple:

InputStream inputStream = null;
try {
    File file = new File(classLoader.getResource("fileTest.txt").getFile());
    inputStream = new FileInputStream(file);

    //...
}
finally {
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4. Lire le fichier avec JDK7

Dans JDK7, le package NIO a été mis à jour de manière significative. Regardons un exemple utilisant la classeFiles et la méthodereadAllBytes. La méthodereadAllBytes accepte une classePath. Path peut être considérée comme une mise à niveau desjava.io.File avec quelques opérations supplémentaires en place:

@Test
public void givenFilePath_whenUsingFilesReadAllBytes_thenFileData() {
   String expectedData = "Hello World from fileTest.txt!!!";

   Path path = Paths.get(getClass().getClassLoader()
     .getResource("fileTest.txt").toURI());
   byte[] fileBytes = Files.readAllBytes(path);
   String data = new String(fileBytes);

   Assert.assertEquals(expectedData, data.trim());
}

Cette méthode offre également un moyen pratique de lire le contenu d'un fichier dans unString.

5. Lire le fichier avec JDK8

JDK8 propose la méthodelines() dans la classeFiles. Il renvoie unStream d'éléments String.

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

@Test
public void givenFilePath_whenUsingFilesLines_thenFileData() {
    String expectedData = "Hello World from fileTest.txt!!!";

    Path path = Paths.get(getClass().getClassLoader()
      .getResource("fileTest.txt").toURI());

    Stream lines = Files.lines(path);
    String data = lines.collect(Collectors.joining("\n"));
    lines.close();

    Assert.assertEquals(expectedData, data.trim());
}

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

Comme nous pouvons le voir, l'APIFiles offre un autre moyen simple de lire le contenu du fichier dans un fichierString.

6. Lire le fichier avec FileUtils

Une autre option courante consiste à utiliser la classeFileUtils du packagecommons. Nous devrons ajouter la dépendance suivante:


    commons-io
    commons-io
    2.5

Assurez-vous de vérifier la dernière version de dépendancehere.

Le code de lecture du fichier peut ressembler à:

@Test
public void givenFileName_whenUsingFileUtils_thenFileData() {
    String expectedData = "Hello World from fileTest.txt!!!";

    ClassLoader classLoader = getClass().getClassLoader();
    File file = new File(classLoader.getResource("fileTest.txt").getFile());
    String data = FileUtils.readFileToString(file, "UTF-8");

    Assert.assertEquals(expectedData, data.trim());
}

Ici, nous passons l'objetFile à la méthodereadFileToString() de la classeFileUtils. Cette classe utilitaire parvient à charger le contenu sans avoir à écrire de code standard pour créer une instanceInputStream et lire les données.

7. Lire le fichier avecIOUtils

Une autre option courante consiste à utiliser la classeIOUtils du packagecommons. Vous devrez ajouter la même dépendancecommon-io que celle mentionnée dans l'exempleFileUtils précédent.

Jetons un coup d'œil à un exemple d'utilisation:

@Test
public void givenFileName_whenUsingIOUtils_thenFileData() {
    String expectedData = "This is a content of the file";

    FileInputStream fis = new FileInputStream("src/test/resources/fileToRead.txt");
    String data = IOUtils.toString(fis, "UTF-8");

    assertEquals(expectedData, data.trim());
}

Ici, nous passons l'objetFileInputStream à la méthodetoString() de la classeIOUtils. Cette classe utilitaire parvient à charger le contenu sans avoir à écrire de code standard pour créer une instanceInputStream et lire les données.

8. Lire le contenu de l'URL

Pour lire le contenu de l'URL, nous utiliserons l'URL «/» dans notre exemple comme suit:

@Test
public void givenURLName_whenUsingURL_thenFileData() {
    String expectedData = "example";

    URL urlObject = new URL("/");
    URLConnection urlConnection = urlObject.openConnection();
    InputStream inputStream = urlConnection.getInputStream();
    String data = readFromInputStream(inputStream);

    Assert.assertThat(data, containsString(expectedData));
}

Il existe également d'autres moyens de se connecter à une URL. Ici, nous avons utilisé les classesURL etURLConnection disponibles dans le SDK standard.

9. Lire un fichier à partir d'un JAR

Pour lire un fichier situé dans un fichier JAR, nous aurons besoin d’un fichier JAR contenant un fichier. Pour notre exemple, nous lirons «LICENSE.txt» du fichier «hamcrest-library-1.3.jar»:

@Test
public void givenFileName_whenUsingJarFile_thenFileData() {
    String expectedData = "BSD License";

    Class clazz = Matchers.class;
    InputStream inputStream = clazz.getResourceAsStream("/LICENSE.txt");
    String data = readFromInputStream(inputStream);

    Assert.assertThat(data, containsString(expectedData));
}

Ici, nous voulons chargerLICENSE.txt qui réside dans la bibliothèque Hamcrest, nous allons donc utiliser la classeMatcher’s qui aide à obtenir une ressource. Le même fichier peut également être chargé à l'aide du chargeur de classes.

10. Conclusion

Dans ce didacticiel, nous avons vu comment lire un fichier à partir de différents emplacements tels que le chemin de classe, l'URL ou les fichiers jar.

Nous avons également vu plusieurs façons de lire le contenu d'un fichier.

Vous pouvez trouver le code source dans lesGitHub repo suivants.