Lecture spécifique nombre d'octets à partir d'un tampon lecteur dans golang
Je suis conscient de la fonction spécifique dans golang de la bufio paquet.
func (b *Reader) Peek(n int) ([]byte, error)
Peek retourne le prochain n octets sans faire avancer le lecteur. Les octets
cesser d'être valide à la prochaine lecture appel. Si Peek renvoie moins de n
octets, il renvoie une erreur expliquant pourquoi la lecture est courte. L'
l'erreur est ErrBufferFull si n est plus grand que b est la taille de la mémoire tampon.
J'ai besoin d'être capable de lire un nombre déterminé d'octets à partir d'un Lecteur de avance le lecteur. Fondamentalement, identique à la fonction ci-dessus, mais il avance le lecteur. Quelqu'un sait comment faire cela?
Vous devez vous connecter pour publier un commentaire.
http://golang.org/pkg/bufio/#Reader.Read
Le nombre d'octets lus sera limitée à
len(p)
Noter que le
bufio.Read
les appels de méthode sous-jacentsio.Read
plus d'une fois, ce qui signifie qu'il peut retournern < len(p)
, sans atteindre des expressions du FOLKLORE. Si vous voulez lire exactementlen(p)
octets ou échouer avec une erreur, vous pouvez utiliserio.ReadFull
comme ceci:Cela fonctionne même si le lecteur est mis en mémoire tampon.
io.ReadAtLeast(reader, p, len(p))
Également dans le cas deio.ReadFull
vous devez d'abord définir lep
avec sa longueur est égale à la taille d'octets que vous souhaitez lire, mais pourio.ReadAtLeast
la longueur de lap
peut être que tant qu'il est plus grand que ou égal à la taille que vous souhaitez lire.Je suis en préférant Lire (), surtout si vous vous apprêtez à lire n'importe quel type de fichiers, et il pourrait être également utile à l'envoi de données en morceaux, ci-dessous est un exemple pour montrer comment il est utilisé
Passer un n-octets de taille de la mémoire tampon pour le lecteur.
Pour ce faire, il vous suffit de créer un octet tranche et lire les données dans cette tranche avec
func (b *Reader) Read(p []byte) (n int, err error)
TLDR:
Réponse complète:
@monicuta mentionné
io.ReadFull
qui fonctionne très bien. Ici je fournir une autre méthode. Il fonctionne en chaînageioutil.ReadAll
etio.LimitReader
ensemble. Nous allons lire la doc d'abord:Donc, si vous voulez obtenir 42 octets de
myReader
, vous le faitesVoici le code équivalent avec
io.ReadFull
Par rapport à
io.ReadFull
, l'avantage est que vous n'avez pas besoin de configurer manuellement unbuf
, oùlen(buf)
est le nombre d'octets que vous voulez lire, puis passerbuf
comme argument quand vous LisezAu lieu de cela il vous suffit de dire
io.LimitReader
que vous voulez à la plupart des 42 octets demyReader
, et d'appelerioutil.ReadAll
de les lire tous, de retourner le résultat sous forme d'une tranche d'octets. En cas de succès, le retour de la tranche est garanti d'être de la longueur de 42.