2009-06-02 5 views
5

Quelle est la différence entre l'utilisation d'un BufferedReader autour de StringReader dans le code suivant et l'utilisation de StringReader uniquement? En chargeant le DOM dans la ligne 2 des deux exemples, il semble que le BufferedReader n'est pas nécessaire?Pourquoi utiliser BufferedReader dans ce cas?

InputSource is = new InputSource(new StringReader(html)); 
    Document dom = XMLResource.load(is).getDocument(); 

VS

InputSource is = new InputSource(new BufferedReader(new StringReader(html))); 
    Document dom = XMLResource.load(is).getDocument(); 
+0

L'utilisation de BufferedReader sera en fait légèrement plus lente (et rendra le code plus compliqué) –

Répondre

18

Dans ce cas particulier, je ne vois aucun avantage. En général, il y a deux avantages:

  • Le oh-so-pratique méthode readLine() est uniquement définie dans BufferedReader plutôt que Reader (hors de propos ici)
  • BufferedReader réduit IO où les appels individuels au lecteur sous-jacent sont potentiellement coûteux (c'est-à-dire que moins d'appels trapus sont plus rapides que beaucoup de petits) - encore une fois, sans importance pour StringReader

Couper et coller échouer?

1

La version BufferedReader a été copié à partir du code qui permet de lire à partir d'un FileReader?

4

EDIT: Ma réponse originale ci-dessous. Le ci-dessous n'est pas pertinent dans ce cas, puisque le lecteur tamponné est en train d'encapsuler un StringReader, qui enveloppe une chaîne. Il n'y a donc pas de mise en mémoire tampon à effectuer, et BufferedReader semble être redondant. Vous pouvez faire un argument pour l'utilisation de meilleures/pratiques cohérentes, mais ce serait assez ténu.

Peut-être le résultat d'un copier/coller, ou peut-être un refactor IDE-driven trop loin! BufferedReader tentera de lire de manière plus optimale.

C'est-à-dire, il va lire des blocs de données plus volumineux en une seule fois (dans une quantité configurable), puis rendre disponible si nécessaire. Cela permettra de réduire le nombre de lectures à partir du disque (etc.) au détriment de l'utilisation de la mémoire.

Pour citer le Javadoc:

En général, chaque demande de lecture en un lecteur provoque un correspondant lecture Présentation d'une demande du caractère sous-jacente ou d'un flux octet. Il est donc conseillé de envelopper un BufferedReader autour de tout lecteur dont lecture() opérations peuvent être coûteuses, telles que FileReaders et InputStreamReaders

+0

Et c'est pertinent pour un StringReader comment exactement? ;) –

+0

Oui. Je comprends ton raisonnement. J'ai répondu que trop vite :-) –