Go语言中的文件写操作详解

发表时间: 2024-05-24 10:08

os包

func Stat

func Stat(name string) (fi FileInfo, err error)

Stat返回一个描述name指定的文件对象的FileInfo。如果指定的文件对象是一个符号链接, 返回的FileInfo描述该符号链接指向的文件的信息, 本函数会尝试跳转该链接。

如果出错, 返回的错误值为*PathError类型。

os包

func IsNotExist

func IsNotExist(err error) bool

返回一个布尔值说明该错误是否表示一个文件或目录不存在。ErrNotExist和一些系统调用错误会使它返回真。

os包

func OpenFile

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)

OpenFile是一个更一般性的文件打开函数, 大多数调用者都应用Open或Create代替本函数。它会使用指定的选项(如O_RDONLY等)、指定的模式(如0666等_)打开指定名称的文件。

如果操作成功, 返回的文件对象可用于I/O。如果出错, 错误底层类型是*PathError。

os包

func Create

func Create(name string) (file *File, err error)

Create采用模式0666(任何人都可读写, 不可执行)创建一个名为name的文件, 如果文件已存在会截断它(为空文件)。

如果成功, 返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。如果出错, 错误底层类型是*PathError。

io包

func WriteString

func WriteString(w Writer, s string) (n int, err error)

WriteString函数将字符串s的内容写入w中。如果w已经实现了WriteString方法, 函数会直接调用该方法。

io/ioutil包

func WriteFile

func WriteFile(filename string, data []byte, perm os.FileMode) error

函数向filename指定的文件中写入数据。如果文件不存在将按给出的权限创建文件, 否则在写入数据之前清空文件。

os包

func (*PipeWriter) Write

func (w *PipeWriter) Write(data []byte) (n int, err error)

Write实现了标准Writer接口:它将数据写入到管道中,会阻塞直到读取器读完所有的数据或读取端被关闭。

bufio包

func NewWriter

func NewWriter(w io.Writer) *Writer

NewWriter创建一个具有默认大小缓冲、写入w的*Writer。

bufio包

func (*Writer) WriteString

func (b *Writer) WriteString(s string) (int, error)

WriteString写入一个字符串。返回写入的字节数。如果返回值nn < len(s), 还会返回一个错误说明原因。

实例1:

package mainimport ("fmt""os")/*** 判断文件是否存在 存在返回 true 不存在返回false*/func checkFileIsExist(filename string) bool {    var exist = true    if _, err := os.Stat(filename); os.IsNotExist(err) {    		exist = false    }    return exist}func main() {    var filename string = "abc.txt"    if checkFileIsExist(filename) { //如果文件存在    		fmt.Println("文件存在")    } else {    		fmt.Println("文件不存在")    }}

实例2:

package mainimport (    "bufio" //缓存IO    "fmt"    "io"    "io/ioutil" //io 工具包    "os")func check(e error) {    if e != nil {        panic(e)    }}/*** 判断文件是否存在 存在返回 true 不存在返回false*/func checkFileIsExist(filename string) bool {    var exist = true    if _, err := os.Stat(filename); os.IsNotExist(err) {        exist = false    }    return exist}func main() {    var wireteString = "测试n"    var filename = "./output1.txt"    var f *os.File    var err1 error    /***************************** 第一种方式: 使用 io.WriteString 写入文件 ***********************************************/    if checkFileIsExist(filename) { //如果文件存在        f, err1 = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件        fmt.Println("文件存在")    } else {        f, err1 = os.Create(filename) //创建文件        fmt.Println("文件不存在")    }    check(err1)    /*第一种方式: 使用 io.WriteString 写入文件*/    n, err1 := io.WriteString(f, wireteString) //写入文件(字符串)    check(err1)    fmt.Printf("写入 %d 个字节n", n)    /*第二种方式: 使用 ioutil.WriteFile 写入文件 */    var d1 = []byte(wireteString)    err2 := ioutil.WriteFile("./output2.txt", d1, 0666) //写入文件(字节数组)    check(err2)    /*  第三种方式: 使用 File(Write,WriteString) 写入文件 */    f, err3 := os.Create("./output3.txt") //创建文件    check(err3)    defer f.Close()    n2, err3 := f.Write(d1) //写入文件(字节数组)    check(err3)    fmt.Printf("写入 %d 个字节n", n2)    n3, err3 := f.WriteString("writesn") //写入文件(字节数组)    fmt.Printf("写入 %d 个字节n", n3)    f.Sync()    /* 第四种方式: 使用 bufio.NewWriter 写入文件 */    w := bufio.NewWriter(f) //创建新的 Writer 对象    n4, err3 := w.WriteString("bufferedn")    fmt.Printf("写入 %d 个字节n", n4)    w.Flush() //Flush方法将缓冲中的数据写入下层的io.Writer接口。    f.Close()}

注意: 以上第四种为最佳的方式;

文件操作-写操作汇总

使用io.WriteString 写入文件:34.3164842s

使用File(Write,WriteString) 写入文件:31.6852421s

使用bufio.NewWriter 写入文件:28.9083069s

写入文件的函数性能相差不大, bufio.NewWriter 效率稍微高一些;

案例: 写文件--使用 bufio.NewWriter 方式效率要高, 推荐使用

package mainimport ("bufio""log""os")func main() {    // 使用 bufio.NewWriter 写入文件    f, err := os.Create("xuchenkai.txt") //创建文件    if err != nil {        log.Println(err)    }    w := bufio.NewWriter(f) //创建新的 Writer 对象    _, err = w.WriteString("bufio这边主要是加了一层缓冲,其实都差不多,如果是像log那种一条一条输出的,个人觉得还是bufio好一些。") //写入文件(字节数组)    if err != nil {       log.Println(err)    }    w.Flush()    f.Close()}