2009-10-11 18 views
3

je lis InputStream d'un Socket. Parce que j'analyse les données entrantes à la volée, je suis obligé de lire les caractères par caractère.Java Sockets: InputStream.read() vs BufferedReader.read()

Est-ce que BufferedReader.read() fait la même chose que InputStream.read()? (en supposant que BufferedReader a été construit avec le InputStream comme base)

Est-il plus efficace d'utiliser InputStream.read() lors de la lecture de chaque caractère séparément? Ou y a-t-il un meilleur moyen?

Répondre

5

BufferedReader lira plusieurs caractères à partir d'un lecteur sous-jacent. Un InputStream fournit des octets. Donc, ils travaillent sur 2 types de données distincts. Comment entourez-vous un lecteur autour d'un flux? Vraisemblablement, vous avez quelque chose comme:

BufferedReader in 
    = new BufferedReader(new InputStreamReader(socket)); 

Dans ce cas, je serais prudent de spécifier votre encodage de caractères. Du point de vue de l'optimisation, il vaut mieux utiliser BufferedReader, car il lit plusieurs kilo-octets à la fois, et vous pouvez prendre chaque caractère quand vous le voulez (sans forcément forcer une nouvelle lecture d'E/S). la méthode de classe InputStream est une méthode abstraite

+0

merci. alors vous me conseillez d'utiliser InputStream? Je lis le flux jusqu'à ce que des caractères spéciaux apparaissent. Ensuite, j'analyse cette pièce et attend le prochain "paquet". Y a-t-il une meilleure façon de faire cela? – Atmocreations

+0

Notez qu'un flux vous donnera des octets. Un lecteur vous donnera des caractères. Vous devez donc être plus clair en termes de ce que vous recevez et de ce dont vous avez besoin. –

0

lecture(). Il devrait être InputStreamrReader je suppose. Comming revenir à votre question, la méthode de classe InputStreamReader et BufferesReader fois lu() ne la même chose- renvoient la valeur ascii d'un caractère, la seule différence étant BufferedReader utilise ce qu'on appelle en mémoire tampon qui nous permet de réduire le nombre de fois que nous lisons le disque/STDIN en copiant des morceaux dans la mémoire principale où InputStreamReader que l'utilisation de chaque invocation de lecture() pourrait faire en sorte que les octets à lire à partir du disque/STDIN, converti en caractères, et est ensuite retourné, qui peut être très inefficace.