// ReadOne 读取到file中,再利用ioutil将file直接读取到[]byte中
func ReadOne() string {
file, err := os.Open("file/test")
if err != nil {
fmt.Println("read file fail", err)
return ""
}
defer file.Close()
content, err := ioutil.ReadAll(file)
if err != nil {
fmt.Println("read to fd fail", err)
return ""
}
return string(content)
}
// WriteOne 使用 bufio.NewWriter 写文件
func WriteOne() {
fileName := "file/test3"
file, err3 := os.Create(fileName) //创建文件
defer file.Close()
if err3 != nil {
fmt.Println("create file fail")
}
writer := bufio.NewWriter(file) //创建新的 Writer 对象
_, err := writer.WriteString("bufferedn")
if err != nil {
fmt.Println("write fail")
}
writer.Flush()
}
// ReadTwo 利用ioutil.ReadFile直接从文件读取到[]byte中
func ReadTwo() string {
f, err := ioutil.ReadFile("file/test")
if err != nil {
fmt.Println("read fail", err)
}
return string(f)
}
// WriteTwo 使用 ioutil.WriteFile 写文件
func WriteTwo() {
fileName := "file/test2"
strTest := "测试测试"
var d = []byte(strTest)
err := ioutil.WriteFile(fileName, d, 0666)
if err != nil {
fmt.Println("write fail")
}
fmt.Println("write success")
}
图一、io.Reader/Writer之间的关系
io.Reader/Writer,有几个常用的实现:
net.Conn: 网络
os.Stdin, os.Stdout, os.Stderr: console终端标准输出,err
os.File: 网络,标准输入输出,文件的流读取
strings.Reader: 把字符串抽象成Reader
bytes.Reader: 把[]byte抽象成Reader
bytes.Buffer: 把[]byte抽象成Reader和Writer
bufio.Reader/Writer: 抽象成带缓冲的流读取(比如按行读写)
io库
io 库属于底层接口定义库。它的作用主要是定义个 I/O 的基本接口和个基本常量,并解释这些接口的功能。在实际编写代码做 I/O 操作时,这个库一般只用来调用它的常量和接口定义,比如用 io.EOF 判断是否已经读取完,用 io.Reader 做变量的类型声明。
os 库
os 库主要是处理操作系统操作的,它作为Go程序和操作系统交互的桥梁。创建文件、打开或者关闭文件、Socket等等这些操作和都是和操作系统挂钩的,所以都通过 os 库来执行。
ioutil库
ioutil 库是一个有工具包,它提供了很多使用的 IO 工具函数,例如 ReadAll、ReadFile、WriteFile、ReadDir。唯一需要注意的是它们都是一次性读取和一次性写入,所以使用时,尤其是把数据从文件里一次性读到内存中时需要注意文件的大小。
bufio库
bufio,可以理解为在 io 库的基础上额外封装加了一个缓存层,它提供了很多按行进行读写的函数,从io库的按字节读写变为按行读写对写代码来说还是方便了不少。
bytes 和 strings 库
bytes 和 strings 库里的 bytes.Reader 和string.Reader,它们都实现了 io.Reader 接口,也都提供了NewReader方法用来从 []byte 或者 string 类型的变量直接构建出相应的Reader实现。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。