2010-10-07 10 views
1

Un objet OutputStream peut être connecté directement à un obj PrintWriter, par exemple, Pourquoi un obj InputStream ne peut-il pas être imbriqué directement dans un objet BufferedReader?

 
//either is OK 
new PrintWriter(socket.getOutputStream()); 
new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); 
But in the case of an InputStream obj, it must be connected to a BufferedReader obj through an InputStreamReader obj, that is,
 
new BufferedReader(new InputStreamReader(socket.getInputStream())); //OK 
new BufferedReader(socket.getInputStream()); //doesnt work 
Is there any reason for this inconsistency of API design?

Répondre

1

Java a introduit la hiérarchie Reader and Writer (java 1.1 je pense) lorsque les classes de flux d'entrée et de sortie étaient déjà utilisées. Par conséquent, en utilisant un modèle de pont, ils vous permettent d'avoir des classes de flux passées dans des classes de lecteurs. En outre pour l'auteur également PritnerWriter est directement la classe de pont qui est équivalente à InputStreamReader. Vous verrez aussi la même chose pour BufferedWriter Pour plus d'informations, lisez http://www.codeguru.com/java/tij/tij0114.shtml

+0

En fait, 'OutputStreamWriter' est l'équivalent de' InputStreamReader'. 'PrintWriter' est juste un adaptateur qui vous permet d'utiliser les méthodes' PrintStream' pour écrire dans un autre 'Writer'. – ColinD

+0

Oui, vous avez raison. Désolé pour la mauvaise comparaison. – Fazal

0

The BufferedReader is probably just decorating the InputReader being passed in. It makes no sense for a BufferedReader to accept a class it can't decorate, like an InputStream.

+0

Cela signifie-t-il qu'il existe d'autres choix lorsque vous connectez un objet InputStream à un BufferedReader en plus d'un InputStreamReader? – dolaameng

+0

Je crois que le InputStreamReader est un «pont» entre un lecteur et un InputStream. Lisez la réponse de Fazal ci-dessous. –

3

There isn't any inconsistency... you should be comparing BufferedReader et BufferedWriter. Ils existent pour envelopper d'autres Reader s et Writer s respectivement.

La raison fondamentale de c'est que les différents types de Reader s et Writer s peuvent avoir différentes façons d'être initialisé et différents modes de fonctionnement, et non pas nécessairement un emballage du tout InputStream ou OutputStream. Dans votre exemple d'un BufferedReader enveloppant un InputStreamReader, InputStreamReader peut (et devrait généralement) être initialisé avec à la fois un InputStream et un Charset. Est-ce que BufferedReader devrait avoir une surcharge pour cela, alors que son seul travail consiste à fournir un tampon?

+0

"InputStreamReader peut (et devrait généralement) être initialisé avec un InputStream et un Charset" C'est vrai, mais la même chose s'applique à 'OutputStreamWriter' et' PrintWriter'. Vous devez spécifier un jeu de caractères lors de la création d'un 'OutputStreamWriter', mais' PrintWriter' n'a pas de surcharge pour cela. Et PrintWriter existe également pour envelopper les objets 'Writer' (de n'importe quel type). –

+0

@Matthew Flaschen: Certaines classes du paquet IO sont traitées assez mal en ce qui concerne les jeux de caractères. 'PrintWriter' et' FileReader' sont des exemples. Je pense que 'PrintWriter' devrait probablement seulement être autorisé à envelopper un autre' Writer' (plutôt que d'avoir toutes les autres surcharges) et 'FileReader' ne devrait pas être utilisé ...' FileInputStream' + 'InputStreamReader' à la place. – ColinD

+0

Je suis d'accord. Et le fait que certaines classes s'appuient uniquement sur l'encodage par défaut, alors que d'autres ne le font pas, est la preuve que le paquet est en partie inconsistant. –