Comment lire une ligne spécifique en utilisant le numéro de ligne spécifique à partir d'un fichier en Java?
En Java, il n'existe aucune méthode pour lire une ligne en particulier à partir d'un fichier? Par exemple, lire en ligne 32 ou tout autre numéro de ligne.
- Je sais que je suis très en retard, mais au cas où quelqu'un trouve cette question: Notez qu'un fichier est simplement une suite d'octets. Et un retour à la ligne est juste un personnage(deux sur Windows), et d'un caractère est juste un(ou plus, selon le codage) octet. Et, sans avoir un indice de la position d'un octet dans un fichier, la seule façon de savoir où ces octets sont est de le lire et de regarder pour cela. (cela ne signifie pas que vous devez charger tout le fichier en mémoire tout de même).
Vous devez vous connecter pour publier un commentaire.
Sauf si vous avez les connaissances sur les lignes dans le fichier, il n'y a aucun moyen d'accéder directement au 32e de ligne sans lire les 31 lignes précédentes.
Que c'est vrai pour toutes les langues et tous les systèmes de fichiers modernes.
Donc, effectivement vous suffit de lire les lignes jusqu'à ce que vous avez trouvé la 32e un.
Java 8 solution:
Pour les petits fichiers:
Pour les gros fichiers:
Pas que je sache, mais ce que vous pourriez faire est de faire une boucle par les 31 premières lignes ne rien faire à l'aide de la readline() la fonction de BufferedReader
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:
http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#readLines(java.io.Fichier, java.lang.String)
Vous pouvez essayer indexé-fichier-lecteur de (Licence Apache 2.0). La classe IndexedFileReader a une méthode appelée readLines(int, int) qui renvoie une SortedMap dont la clé est le numéro de la ligne et de la valeur est la ligne qui a été lu.
Exemple:
L'exemple ci-dessus lit un fichier texte composé de 50 lignes dans le format suivant:
Clause de non-responsabilité: j'ai écrit cette bibliothèque
Bien que, comme dit dans d'autres réponses, il n'est pas possible d'obtenir à la ligne exacte sans connaître le décalage ( pointeur ) avant. Donc, j'ai atteint cet objectif en créant un index temporaire de fichier qui stocke les valeurs de décalage de chaque ligne. Si le fichier est assez petit, vous pouvez simplement stocker les index ( offset ) de la mémoire sans avoir besoin d'un fichier distinct pour elle.
Également visiter le java docs pour plus d'informations:
https://docs.oracle.com/javase/8/docs/api/java/io/RandomAccessFile.html#mode
Complexité : C'est O(n) car il lit tout le fichier une fois. S'il vous plaît être conscient pour les besoins de mémoire. Si c'est trop gros pour être dans la mémoire, puis faire un fichier temporaire qui stocke les décalages au lieu de ArrayList comme indiqué ci-dessus.
Note : Si tout ce que vous voulez dans '32' ligne, vous avez juste à appeler la readLine() disponible également via d'autres classes '32' fois. L'approche ci-dessus est utile si vous voulez obtenir une ligne spécifique (basé sur le numéro de ligne de cours) plusieurs fois.
Merci !
Non, à moins que dans ce format de fichier les longueurs de ligne sont pré-déterminée (par exemple, toutes les lignes avec une longueur fixe), vous trouverez à la parcourir ligne par ligne pour les compter.
D'une autre manière.
Si vous parlez d'un fichier texte, puis il n'y a vraiment aucun moyen de le faire sans lire toutes les lignes qui précèdent celui - Après tout, les lignes sont déterminés par la présence d'un saut de ligne, de sorte qu'il a à lire.
Utiliser un ruisseau qui prend en charge readline, et il suffit de lire le premier X-1 lignes et vider les résultats, puis la suivante.
Dans Java 8,
Pour les petits fichiers:
Pour les gros fichiers:
Dans Java 7
Source: La lecture de la nième ligne à partir d'un fichier
Ça fonctionne pour moi:
J'ai combiné la réponse de
Lire un simple fichier texte
Mais au lieu de retourner une Chaîne, je suis de retour d'une LinkedList de Chaînes de caractères. Ensuite, je peux sélectionner la ligne que je veux.
Utiliser ce code:
Vous pouvez utiliser LineNumberReader au lieu de BufferedReader. Passer par l'api. Vous pouvez trouver setLineNumber et getLineNumber méthodes.
Vous pouvez aussi jeter un oeil à LineNumberReader, sous-classe BufferedReader. Avec la méthode readline, il a aussi des méthodes setter/getter pour accéder à la ligne de nombre. Très utile pour garder une trace du nombre de lignes de lecture, pendant la lecture de données à partir d'un fichier.
vous pouvez utiliser le skip() fonction pour sauter les lignes de début.
Ils sont tous mal, j'ai juste écrit ce en environ 10 secondes.
Avec cela j'ai réussi à tout appel de l'objet.getQuestion("linenumber") dans la méthode main de retourner n'importe quelle ligne je veux.