DataInputStream.read() vs DataInputStream.readFully()
Im faisant un simple Socket TCP/IP application
Quoi la différence entre le faire:
DataInputStream in = new DataInputStream(clientSocket.getInputStream());
byte[] buffer = new byte[100];
in.readFully(buffer);
rapport à cela:
DataInputStream in = new DataInputStream(clientSocket.getInputStream());
byte[] buffer = new byte[100];
in.read(buffer);
J'ai eu un coup d'oeil à la documentation, ils ont exactement la même description. readFully()
et read()
Donc, je peux assumer ses la même chose?
Comment voulez-vous gérer les EOF (sens quand il n'y a pas plus d'octets à lire sur le support)? Regardez les définitions des deux et pas seulement les descriptions. L'un renvoie une valeur et un lève une exception.
ah ok, je vois maintenant. Donc, fondamentalement,
Pas de.
ah ok, je vois maintenant. Donc, fondamentalement,
readFully()
retourne lorsque le tampon est plein, indépendamment de si il n'y a plus d'octets restant à lire. Et read()
retourne quand tous les octets ont été lus. - Il Correct?Pas de.
read()
retourne lorsqu'au moins un octet a été lu; readFully()
lorsque le tampon est plein.OriginalL'auteur Krimson | 2014-09-17
Vous devez vous connecter pour publier un commentaire.
La Javadoc de
DataInput.readFully(byte[] b)
états:La Javadoc de
DataInputStream.read(byte[] b)
états:Fondamentalement,
readFully()
va lire exactementb.length
octets, alors queread()
va lire jusqu'àb.length
, peut-être moins, ce qui est disponible à partir du flux d'entrée.Je pourrais ajouter que
readFully()
est mieux dans réseau en fonction des opérations. J'ai moi-même eu des problèmes avec seulementread()
lors de l'envoi de messages longs (tampon plus de 5K d'octets par exemple). Lors de l'utilisation de seulementread()
partie du message était absent et remplacé par?
caractères. À l'aide dereadFully()
résolu mon problème : le message complet est à lire, pas de personnages manquent de tout. 😉 J'espère que ça aide ! 😉Comment interrompre readFully() la méthode si je dois le faire après le délai d'attente?
Il n'a pas été remplacé par ? des personnages. Ils ont été ce qui a été laissé dans la mémoire tampon au-delà de ce qui a été lu. Le nombre retourné par
read()
ne pas les inclure.Vous définissez un socket que le délai d'attente. Mais vous perdrez toutes les données qui ont déjà été lu, si le délai d'déclenche, ou plutôt vous ne savez pas combien de données a été lu, le cas échéant. Préférable d'utiliser
read()
en association avec des délais d'attente.OriginalL'auteur Lolo
À l'aide de lire vous avez besoin pour vérifier la valeur de retour de savoir combien d'octets ont été vraiment lu
plutôt avec readFully une IOException sera levée si l'100 octets ne pouvait pas être lu, n'ont pas besoin de vérifier la valeur de retour, de simplifier un peu.
OriginalL'auteur Lluis Felisart