当前位置: 首页 > 面试题库 >

下载文件时如何打印字节?-golang

诸葛亮
2023-03-14
问题内容

我想知道在下载文件时是否可以计数和打印下载的字节数。

out, err := os.Create("file.txt")
    defer out.Close()
    if err != nil {
        fmt.Println(fmt.Sprint(err) )

        panic(err)
    }
    resp, err := http.Get("http://example.com/zip")
    defer resp.Body.Close()
    if err != nil {
        fmt.Println(fmt.Sprint(err) )
        panic(err)
    }

    n, er := io.Copy(out, resp.Body)
    if er != nil {
        fmt.Println(fmt.Sprint(err) )
    }
    fmt.Println(n, "bytes ")

问题答案:

如果我理解正确,则希望在传输数据时显示读取的字节数。大概保持某种进度条之类的东西。在这种情况下,您可以使用Go的组合数据结构将阅读器或编写器包装在自定义io.Readerio.Writer实现中。

它只是将相应的ReadWrite调用转发到基础流,同时使用(int, error)它们返回的值进行一些其他工作。这是您可以在Go操场上运行的示例。

package main

import (
    "bytes"
    "fmt"
    "io"
    "os"
    "strings"
)

// PassThru wraps an existing io.Reader.
//
// It simply forwards the Read() call, while displaying
// the results from individual calls to it.
type PassThru struct {
    io.Reader
    total int64 // Total # of bytes transferred
}

// Read 'overrides' the underlying io.Reader's Read method.
// This is the one that will be called by io.Copy(). We simply
// use it to keep track of byte counts and then forward the call.
func (pt *PassThru) Read(p []byte) (int, error) {
    n, err := pt.Reader.Read(p)
    pt.total += int64(n)

    if err == nil {
        fmt.Println("Read", n, "bytes for a total of", pt.total)
    }

    return n, err
}

func main() {
    var src io.Reader    // Source file/url/etc
    var dst bytes.Buffer // Destination file/buffer/etc

    // Create some random input data.
    src = bytes.NewBufferString(strings.Repeat("Some random input data", 1000))

    // Wrap it with our custom io.Reader.
    src = &PassThru{Reader: src}

    count, err := io.Copy(&dst, src)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    fmt.Println("Transferred", count, "bytes")
}

它生成的输出是这样的:

Read 512 bytes for a total of 512
Read 1024 bytes for a total of 1536
Read 2048 bytes for a total of 3584
Read 4096 bytes for a total of 7680
Read 8192 bytes for a total of 15872
Read 6128 bytes for a total of 22000
Transferred 22000 bytes


 类似资料:
  • 问题内容: 我有一个JSON文件,我想把它打印成一团糟。在Python中最简单的方法是什么? 我知道PrettyPrint带有一个“对象”,我认为它可以是一个文件,但是我不知道如何传递文件。仅使用文件名是行不通的。 问题答案: 该模块已经实现了一些基本的漂亮打印,其参数指定缩进多少空格: 要解析文件,请使用:

  • 问题内容: 我有一个JSON文件,我想把它弄得一团糟-在python中最简单的方法是什么?我知道PrettyPrint带有一个“对象”,我认为它可以是一个文件,但是我不知道如何传递文件-仅使用文件名不起作用。 问题答案: 该模块已经使用参数实现了一些基本的漂亮打印: 要解析文件,请使用json.load():

  • 我想把我正在编辑的文件发送到打印机,就像我在记事本中做的那样。我没有发现任何关于打印命令的提示。这是不可能的吗?

  • 接收字节数组(表示任何内容:某种有线格式、某种形式的编码数据、带有嵌入“文本”的二进制数据等)。我希望能够以以下形式打印数组: 作为十六进制字符串 作为“可打印”文本 第一种情况部分是出于调试的原因,但也可以在非调试模式下使用。第二种情况纯粹是出于调试的原因,并允许人类与其他信息源进行比较。 如果任何人有如何实现这一点的信息,我将非常感谢。

  • 问题是,在这种代码状态下,文件和目录是这样打印的: 但是我需要先打开目录,然后打开文件:靠近。我试图找出问题出在哪里,但无济于事。我需要改变什么,在代码中的哪里得到想要的结果?

  • “字体设置”一节) .tex 源文件中使用以下命令定义字体: \usetypescriptfile[zhfonts] %加载打印字体配置文件 zhfonts.tex \usetypescript[myscript] %使用打印字体配置文件中定义打印字体的脚本 myscript \setupbodyfont[myfont,ss,11pt] %使用脚本预定义的 myfont 字体: 字