5 votes

Java lit la nième ligne

J'essaie de lire une ligne spécifique d'un fichier texte, mais je ne veux pas charger le fichier en mémoire (il peut devenir très gros).

J'ai cherché mais tous les exemples que j'ai trouvés nécessitent soit de lire chaque ligne (ce qui ralentirait mon code car il y a plus de 100 000 lignes), soit de charger le tout dans un tableau et de récupérer l'élément correct (le fichier aura beaucoup de lignes à saisir).

Un exemple de ce que je veux faire :

String line = File.getLine(5);

"le code n'est pas du code réel, il est fait pour montrer le principe de ce que je veux"

Y a-t-il un moyen de le faire ?

-----Edit-----

Je viens de réaliser que ce fichier sera écrit aussi entre les lignes de lecture (en ajoutant à la fin du fichier).

12voto

Jon Skeet Points 692016

Y a-t-il un moyen de le faire ?

Non, sauf si les lignes ont un nombre fixe d'octets chacune, non.

Tu n'as pas besoin de faire garder chaque ligne en mémoire - mais vous devez lire tout le fichier pour arriver à la ligne que vous voulez, sinon vous ne saurez pas où commencer la lecture.

4voto

KyleM Points 1934

Vous doivent lire le fichier ligne par ligne. Sinon, comment savez-vous que vous êtes arrivé à la ligne 5 (comme dans votre exemple) ?

Edita:

Vous pouvez également consulter Fichiers à accès aléatoire ce qui peut être utile si vous connaissez le nombre d'octets par ligne, comme l'a dit Jon Skeet.

3voto

Diego Points 27

Le moyen le plus simple d'y parvenir est d'utiliser un BufferedReader ( http://docs.oracle.com/javase/1.5.0/docs/api/java/io/BufferedReader.html ), car vous pouvez spécifier la taille de votre tampon. Vous pourriez faire quelque chose comme :

BufferedReader in = new BufferedReader(new FileReader("foo.in"), 1024) ;

in.readLine();
in.readLine();
in.readLine();
in.readLine();
String line = in.readLine();

2voto

rob Points 3107

1) lire une ligne que l'utilisateur sélectionne,

Si vous n'avez besoin de lire une ligne sélectionnée par l'utilisateur qu'une seule fois ou rarement (ou si le fichier est suffisamment petit), il vous suffit de lire le fichier ligne par ligne depuis le début, jusqu'à ce que vous arriviez à la ligne sélectionnée.

Si, par contre, vous avez besoin de lire fréquemment une ligne sélectionnée par l'utilisateur, vous devez construire un index des numéros de ligne et des décalages. Ainsi, par exemple, la ligne 42 correspond à un décalage de 2347 octets dans le fichier. L'idéal serait donc de ne lire le fichier entier qu'une seule fois et de stocker l'index, par exemple dans une carte, en utilisant les numéros de ligne comme clés et les décalages comme valeurs.

2) lire les nouvelles lignes ajoutées depuis depuis la dernière lecture. Je prévois de lire le fichier toutes les 10 secondes. le nombre de lignes et je peux trouver les numéros des nouvelles lignes mais je dois lire cette ligne

Pour le deuxième point, vous pouvez simplement enregistrer le décalage actuel dans le fichier au lieu d'enregistrer le numéro de ligne actuel - mais il ne serait certainement pas mauvais de continuer à construire l'index si cela continue à fournir un avantage significatif en termes de performance.

  1. Utilisez RandomAccessFile.seek(long offset) pour placer le pointeur du fichier à l'offset le plus récemment enregistré (confirmez d'abord que le fichier est plus long que l'offset le plus récemment enregistré - si ce n'est pas le cas, rien de nouveau n'a été ajouté).
  2. Utilisez RandomAccessFile.readLine() pour lire une ligne du fichier.
  3. Appelez RandomAccessFile.getFilePointer() pour obtenir le décalage actuel après la lecture de la ligne et éventuellement mettre(currLineNo+1, décalage) dans l'index.
  4. Répétez les étapes 2-3 jusqu'à ce que vous atteigniez la fin du fichier.

Mais ne vous laissez pas emporter par l'optimisation des performances, à moins que celles-ci ne soient déjà un problème ou qu'il soit fort probable qu'elles le deviennent.

1voto

youhans Points 788

Pour les petits fichiers :

String line = Files.readAllLines(Paths.get("file.txt")).get(n);

Pour les fichiers volumineux :

String line;
try (Stream<String> lines = Files.lines(Paths.get("file.txt"))) {
    line = lines.skip(n).findFirst().get();
}

Java 7 :

String line;
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    for (int i = 0; i < n; i++)
        br.readLine();
    line = br.readLine();
}

Fuente: Lecture de la nième ligne du fichier

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