Lecture d'une ligne à un numéro de ligne donné à partir d'un fichier en Java

1. Vue d'ensemble

Dans cet article rapide, nous allons examiner différentes manières de lire une ligne à un numéro de ligne donné dans un fichier.

2. Fichier d'entrée

Commençons par créer un simple fichier nommé inputLines.txt que nous utiliserons dans tous nos exemples:

Line 1 Line 2 Line 3 Line 4 Line 5

3. Utilisation de BufferedReader

Regardons la classe BufferedReader bien connue et son avantage de ne pas stocker l'intégralité du fichier en mémoire.

On peut lire un fichier ligne par ligne et s'arrêter quand on le souhaite:

@Test public void givenFile_whenUsingBufferedReader_thenExtractedLineIsCorrect() { try (BufferedReader br = Files.newBufferedReader(Paths.get(FILE_PATH))) { for (int i = 0; i < 3; i++) { br.readLine(); } String extractedLine = br.readLine(); assertEquals("Line 4", extractedLine); } }

4. Utilisation du scanner

Une autre approche similaire que nous pouvons adopter consiste à utiliser un scanner :

@Test public void givenFile_whenUsingScanner_thenExtractedLineIsCorrect() { try (Scanner scanner = new Scanner(new File(FILE_PATH))) { for (int i = 0; i < 3; i++) { scanner.nextLine(); } String extractedLine = scanner.nextLine(); assertEquals("Line 4", extractedLine); } }

Bien que sur de petits fichiers, la différence entre BufferedReader et Scanner puisse ne pas être perceptible, sur des fichiers plus volumineux, le Scanner sera plus lent car il analyse également et a une taille de tampon plus petite.

5. Utilisation de l'API File

5.1. Petits fichiers

Nous pouvons utiliser Files.readAllLines () de l'API File pour lire facilement le contenu d'un fichier en mémoire et extraire la ligne souhaitée:

@Test public void givenSmallFile_whenUsingFilesAPI_thenExtractedLineIsCorrect() { String extractedLine = Files.readAllLines(Paths.get(FILE_PATH)).get(4); assertEquals("Line 5", extractedLine); }

5.2. Fichiers volumineux

Si nous devons travailler avec des fichiers volumineux, nous devons utiliser la méthode lines , qui renvoie un Stream afin de pouvoir lire le fichier ligne par ligne:

@Test public void givenLargeFile_whenUsingFilesAPI_thenExtractedLineIsCorrect() { try (Stream lines = Files.lines(Paths.get(FILE_PATH))) { String extractedLine = lines.skip(4).findFirst().get(); assertEquals("Line 5", extractedLine); } }

6. Utilisation d'Apache Commons IO

Une autre option consiste à utiliser la classe FileUtils du package commons-io , qui lit le fichier entier et renvoie les lignes sous forme de liste de chaînes :

@Test public void givenFile_whenUsingFileUtils_thenExtractedLineIsCorrect() { ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("linesInput.txt").getFile()); List lines = FileUtils.readLines(file, "UTF-8"); String extractedLine = lines.get(0); assertEquals("Line 1", extractedLine); }

Nous pouvons également utiliser la classe IOUtils pour obtenir le même résultat, sauf que cette fois, tout le contenu est renvoyé sous forme de chaîne , et nous devons faire le fractionnement nous-mêmes:

@Test public void givenFile_whenUsingIOUtils_thenExtractedLineIsCorrect() { String fileContent = IOUtils.toString(new FileInputStream(FILE_PATH), StandardCharsets.UTF_8); String extractedLine = fileContent.split(System.lineSeparator())[0]; assertEquals("Line 1", extractedLine); }

7. Conclusion

Dans cet article rapide, nous avons passé en revue les façons les plus courantes de lire une ligne à un numéro de ligne donné à partir d'un fichier.

Comme d'habitude, les exemples sont disponibles à l'adresse over sur GitHub.