Exception NoSuchElementException à la lecture d'un fichier
Bonjour,
j'ai un problème étrange que je n'arrive pas à résoudre...
Code:
1 2 3
|
s = new Scanner(new File(filename), "SJIS");
String l = s.nextLine(); |
lance l'exception
Code:
1 2 3 4
|
java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1516)
at ... (la ligne avec nextLine dans ma méthode) |
Ce qui est étrange, c'est que le fichier contient bien plusieurs lignes, terminées par des CRLF comme normal.
D'ailleurs, un nextByte() lance aussi une exception NoSuchElementException, alors que le fichier n'est évidement pas vide...
Par contre, le code
Code:
1 2 3 4 5 6 7
|
inputStream = new BufferedReader(
new InputStreamReader(
new FileInputStream(filename),"SJIS"));
String l1 = inputStream.readLine();
System.out.println(l1);
inputStream.close(); |
Fonctionne sans soucis, et affiche la première ligne du fichier.
Qu'est-ce qui peut expliquer la différence de comportement entre les deux méthodes pour ouvrir le fichier? La premiere méthode fonctionne bien pour 500 fichiers similaires, mais pas sur celui là, ce qui me trouble encore plus...
Ca n'a pas l'air simple...
Bonjour,
Avant tout, j'aimerais être sûr que votre volonté est bien d'ouvrir un fichier encodé Shift_JIS (apparemment, un encodage utilisé par la langue japonaise) ?
Ensuite, vous ne modifier pas le délimiteur de votre scaner lors de votre invocation de la méthode nextLine(). Donc dans ce cas, le délimiteur par défaut utilisé par Scanner est le caractère ASCII espace. Je ne sais pas si ce dernier existe dans du texte ainsi encodé, mais votre message d'erreur semble simplement dire qu'il n'en trouve aucune occurrence !
En effet, la méthode nextLine() est faite pour renvoyer l'ensemble des caractères 'survolés' jusqu'à l'occurrence suivante du délimiteur, donc dans votre cas, l'espace. Le message dit clairement qu'il n'en trouve pas...8O
Dans votre troisième extrait de code, vous ne procédez pas du tout de la même façon. Vous lisez directement le fichier vous-même en utilisant un Reader qui vous permet d'invoquer la méthode readLine. Cette dernière renvoie la prochaine ligne de texte qui se termine par un "\n", ça n'a rien à voir avec la méthode nextLine() du Scanner...
Comme apparemment votre fichier contient bien quel que soit son encodage des retours chariot (ce n'est pas un caractère ASCII, c'est un retour chariot)...