bytes、bufio包的相关理解与示例代码(2)| 青训营笔记

使用bytes.Buffer和io.Copy实现文件传输的示例

下面是一个使用bytes.Bufferio.Copy实现文件传输的示例:

package main

import (
    "bytes"
    "io"
    "log"
    "os"
)

func main() {
    // 打开源文件
    srcFile, err := os.Open("source.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer srcFile.Close()

    // 创建一个新的bytes.Buffer对象
    buf := new(bytes.Buffer)

    // 将源文件内容写入到bytes.Buffer对象中
    _, err = io.Copy(buf, srcFile)
    if err != nil {
        log.Fatal(err)
    }

    // 打开目标文件
    dstFile, err := os.Create("target.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer dstFile.Close()

    // 将bytes.Buffer对象中的数据写入到目标文件中
    _, err = io.Copy(dstFile, buf)
    if err != nil {
        log.Fatal(err)
    }
}

在上面的示例中,首先打开源文件source.txt,然后创建一个新的bytes.Buffer对象,使用io.Copy将源文件内容写入到bytes.Buffer对象中。接着打开目标文件target.txt,使用io.Copybytes.Buffer对象中的数据写入到目标文件中。最后关闭文件句柄,完成文件传输的操作。

需要注意的是,这种方式适用于文件较小的情况,因为在将文件内容写入bytes.Buffer对象中时,需要将整个文件内容读入内存,如果文件较大,可能会造成内存占用过高。对于大文件的传输,应该使用分块传输等技术来实现。

bufio.NewReadWriter

bufio是Go语言标准库中的一个包,提供了一些帮助实现缓冲I/O的功能。其中,bufio.NewReadWriter函数可以用于创建一个新的缓冲读写器,它将一个io.Reader和一个io.Writer结合在一起,可以在它们之间进行读写操作。

该函数的函数签名如下:

func NewReadWriter(r *Reader, w *Writer) *ReadWriter

其中,参数r和w分别是bufio.Reader和bufio.Writer类型的指针,表示要进行缓冲读写的输入和输出流。函数返回一个新的ReadWriter对象,它包含一个bufio.Reader和一个bufio.Writer对象,并将它们结合在一起,以便在它们之间进行读写操作。

使用bufio.NewReadWriter函数可以帮助我们更方便地进行缓冲读写操作。例如,假设我们要从标准输入读取一行文本,然后将其写入标准输出。可以使用如下代码:

package main

import (
    "bufio"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    writer := bufio.NewWriter(os.Stdout)
    readWriter := bufio.NewReadWriter(reader, writer)

    line, _ := readWriter.ReadString('\n')
    readWriter.WriteString(line)
    readWriter.Flush()
}

在这个例子中,我们使用bufio.NewReader函数创建了一个标准输入的缓冲读取器,并使用bufio.NewWriter函数创建了一个标准输出的缓冲写入器。然后,我们使用bufio.NewReadWriter函数将它们结合在一起,并使用它们进行读写操作。最后,我们使用bufio.Writer对象的Flush方法将缓冲区中的数据刷新到标准输出。

bufio.NewReader(os.Stdin)

bufio.NewReader(os.Stdin)是一种用于从标准输入(stdin)读取数据的方法,它使用了bufio包中的NewReader函数来创建一个新的*Reader对象,该对象可以被用于从标准输入读取数据。

bufio是Go标准库中的一个包,它提供了一些缓存IO相关的函数和类型。其中,NewReader函数可以用于创建一个新的*Reader对象,该对象可以被用于从任何io.Reader接口中读取数据。

在这里,bufio.NewReader(os.Stdin)的作用是创建一个新的*Reader对象,该对象可以从标准输入中读取数据。一旦创建了该对象,我们就可以使用其提供的方法(如ReadString、ReadBytes、ReadLine等)来从标准输入中读取数据。

例如,下面的代码演示了如何使用bufio.NewReader(os.Stdin)从标准输入中读取一行字符串:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Enter text: ")
    text, _ := reader.ReadString('\n')
    fmt.Println(text)
}

在这个例子中,我们使用了bufio.NewReader(os.Stdin)来创建一个*Reader对象,并使用其提供的ReadString方法从标准输入中读取一行字符串。读取到的字符串将包含行末符号('\n'),因此我们需要使用strings包中的TrimSuffix函数将其去除。最后,我们将读取到的字符串打印出来。

使用bufio.Reader设置读取超时时间的例子

好的,下面是一个使用bufio.Reader设置读取超时时间的例子:

package main

import (
	"bufio"
	"fmt"
	"net"
	"os"
	"time"
)

func main() {
	// 创建一个TCP连接
	conn, err := net.Dial("tcp", "example.com:80")
	if err != nil {
		fmt.Println("Error connecting:", err)
		return
	}
	defer conn.Close()

	// 设置读取超时时间为5秒
	conn.SetReadDeadline(time.Now().Add(5 * time.Second))

	// 创建一个bufio.Reader对象
	reader := bufio.NewReader(conn)

	// 读取数据
	text, err := reader.ReadString('\n')
	if err != nil {
		// 判断是否超时错误
		if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
			fmt.Println("Timeout reading input")
			return
		}

		fmt.Println("Error reading input:", err)
		return
	}

	fmt.Println("Read:", text)
}

在这个例子中,我们首先创建了一个TCP连接,并将其传入conn.SetReadDeadline方法中,以设置读取超时时间为5秒。然后,我们创建了一个bufio.Reader对象,并将TCP连接传入该对象中。最后,我们使用reader.ReadString('\n')方法从连接中读取一行文本,直到遇到换行符为止。

如果在读取过程中发生超时错误,我们可以通过判断错误类型来进行处理。在这个例子中,我们使用了net.Error接口的Timeout方法来判断错误是否为超时错误。如果是超时错误,则打印提示信息并返回;否则,打印错误信息并返回。

bufio.NewReader(os.Stdin)

bufio.NewReader(os.Stdin) 是一个用于创建从标准输入读取数据的新读取器(Reader)的代码片段。

在 Go 语言中,os.Stdin 是一个标准库文件对象,表示标准输入流。bufio 包是一个标准库包,提供了高效的缓冲读写操作。NewReader() 方法是其中之一,用于创建新的读取器对象。

这个代码片段中,bufio.NewReader() 创建了一个新的读取器对象,并将标准输入流 os.Stdin 作为读取器的输入源。这个读取器可以用于以行为单位从标准输入读取数据,或者以其他方式从标准输入读取数据,例如读取指定长度的字节或读取到某个特定的分隔符。

使用读取器进行输入操作可以提高输入效率和程序性能,因为读取器会缓冲输入数据并尽可能地减少系统调用。

posted @   lovevivi121  阅读(2)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示