1
votes

Obtenir le numéro de ligne actuel de bufferedReader

J'ai différents fichiers texte que j'aimerais lire et j'utilise BufferedReader pour cela comme ceci:

int theMax = 0;
    int theTypes = 0;
    int []theSlices = {};
    /*
        INPUT1:
        17 4
        2 5 6 8  

        INPUT2:
        100 10
        4 14 15 18 29 32 36 82 95 95                                

    */

    try {
        FileReader reader = new FileReader("INPUT1.in");
        BufferedReader bufferedReader = new BufferedReader(reader);

        String line;

        while ((line = bufferedReader.readLine()) != null) {
            String[] numbers = line.split(" ");

            System.out.println(numbers[0]);
            System.out.println(line);
        }
        reader.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
    ;

Mon problème est que je voudrais définir les valeurs pour theMax , theTypes & theSlices mais pour cela, j'ai besoin d'obtenir le numéro de ligne actuel et je n'ai aucune idée de comment faire cela . La lecture du fichier fonctionne et println (les nombres [0] imprime 17 et 2. Je suis un peu coincé ici, donc je suis content de chaque aide.

Exemple pour INPUT1 : theMax = 17 theTypes = 4 theSlices = 2 5 6 8


0 commentaires

3 Réponses :


3
votes

Très simple: vous vous suivez vous-même.

    String line;
    int currentLine = 0;

    while ((line = bufferedReader.readLine()) != null) {
        String[] numbers = line.split(" ");

        System.out.println("Linenumber " + currentLine);
        System.out.println(numbers[0]);
        System.out.println(line);
        currentLine ++;
    }
    reader.close();


0 commentaires

1
votes

Je ne suis pas sûr de bien comprendre ce que vous recherchez, mais pour simplement garder une trace des numéros de ligne, créez une variable que vous incrémentez dans votre boucle while

c.-à-d.

try {
        FileReader reader = new FileReader("INPUT1.in");
        BufferedReader bufferedReader = new BufferedReader(reader);

        String line;
        long currentLineNr = 0;
        while ((line = bufferedReader.readLine()) != null) {
            currentLineNr++;
            String[] numbers = line.split(" ");

            System.out.println(numbers[0]);
            System.out.println(line);
            //Use the currentLineNr how you like
        }
        reader.close();

    } catch (IOException e) {
        e.printStackTrace();
    }


0 commentaires

1
votes

Tout d'abord, pour autant que je sache (et après avoir lu la documentation Java officielle à ce sujet ici - https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html ), la classe BufferedReader ne fonctionne pas en elle-même vous donne un mécanisme (par exemple, une méthode getCurrentLine ()) pour déterminer la ligne courante.

Cependant, rien ne vous empêche de suivre vous-même le numéro de la ligne actuelle grâce, par exemple, à une variable de compteur.

Par conséquent, la section pertinente de votre code ressemblerait à:

        BufferedReader bufferedReader = new BufferedReader(new FileReader("INPUT1.in"));

Je voudrais également mentionner que votre code pourrait être amélioré ici et là, par exemple: p>

  1. Vous pouvez remplacer votre essai par un essai avec des ressources, de sorte que vos lecteurs soient gérés / fermés automatiquement même si une exception se produit.
  2. Si vous décidez de ne pas utiliser try-with-resources, vous devrez déplacer votre appel de méthode reader.close () dans un bloc finally, car si une exception se produit réellement, vous ne fermez jamais votre ressource. li>
  3. Ces 2 lignes
        FileReader reader = ;
        BufferedReader bufferedReader = new BufferedReader(reader);

peut être simplifié en:

        int currentLine = 0;
        while ((line = bufferedReader.readLine()) != null) {
            currentLine++;

            String[] numbers = line.split(" ");

            /* NOTE: this can be numbers.length >= 2 if you don't care to enforce 
            having exactly 2 numbers as the first line 
            */
            if(currentLine == 1 && numbers.length == 2) {
                    theMax = Integer.valueOf(numbers[0]);
                    theTypes = Integer.valueOf(numbers[1]);
            } else {
                for(int index = 0; index < numbers.length; index++) {
                        theSlices[index] = Integer.valueOf(numbers[index]);
                }
            }
        }
        // do something with read values

et il vous suffit ensuite de gérer l'instance bufferedReader si vous vous en tenez pour essayer à la place d'essayer avec des ressources.

J'espère que cela vous aidera.

PS: sans dire que mon extrait de code ci-dessus est parfait, je suis sûr qu'il peut être écrit plus proprement p >


1 commentaires

Ce serait une meilleure réponse si les blocs try / catch étaient supprimés. Remplir aveuglément le tableau avec des zéros n'est probablement pas la meilleure réponse aux chaînes d'entrée mal formées.