2010-04-18 3 views
0
 while(inStream.hasNextLine()) 
     { 
       ... 

       lineList.add(inStream.nextLine()); 
     } 
     ... 

lineList est un ArrayList. Le code lit tout bien, sauf qu'il n'attrape pas la dernière ligne. Les deux dernières lignes de la fin comme ce fichier texte:Java - Comment obtenir la dernière ligne avec Scanner?

"a sentence here..." 
<a blank line here. the blank line is the last line> 

Je suppose que ce ne sera pas la saisir depuis hasNextLine() ne détecte pas une autre ligne après celui-ci?

Comment saisir la dernière ligne? Je pensais que la lecture jusqu'à ce que ce soit EOF et puis attraper l'exception pourrait fonctionner, mais il ne semble pas y avoir de moyen de le faire.

EDIT: PLUS D'INFO

public void readLines() 
{ 
    lineList = new ArrayList(); 

    try 
    { 
     inStream = new Scanner(new File(fileName)); 
    } 
    catch(FileNotFoundException e) 
    { 
     System.out.println("Error opening the file. Try again."); 
    } 


    if (inStream != null) 
    { 
     while(inStream.hasNextLine()) 
     { 
      ++originalLines; 

      lineList.add(inStream.nextLine()); 
     } 
     inStream.close(); 
    } 
} 

Il y a toute la méthode. Quelque chose ne va pas?

EDIT: MÊME PLUS D'INFO

public static void main(String[] args) 
{ 
    Scanner inStream = null; 
    String test = ""; 

    inStream = new Scanner(test); 

    while(inStream.hasNextLine()) 
    { 
     System.out.println(inStream.nextLine()); 
    } 
} 

Il ne sera pas ramasser une chaîne vide, mais il ramassera un des espaces « »

Répondre

4

nextLine() fonctionne très bien pour retourner la dernière ligne, même si elle est vide. Je soupçonne que votre problème est ailleurs.

String multilinetext = 
    "Line1\n" + 
    "Line2\n" + 
    "\n" + 
    "Line4\n" + 
    "\n"; 
Scanner sc = new Scanner(multilinetext); 
while (sc.hasNextLine()) { 
    System.out.println("[" + sc.nextLine() + "]"); 
} 
/* prints 
[Line1] 
[Line2] 
[] 
[Line4] 
[] 
*/ 

Il ne détectera pas une chaîne vide

Ce comportement est correct par la conception. Si l'entrée est une chaîne vide, vous ne pouvez pas attendre un Scanner pour indiquer hasNextLine() et renvoyer une chaîne vide sur nextLine(), d'autant plus que cela ne fait pas avancer le Scanner après n'importe quel caractère.

Si vous y pensez, si vous attendez un Scanner dire hasNextLine() sur une chaîne vide, et retourner une chaîne vide nextLine(), cela se traduirait par une boucle infinie: il sera toujourshasNextLine() et il sera toujours Renvoyer une chaîne vide sur nextLine()forever. Un tel comportement est clairement impraticable.

+0

J'ai ajouté la méthode entière à mon OP. Peux-tu le vérifier? – ShrimpCrackers

+0

Méthode me semble bien. Utilisez 'wc -l' ou un éditeur hexadécimal, etc. pour voir ce que le fichier contient réellement. Faire le test "si j'appuie sur la touche fléchée droite, ça ne bouge pas" est inutile car cela dépend du comportement de l'éditeur de texte et non de ce que le fichier contient. – polygenelubricants

+0

Merci. Ma conjecture est que ce n'est pas un délimiteur mais une chaîne vide. Si ma supposition est correcte, comment pourrais-je prendre une chaîne vide? Voir le code ajouté ci-dessus. – ShrimpCrackers

1

Ce code fonctionne bien pour moi - êtes-vous sûr qu'il ya effectivement une ligne vide à la fin (comme dans, le fichier se termine par deux nouvelles lignes, pas un seul)?

+0

Oui. Eh bien, je ne sais pas si vous pouvez l'appeler une ligne vide. C'est plus comme une chaîne vide? Il n'y a rien dedans. Par exemple, si sur la dernière ligne vous placez le curseur dessus et que vous appuyez sur la touche fléchée droite, il ne bougera pas. – ShrimpCrackers

1

Le scanner ne récupère pas une chaîne vide. Il n'y a rien à tokenize. Scanner est un tokenizer, utilisé par défaut pour utiliser Character.isWhitespace en fonction de Java 6 javadoc. Chaque fois que le jeton est rencontré, tout ce qu'il contient est renvoyé sous forme de chaîne, mais pas le jeton. Si le dernier élément est le jeton, il est supprimé et aucune nouvelle ligne n'est ajoutée. Vous pourriez vous retrouver avec des chaînes vides dans votre ArrayList, mais ce n'est qu'une chaîne vide, car le jeton a été supprimé. Aucune donnée et aucun jeton et scanner ne voient pas une ligne. Ce que vous voyez dans votre éditeur n'est pas une ligne vide. Votre curseur est au point où un caractère sera ajouté si vous tapez. Si vous ne tapez rien, il n'y a pas de ligne réelle.

+0

Merci. Ça a du sens. Je suppose que je pourrais juste laisser tomber. – ShrimpCrackers

0

Je voudrais souligner que les deux

String multilinetext = 
    "Line1\n" + 
    "Line2\n" + 
    "\n" + 
    "Line4\n"; 

et

String multilinetext = 
    "Line1\n" + 
    "Line2\n" + 
    "\n" + 
    "Line4"; 

redonne exactement le même résultat en utilisant le code de @polygenelubricants qui est:

[Line1] 
[Line2] 
[] 
[Line4] 

car Scanner doesn ne pas rendre les caractères finaux "nouvelle ligne". Donc, si vous voulez obtenir une dernière ligne "vide", ce n'est pas la bonne solution et vous devriez lire chaque octet.

Questions connexes