Comment lire une ligne spécifique en utilisant le numéro de ligne spécifique d’un fichier en Java?

En Java, existe-t-il une méthode pour lire une ligne particulière à partir d’un fichier? Par exemple, lisez la ligne 32 ou tout autre numéro de ligne.

Sauf si vous avez déjà eu connaissance des lignes du fichier, vous ne pouvez pas accéder directement à la 32ème ligne sans lire les 31 lignes précédentes.

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

Si bien que vous allez simplement lire les lignes jusqu’à ce que vous trouviez la 32ème.

Solution Java 8:

Pour les petits fichiers:

Ssortingng line32 = Files.readAllLines(Paths.get("file.txt")).get(32) 

Pour les gros fichiers:

 try (Stream lines = Files.lines(Paths.get("file.txt"))) { line32 = lines.skip(31).findFirst().get(); } 

Pas que je sache, mais ce que vous pourriez faire est de parcourir les 31 premières lignes sans rien faire en utilisant la fonction readline () de BufferedReader.

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

Joachim est bien sûr sur, et une implémentation alternative à Chris (pour les petits fichiers uniquement parce qu’il charge l’intégralité du fichier) pourrait être d’utiliser commons-io d’Apache (même si vous ne voudrez peut-être pas ceci, si vous le trouvez utile pour d’autres choses aussi, ça pourrait avoir du sens).

Par exemple:

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

http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html#readLines(java.io.File , java.lang.Ssortingng)

Vous pouvez essayer le lecteur de fichier indexé (Apache License 2.0). La classe IndexedFileReader a une méthode appelée readLines (int from, int to) qui retourne une SortedMap dont la clé est le numéro de ligne et la valeur la ligne qui a été lue.

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 au format suivant:

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

Disclamer: J’ai écrit cette bibliothèque

Bien que comme indiqué dans d’autres réponses, il n’est pas possible d’atteindre la ligne exacte sans connaître le décalage (pointeur) précédent. Donc, j’ai réalisé ceci en créant un fichier d’index temporaire qui stockerait les valeurs de décalage de chaque ligne. Si le fichier est suffisamment petit, vous pouvez simplement stocker les index (offset) en mémoire sans avoir besoin d’un fichier séparé.

 The offsets can be calculated by using the RandomAccessFile RandomAccessFile raf = new RandomAccessFile("myFile.txt","r"); //above 'r' means open in read only mode ArrayList arrayList = new ArrayList(); Ssortingng cur_line = ""; while((cur_line=raf.readLine())!=null) { arrayList.add(raf.getFilePointer()); } //Print the 32 line //Seeks the file to the particular location from where our '32' line starts raf.seek(raf.seek(arrayList.get(31)); System.out.println(raf.readLine()); raf.close(); 

Visitez également les documents java pour plus d’informations: https://docs.oracle.com/javase/8/docs/api/java/io/RandomAccessFile.html#mode

Complexité : O (n) car il lit la totalité du fichier une fois. S’il vous plaît être conscient de la mémoire requirejse. S’il est trop gros pour être en mémoire, créez un fichier temporaire qui stocke les décalages au lieu de ArrayList, comme indiqué ci-dessus.

Note : Si tout ce que vous voulez dans la ligne ’32’, il vous suffit d’appeler le readLine () également disponible via les 32 ‘heures des autres classes. L’approche ci-dessus est utile si vous souhaitez obtenir plusieurs fois une ligne spécifique (basée sur le numéro de ligne).

Merci !

Non, à moins que dans ce format de fichier les longueurs de ligne soient prédéterminées (par exemple, toutes les lignes ayant une longueur fixe), vous devrez effectuer une itération ligne par ligne pour les compter.

Autrement.

 try (BufferedReader reader = Files.newBufferedReader( Paths.get("file.txt"), StandardCharsets.UTF_8)) { List line = reader.lines() .skip(31) .limit(1) .collect(Collectors.toList()); line.stream().forEach(System.out::println); } 

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, il faut donc la lire.

Utilisez un stream qui prend en charge readline, lisez simplement les premières lignes X-1 et videz les résultats, puis traitez la suivante.

Ça marche pour moi: j’ai combiné la réponse de Lire un simple fichier texte

Mais au lieu de retourner une chaîne, je retourne une LinkedList de chaînes. Ensuite, je peux sélectionner la ligne que je veux.

 public static LinkedList readFromAssets(Context context, Ssortingng filename) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(context.getAssets().open(filename))); LinkedListlinkedList = new LinkedList<>(); // do reading, usually loop until end of file reading StringBuilder sb = new StringBuilder(); String mLine = reader.readLine(); while (mLine != null) { linkedList.add(mLine); sb.append(mLine); // process line mLine = reader.readLine(); } reader.close(); return linkedList; } 

Vous pouvez utiliser LineNumberReader au lieu de BufferedReader. Passez par le api. Vous pouvez trouver les méthodes setLineNumber et getLineNumber.

Vous pouvez également consulter LineNumberReader, sous-classe de BufferedReader. En plus de la méthode readline, il a également des méthodes de réglage / lecture pour accéder au numéro de ligne. Très utile pour suivre le nombre de lignes lues, tout en lisant les données du fichier.

 public Ssortingng readLine(int line){ FileReader tempFileReader = null; BufferedReader tempBufferedReader = null; try { tempFileReader = new FileReader(textFile); tempBufferedReader = new BufferedReader(tempFileReader); } catch (Exception e) { } Ssortingng returnStr = "ERROR"; for(int i = 0; i < line - 1; i++){ try { tempBufferedReader.readLine(); } catch (Exception e) { } } try { returnStr = tempBufferedReader.readLine(); } catch (Exception e) { } return returnStr; } 

vous pouvez utiliser la fonction skip () pour sauter les lignes du début.

 public static void readFile(Ssortingng filePath, long lineNum) { List list = new ArrayList<>(); long totalLines, startLine = 0; try (Stream lines = Files.lines(Paths.get(filePath))) { totalLines = Files.lines(Paths.get(filePath)).count(); startLine = totalLines - lineNum; // Stream line32 = lines.skip(((startLine)+1)); list = lines.skip(startLine).collect(Collectors.toList()); // lines.forEach(list::add); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } list.forEach(System.out::println); } 

Dans Java 8,

Pour les petits fichiers:

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

Pour les gros fichiers:

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

Dans Java 7

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

Source: lecture de la ligne n du fichier

Utilisez ce code:

 import java.nio.file.Files; import java.nio.file.Paths; public class FileWork { public static void main(Ssortingng[] args) throws IOException { Ssortingng line = Files.readAllLines(Paths.get("D:/abc.txt")).get(1); System.out.println(line); } } 

Ils ont tous tort, je viens d’écrire ceci en 10 secondes environ. Avec cela, j’ai réussi à appeler object.getQuestion (“Linearumber”) dans la méthode principale pour retourner la ligne de mon choix.

 public class Questions { File file = new File("Question2Files/sortingviagame1.txt"); public Questions() { } public Ssortingng getQuestion(int numLine) throws IOException { BufferedReader br = new BufferedReader(new FileReader(file)); Ssortingng line = ""; for(int i = 0; i < numLine; i++) { line = br.readLine(); } return line; }}