6 votes

Lecture d'un fichier à l'aide d'un scanner Java

L'une des lignes d'un fichier java que j'essaie de comprendre est la suivante.

return new Scanner(file).useDelimiter("\\Z").next();

Le fichier est censé renvoyer jusqu'à "la fin de l'entrée, à l'exception du terminateur final, le cas échéant", conformément à la documentation de java.util.regex.Pattern. Mais ce qui se passe, c'est qu'il ne renvoie que les 1024 premiers caractères du fichier. S'agit-il d'une limitation imposée par le sélecteur de motif regex ? Peut-on y remédier ? Actuellement, j'utilise un lecteur de fichiers. Mais j'aimerais connaître la raison de ce comportement.

5voto

Mark Peters Points 42201

Moi-même, je n'ai pas pu reproduire ce phénomène. Mais je pense pouvoir vous éclairer sur ce qui se passe.

En interne, le scanner utilise une mémoire tampon de 1024 caractères. Le Scanner lira par défaut les 1024 caractères lisibles, si possible, puis appliquera le motif.

Le problème réside dans votre modèle... il correspondra toujours à la fin de l'entrée, mais cela ne signifie pas la fin de votre flux d'entrée/données. Lorsque Java applique votre motif aux données mises en mémoire tampon, il essaie de trouver la première occurrence de la fin de l'entrée. Étant donné que le tampon contient 1024 caractères, le moteur de mise en correspondance appelle la position 1024 la première correspondance du délimiteur et tout ce qui précède est renvoyé comme premier jeton.

Je ne pense pas que l'ancre de fin d'entrée soit valable pour une utilisation dans le Scanner pour cette raison. Il pourrait lire à partir d'un flux infini, après tout.

2voto

Amir Afghani Points 17519

Essayez d'envelopper le file dans un FileInputStream

1voto

Powerlord Points 43989

Scanner est destiné à lire plusieurs primitives à partir d'un fichier. Il n'est pas vraiment destiné à lire un fichier entier.

Si vous ne voulez pas inclure des bibliothèques tierces, il est préférable de boucler sur un fichier BufferedReader qui enveloppe un FileReader / InputStreamReader pour le texte, ou le passage en boucle d'un FileInputStream pour les données binaires.

Si vous êtes d'accord pour utiliser une bibliothèque tierce, Apache commun-io a un FileUtils qui contient les méthodes statiques readFileToString y readLines pour le texte et readFileToByteArray pour les données binaires..

0voto

Vous pouvez utiliser la classe Scanner, il suffit de spécifier un jeu de caractères lors de l'ouverture du scanner, par exemple :

Scanner sc = new Scanner(file, "ISO-8859-1");

Java convertit les octets lus dans le fichier en caractères en utilisant le jeu de caractères spécifié, qui est celui par défaut (du système d'exploitation sous-jacent) si rien n'est donné ( source ). Je ne comprends toujours pas pourquoi le Scanner ne lit que 1024 octets avec celui par défaut, alors qu'avec un autre, il atteint la fin d'un fichier. Quoi qu'il en soit, cela fonctionne bien !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X