跳至主要內容

文件

LincZero大约 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("文件写入成功,且全部完了")
}