Maison >développement back-end >Golang >Pourquoi ne puis-je pas lire les données que je viens d'écrire dans un fichier temporaire avec Go ?

Pourquoi ne puis-je pas lire les données que je viens d'écrire dans un fichier temporaire avec Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-30 04:30:16768parcourir

Why Can't I Read Data I Just Wrote to a Temporary File in Go?

Comment lire des données qui viennent d'être écrites dans un fichier temporaire

Aperçu du problème

Lors d'une tentative pour écrire des données dans un fichier temporaire puis les lire dans Go, les utilisateurs peuvent rencontrer des difficultés. Bien que les données aient été écrites avec succès dans le fichier, leur récupération s'avère ensuite insaisissable.

Solution

Le nœud du problème réside dans le fonctionnement d'ioutil.TempFile. Cette fonction crée un fichier temporaire et l'ouvre en lecture et en écriture. Par conséquent, le pointeur dans le fichier est positionné à la fin des données après l'opération d'écriture.

Pour relever ce défi, il est nécessaire de rechercher le début du fichier à l'aide de *os.File.Seek avant de tenter pour en lire. Cette opération réinitialise le pointeur au début, permettant à l'opération de lecture suivante d'accéder aux données écrites.

Implémentation

L'exemple de code suivant illustre l'implémentation corrigée :

package main

import (
    "bufio"
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "path/filepath"
)

func main() {
    tmpFile, err := ioutil.TempFile("", fmt.Sprintf("%s-", filepath.Base(os.Args[0])))
    if err != nil {
        log.Fatal("Could not create temporary file", err)
    }
    defer tmpFile.Close()

    fmt.Println("Created temp file: ", tmpFile.Name())

    fmt.Println("Writing some data to the temp file")
    if _, err = tmpFile.WriteString("test data"); err != nil {
        log.Fatal("Unable to write to temporary file", err)
    } else {
        fmt.Println("Data should have been written")
    }

    fmt.Println("Trying to read the temp file now")

    // Seek the pointer to the beginning
    tmpFile.Seek(0, 0)
    s := bufio.NewScanner(tmpFile)
    for s.Scan() {
        fmt.Println(s.Text())
    }
    if err = s.Err(); err != nil {
        log.Fatal("error reading temp file", err)
    }
}

Optimisation des performances

Pour des performances optimales dans ce qui précède solution, envisagez d’utiliser un bytes.Buffer au lieu d’un fichier temporaire. Ce tampon peut être transmis à un bufio.Reader pour une lecture pratique des données.

De plus, la boucle s.Scan() peut être remplacée par ioutil.ReadAll() pour une lecture efficace de toutes les données dans un octet tranche.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn