(17)Go 带缓冲的读写、复制(bufio包)

GO 带缓冲的读写需要用到bufio这个包,bufio包实现了有缓冲的I/O。它包装一个io.Reader或io.Writer接口对象,同时还提供了缓冲和一些文本I/O的帮助函数的对象。

带缓冲的读取

func NewReader(rd io.Reader) *Reader 

只读方式打开的文件  

package main

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

// 带缓冲的读入
func main() {
	file, err := os.Open("1.txt")
	if err != nil {
		fmt.Println("文件打开失败" + err.Error())
		return
	}

	defer func() {
		file.Close()
		fmt.Println("文件关闭")
	}()
	
	// 创建带缓冲的读器
	reader := bufio.NewReader(file)

	for  {
		str, err := reader.ReadString('\n')
		if err == nil {
			fmt.Print(str)
		} else if err == io.EOF{
			fmt.Println(str)
			break
		} else {
			fmt.Println("出错!!")
			return
		}
	}

	fmt.Println("读取完毕")
}

带缓冲的写入

 func NewWriter(w io.Writer) *Writer

package main

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

func main() {
	// 打开33.txt文件,没有就创建《有的话就清空其内容》
	// 就有可读可写
	// 下面OpenFile等同于os.Create("33.txt")
	file, err := os.OpenFile("33.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666)
	if err != nil {
		fmt.Println(err.Error())
		return
	}

	// 创建带缓冲的写入器
	writer := bufio.NewWriter(file)

	writer.Write([]byte{'w','s','\n'})
	writer.WriteString("hello world!")
	writer.WriteRune('我')
	writer.WriteByte('\n')
	writer.WriteByte(65)
	writer.Flush()
}

文件的复制

需注意Read()和ReadSting()函数返回EOF的区别

package main

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

func main() {
	srcfile, err := os.OpenFile("php.zip", os.O_RDONLY, 0666)
	if err != nil {
		fmt.Println(err.Error())
		return
	}

	dsfile, err := os.OpenFile("xx.zip", os.O_CREATE|os.O_WRONLY, 0666)
	if err != nil {
		fmt.Println(err.Error())
		return
	}

	defer func() {
		srcfile.Close()
		dsfile.Close()
	}()

	reader := bufio.NewReader(srcfile)
	writer := bufio.NewWriter(dsfile)
	bytes := make([]byte, 4096)

	for  {
		_, err = reader.Read(bytes)
		if err != nil {
			if err == io.EOF  {
				break
			}
			fmt.Println(err.Error())
			return
		} else {
			_, err = writer.Write(bytes)
			if err != nil {
				fmt.Println(err.Error())
				return
			}
		}
	}

	writer.Flush()

}

猜你喜欢

转载自blog.csdn.net/jadeshu/article/details/106595441
今日推荐