GO 带缓冲的读写需要用到bufio这个包,bufio包实现了有缓冲的I/O。它包装一个io.Reader或io.Writer接口对象,同时还提供了缓冲和一些文本I/O的帮助函数的对象。
带缓冲的读取
func NewReader(rd io.Reader) *Reader
- func (b *Reader) Reset(r io.Reader)
- func (b *Reader) Buffered() int
- func (b *Reader) Peek(n int) ([]byte, error)
- func (b *Reader) Read(p []byte) (n int, err error)
- func (b *Reader) ReadByte() (c byte, err error)
- func (b *Reader) UnreadByte() error
- func (b *Reader) ReadRune() (r rune, size int, err error)
- func (b *Reader) UnreadRune() error
- func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)
- func (b *Reader) ReadSlice(delim byte) (line []byte, err error)
- func (b *Reader) ReadBytes(delim byte) (line []byte, err error)
- func (b *Reader) ReadString(delim byte) (line string, err error)
- func (b *Reader) WriteTo(w io.Writer) (n int64, err error)
只读方式打开的文件
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
- func (b *Writer) Reset(w io.Writer)
- func (b *Writer) Buffered() int
- func (b *Writer) Available() int
- func (b *Writer) Write(p []byte) (nn int, err error)
- func (b *Writer) WriteString(s string) (int, error)
- func (b *Writer) WriteByte(c byte) error
- func (b *Writer) WriteRune(r rune) (size int, err error)
- func (b *Writer) Flush() error
- func (b *Writer) ReadFrom(r io.Reader) (n int64, err error)
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()
}