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
Libérer: 2024-11-30 04:30:16
original
843 Les gens l'ont consulté

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)
    }
}
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal