web-dev-qa-db-fra.com

Réinitialiser le tampon avec BufferedReader en Java?

J'utilise la classe BufferedReader pour lire ligne par ligne dans le tampon. Lors de la lecture de la dernière ligne du tampon, je veux recommencer à lire depuis le début du tampon. J'ai lu sur mark () et reset (), je ne suis pas sûr de son utilisation mais je ne pense pas qu'ils puissent m'aider à sortir de là.

Est-ce que quelqu'un sait comment commencer à lire depuis le début du tampon après avoir atteint la dernière ligne? Comme si nous pouvions utiliser chercher (0) du fichier RandomAccessFile? S'il vous plaît. Merci

14
ipkiss

mark/reset est ce que vous voulez, mais vous ne pouvez pas vraiment l'utiliser sur BufferedReader, car il ne peut réinitialiser qu'un certain nombre d'octets (la taille de la mémoire tampon). si votre fichier est plus volumineux, cela ne fonctionnera pas. il n'y a pas de façon "simple" de le faire (malheureusement), mais ce n'est pas trop difficile à gérer, vous avez juste besoin d'un handle sur le FileInputStream d'origine.

FileInputStream fIn = ...;
BufferedReader bRead = new BufferedReader(new InputStreamReader(fIn));

// ... read through bRead ...

// "reset" to beginning of file (discard old buffered reader)
fIn.getChannel().position(0);
bRead = new BufferedReader(new InputStreamReader(fIn));

(notez que l'utilisation de jeux de caractères par défaut n'est pas recommandée, mais uniquement à l'aide d'un exemple simplifié).

35
jtahlborn

Oui, marquer et réinitialiser sont les méthodes que vous souhaitez utiliser.

// set the mark at the beginning of the buffer
bufferedReader.mark(0);

// read through the buffer here...

// reset to the last mark; in this case, it's the beginning of the buffer
bufferedReader.reset();
3
Greg

Cela a fonctionné pour moi pour résoudre ce problème. Je lis dans un fichier ligne par ligne. Je fais un BufferedReader très tôt dans mon programme. Je vérifie ensuite si readLine est null et effectue un myFile.close puis un nouveau BufferedReader. Lors du premier passage, la variable readLine sera nulle puisque je l’ai définie ainsi globalement et que je n’ai pas encore effectué de lecture. La variable est définie globalement et définie sur null. En conséquence, une nouvelle et proche BufferedReader se produit. Si je ne fais pas BufferedReader au tout début de mon programme, ce fichier myFile.close jette un NPE lors du premier passage.

Alors que le fichier est lu ligne par ligne, ce test échoue car readLine n'est pas null, rien ne se passe dans le test et le reste de l'analyse du fichier se poursuit.

Plus tard, lorsque la readLine arrive à EOF, elle est à nouveau définie comme étant nulle. IE: Le deuxième passage à travers cette vérification fait également un myFile.close et un nouveau BufferedREader qui réinitialise la readLine au début.

Effectivement, dans ma boucle ou hors de ma boucle, cette action ne se produit que lorsque la variable readLine est globalement définie sur null ou à EOF. Dans les deux cas, je fais une "réinitialisation" pour revenir au début du fichier et à un nouveau BufferedReader.

if (readLineOutput == null) { 
//end of file reached or the variable was just set up as null
    readMyFile.close();
    readMyFile = new BufferedReader(new FileReader("MyFile.txt"));
                }
0
JavaNoob