105 votes

En Java, comment lire dans un fichier une ligne spécifique, à partir du numéro de ligne?

En Java, existe-t-il une méthode permettant de lire une ligne particulière d'un fichier, par exemple, la ligne 32?

81voto

Joachim Sauer Points 133411

Si vous ne connaissez pas les lignes du fichier, vous ne pouvez pas accéder directement à la 32e ligne sans lire les 31 lignes précédentes.

Cela est vrai pour toutes les langues et tous les systèmes de fichiers modernes.

Donc, effectivement, vous lirez simplement les lignes jusqu'à ce que vous ayez trouvé la 32e.

40voto

Chris Thompson Points 18375

Pas à ma connaissance, mais ce que vous pourriez faire est de parcourir les 31 premières lignes sans rien faire à l'aide de la fonction readline () de BufferedReader

 FileInputStream fs= new FileInputStream("someFile.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fs));
for(int i = 0; i < 30; ++i)
  br.readLine();
String lineIWant = br.readLine();
 

15voto

Charlie Collins Points 4942

Joachim est à droite sur la, bien sûr, et un autre de mise en œuvre de Chris (pour les petits fichiers seulement parce qu'il charge le fichier complet) pourrait être d'utiliser commons-io de Apache (bien que sans doute vous pourriez ne pas vouloir introduire une nouvelle dépendance juste pour ça, si vous le trouvez utile pour d'autres trucs trop bien, elle pourrait avoir un sens).

Par exemple:

String line32 = (String) FileUtils.readLines(file).get(31);

http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#readLines(java.io.File, java.lang.Chaîne de caractères)

12voto

jramoyo Points 133

Vous pouvez essayer de indexés-fichier-reader (Licence Apache 2.0). La classe IndexedFileReader a une méthode readLines(int, int) qui retourne un SortedMap dont la clé est le numéro de la ligne et de la valeur est la ligne qui a été lu.

Exemple:

File file = new File("src/test/resources/file.txt");
reader = new IndexedFileReader(file);

lines = reader.readLines(6, 10);
assertNotNull("Null result.", lines);
assertEquals("Incorrect length.", 5, lines.size());
assertTrue("Incorrect value.", lines.get(6).startsWith("[6]"));
assertTrue("Incorrect value.", lines.get(7).startsWith("[7]"));
assertTrue("Incorrect value.", lines.get(8).startsWith("[8]"));
assertTrue("Incorrect value.", lines.get(9).startsWith("[9]"));
assertTrue("Incorrect value.", lines.get(10).startsWith("[10]"));      

L'exemple ci-dessus lit un fichier texte composé de 50 lignes dans le format suivant:

[1] The quick brown fox jumped over the lazy dog ODD
[2] The quick brown fox jumped over the lazy dog EVEN

Clause de non-responsabilité: j'ai écrit cette bibliothèque

2voto

Uri Points 50687

Si vous parlez d'un fichier texte, il n'y a vraiment aucun moyen de le faire sans lire toutes les lignes qui le précèdent - Après tout, les lignes sont déterminées par la présence d'une nouvelle ligne, elle doit donc être lue.

Utilisez un flux prenant en charge readline, lisez simplement les premières lignes X-1 et exportez les résultats, puis traitez la suivante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X