文件
大约 2 分钟
文件
核心:
- os包,及里面的File结构体,可以开关文件。详见 studygolang.com/pkgdoc
- io包,io流相关,可以读写文件。
- io/ioutil包,读写文件
核心操作:
- 内容操作:开 闭 写 读
- 整体操作:增 删 剪 拷
文件打开
os.Open
// 原型
func Open(name string) (file *File, err error)
案例,见下一节
os.OpenFile
就是更多参数的 os.Open。详见:文件写入
文件关闭 (File.Close)
// 原型
func (f *File) Close() error
案例
package main
import(
"fmt"
"os"
)
func main() {
// 打开文件
file, err := os.Open("d:/Test.txt");
if err != nil {
fmt.Println("文件打开错误,错误:", err)
}
fmt.Printf("文件 = %v", file) // 打印地址
// 操作文件
// 关闭文件
err2 := file.Close();
if err2 != nil {
fmt.Println("文件关闭错误")
}
}
文件读取
一次性 (io/ioutil.ReadFile)
(弹幕似乎说这个函数已经废弃了)
原理:一次将整个文件读入到内存中,这种方式适用于文件不大的情况
使用:io/ioutil包的 ReadFile
方法
// 原型
func ReadFile(filename string) ([]byte, error)
案例:
package main
import(
"fmt"
"io/ioutil"
)
func main() {
content, err := ioutil.ReadFile("d:/Test.txt")
if err != nil {
fmt.Println("文件读取错误,错误:", err)
}
fmt.Printf("%v", content) // 这里是字节数组,而非字符方式
fmt.Printf("%v", string(content)) // 字符串方式
}
流式,带缓冲区 (bufio.NewReader)
原理:按4096一次一次读取,适合读取较大的文件
使用:
- 文件开闭
os.Open、file.Close
- 创建流
bufio.NewReader()
- 部分读
ReadString
案例:
package main
import(
"fmt"
"os"
"bufio"
"io"
)
func main() {
// 打开文件
file, err := os.Open("d:/Test.txt")
if err != nil {
fmt.Println("文件打开错误,错误:", err)
return
}
// 退出时 关闭文件
defer file.Close()
// 创建一个流
reader := bufio.NewReader(file)
for {
str, err := reader.ReadString('\n')
if err == io.EOF { // 读到文件结尾
break
}
fmt.Println(str)
}
fmt.Println("文件读取成功,且全部读完了")
}
文件写入
流式,带缓冲区 (bufio.NewWriter)
// 原型
/**
* @param name 文件路径
* @param flag 文件打开模式,可用位与符号组合
* - O_RDONLY 只读
* - O_WRONLY 只写
* - O_RDWR 读写
* - O_APPEND 追加
* - O_CREATE 若不存在则创建
* - O_EXCL 和CREATE搭配,文件必须不存在
* - O_SYNC 打开文件用于同步IO
* - O_TRUNC 打开时清空内容 (如果可能)
* @param perm 权限控制 (Linux/Unix系统下生效,Windows无效)
*/
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
案例
package main
import(
"fmt"
"os"
"bufio"
"io"
)
func main() {
// 打开文件
file, err := os.OpenFile("d:/Test.txt", os.O_RDWR | os.O_APPEND | os.O_CREATE, 0666)
if err != nil {
fmt.Println("文件打开错误,错误:", err)
return
}
// 退出时 关闭文件
defer file.Close()
// 创建一个流
writer := bufio.NewWriter(file)
for i:=0; i<10; i++{
writer.WriteString("你好\n")
}
writer.Flush() // 流式输出要刷新数据才能真正写到文件中
fmt.Println("文件写入成功,且全部完了")
}