web-dev-qa-db-fra.com

Lecture d'un nombre spécifique d'octets à partir d'un lecteur en mémoire tampon dans golang

Je suis conscient de la fonction spécifique dans golang à partir du paquet bufio .

func (b *Reader) Peek(n int) ([]byte, error)

Peek renvoie les n octets suivants sans faire avancer le lecteur . Les octets cesser d'être valide à la prochaine lecture appel. Si Peek retourne moins de n octets, il renvoie également une erreur expliquant pourquoi la lecture est courte. Le error est ErrBufferFull si n est supérieur à la taille de la mémoire tampon de b.

Je dois être capable de lire un nombre d'octets spécifique d'un lecteur qui fera avancer le lecteur . Fondamentalement, identique à la fonction ci-dessus, mais cela fait avancer le lecteur. Est-ce que quelqu'un sait comment accomplir cela?

23
Kirk Backus
func (b *Reader) Read(p []byte) (n int, err error)

http://golang.org/pkg/bufio/#Reader.Read

Le nombre d'octets lus sera limité à len(p)

21
Chris

Notez que la méthode bufio.Read appelle le io.Read sous-jacent au plus une fois, ce qui signifie qu'elle peut renvoyer n < len(p) sans atteindre EOF. Si vous voulez lire exactement len(p) octets ou échouer avec une erreur, vous pouvez utiliser io.ReadFull comme ceci:

n, err := io.ReadFull(reader, p)

Cela fonctionne même si le lecteur est en mémoire tampon.

63
monicuta

Passez un tampon de taille n octets au lecteur.

3
zzzz

Je préfère Read () surtout si vous lisez n'importe quel type de fichier et que cela peut également être utile pour envoyer des données en morceaux, voici un exemple pour montrer comment il est utilisé 

fs, err := os.Open("fileName"); 

if err != nil{
    fmt.Println("error reading file")
    return
}

defer fs.Close()

reader := bufio.NewReader(fs)

buf := make([]byte, 1024)

for{
    v, _ := reader.Read(buf) //ReadString and ReadLine() also applicable or alternative

    if v == 0{
        return
    }
    //in case it is a string file, you could check its content here...
    fmt.Print(string(buf))
}
3
msoliman