Scanner vs InputStreamReader

Est-ce que quelqu’un sait s’il existe une différence de performances entre les deux méthodes de lecture du fichier d’entrée ci-dessous? Merci.

1) Lecture d’un fichier avec Scanner and File

Scanner input = new Scanner(new File("foo.txt")); 

2) Lecture d’un fichier avec InputStreamReader et FileInputStream

 InputStreamReader input = new InputStreamReader(new FileInputStream("foo.txt")); 

Le premier point est qu’aucun de ces exemples de code ne lit un fichier. Cela peut sembler insensé ou incorrect, mais c’est vrai. Ce qu’ils font réellement, c’est ouvrir un fichier en lecture. Et en ce qui concerne ce qu’ils font réellement, il n’y a probablement pas une différence énorme dans leur efficacité respective.

Lorsqu’il s’agit de lire le fichier, la meilleure approche à utiliser dépend de son contenu, de la forme sous laquelle les données doivent figurer dans vos algorithmes en mémoire, etc. Cela déterminera s’il est préférable d’utiliser Scanner ou. un Reader brut, du sharepoint vue des performances et, plus important encore, du sharepoint vue de la fiabilité et de la maintenance de votre code.

Enfin, il est probable que cela ne fera pas une différence significative dans les performances globales de votre code. Ce que je dis, c’est que vous optimisez votre application prématurément. Il vaut mieux ignorer les performances pour le moment et choisir la version qui simplifiera le rest de votre code. Lorsque l’application fonctionne, définissez-la avec des données d’entrée représentatives. Le profilage vous indiquera le temps passé à lire le fichier, en termes absolus et par rapport au rest de l’application. Cela vous dira si cela vaut la peine d’essayer d’optimiser la lecture du fichier.

Le seul conseil en termes de performances que je donnerais est que la lecture caractère par caractère à partir d’un stream d’entrée ou d’un lecteur non tamponné est inefficace. Si le fichier doit être lu de cette façon, vous devez append un BufferedReader à la stack.

En termes de performances, Scanner est certainement le plus lent, du moins d’après mon expérience. Il est conçu pour l’parsing et non pour la lecture de blocs de données énormes. InputStreamReader, avec une mémoire tampon suffisamment grande, peut fonctionner à égalité avec BufferedReader, ce qui, je le rappelle, est un peu plus rapide que Scanner pour la lecture à partir d’une liste de dictionnaires. Voici une comparaison entre BufferedReader et InputStreamReader . Rappelez-vous que BufferedReader est quelques fois plus rapide que Scanner.

Une différence, et le principal, je suppose, est que avec BufferedReader / InputStreamReader, vous pouvez lire le document entier caractère par caractère, si vous le souhaitez. Avec le scanner, ce n’est pas possible. Cela signifie qu’avec InputStreamReader, vous pouvez avoir plus de contrôle sur le contenu du document. 😉