Heim  >  Artikel  >  Backend-Entwicklung  >  Unterschied zwischen Konsolenausgabestream und Mediendateistream

Unterschied zwischen Konsolenausgabestream und Mediendateistream

WBOY
WBOYnach vorne
2024-02-08 23:15:09534Durchsuche

Unterschied zwischen Konsolenausgabestream und Mediendateistream

Der Unterschied zwischen dem Konsolenausgabestream und dem Mediendateistream ist ein wichtiges Konzept in der Programmentwicklung. Der Konsolenausgabestream wird hauptsächlich zur Ausgabe von Informationen während der Programmausführung an die Konsole verwendet, um Entwicklern das Debuggen und Anzeigen der Ausführungsergebnisse zu erleichtern. Der Mediendateistream wird zum Lesen und Schreiben von Mediendateien wie Audio, Video usw. verwendet. Es gibt einige Unterschiede zwischen den beiden in Bezug auf Nutzung, Datenverarbeitung und Anwendungsszenarien. Für Entwickler ist es sehr wichtig, diese Unterschiede zu verstehen und zu beherrschen. Als nächstes werden wir die Unterschiede und Anwendungstipps zwischen den beiden im Detail untersuchen.

Frageninhalt

Ich habe Probleme beim Rendern eines GIF in Go. Die Ausgabe-GIF-Datei kann nicht mit einer Methode geöffnet werden, kann aber normal mit einer anderen Methode geöffnet werden. Ich habe Rendering .gif in Go gefunden, aber es hat mein spezifisches Problem nicht gelöst.

Dies ist der betreffende Code:

package main

import (
    "bufio"
    "fmt"
    "image"
    "image/color"
    "image/gif"
    "io"
    "math"
    "math/rand"
    "os"
    "time"
)

var palette = []color.Color{color.White, color.Black}

const (
    whiteIndex = 0
    blackIndex = 1
)

func main() {
    w := bufio.NewWriter(os.Stdout)
    lissajous(w)
}

func lissajous(out io.Writer) {
    const (
        cycles  = 5
        res     = 0.001
        size    = 100
        nframes = 64
        delay   = 8
    )
    rand.Seed(time.Now().UTC().UnixNano())

    freq := rand.Float64() * 3.0
    anim := gif.GIF{LoopCount: nframes}
    phase := 0.0

    for i := 0; i < nframes; i++ {
        rect := image.Rect(0, 0, 2 * size+1, 2 * size + 1)
        img := image.NewPaletted(rect, palette)

        for t := 0.0; t < cycles * 2 * math.Pi; t += res {
            x := math.Sin(t)
            y := math.Sin(t * freq + phase)
            img.SetColorIndex(size + int(x * size + 0.5), size + int(y * size + 0.5), blackIndex)
        }
        phase += 0.1
        anim.Delay = append(anim.Delay, delay)
        anim.Image = append(anim.Image, img)
    }
    err := gif.EncodeAll(out, &anim)
    if err != nil {
        return
    } else {
        fmt.Println(err)
    }
}

Die folgenden Befehle sind:

go build main.go
main > out.gif

Dann kann out.gif nicht geöffnet werden. Diese Methode funktioniert jedoch großartig:

func main() {
    fileName := "out.gif"
    f, err3 := os.Create(fileName)
    if err3 != nil {
        fmt.Println("create file fail")
    }
    w := bufio.NewWriter(f) 
    lissajous(w)
    w.Flush()
    f.Close()

}

Ich bin verwirrt, warum die erste Methode keine funktionsfähige GIF-Datei erstellt, die zweite Methode jedoch schon. Hängt das mit der Art und Weise zusammen, wie Go das Schreiben oder Puffern von Dateien handhabt?

Workaround

Laut @CeriseLimón Hinweis :

func main() {
    w := bufio.NewWriter(os.Stdout)
    lissajous(w)
    w.Flush()
}

Erklären Sie die letzte Frage

Das obige ist der detaillierte Inhalt vonUnterschied zwischen Konsolenausgabestream und Mediendateistream. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen