Golang 读写文件
Golang读写文件
这里记录golang在读写操作文件时的一些方法,供后续查询使用;
在读写文件时,此处记录3种方式来操作:
- 使用io/ioutils包来完成,主要为一次性读取和一次性写入
- 使用切片的方式,构建一个字节切片,将读入的内容放入其中,然后通过for循环写入
- 使用带缓冲的读取器bufio包操作,更便捷
一、读文件
文件打开模式
const ( O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件 O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件 O_RDWR int = syscall.O_RDWR // 读写模式打开文件 O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部 O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件 O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在 O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件 )
文件打开与关闭
func Create(name string) (file *File, err error) // 创建一个空文件,注意当文件已经存在时,会直接覆盖掉原文件,不会报错 func Open(name string) (file *File, err error) // 打开一个文件,注意打开的文件只能读,不能写 func OpenFile(name string, flag int, perm FileMode) (file *File, err error) // 以指定的权限打开文件 func (f *File) Close() error // 关闭文件,关闭后不可读写
二、使用ioutil包
package main import ( "fmt" "io/ioutil" ) func main() { //要求:将一个文件的内容全部读出并写入到另一个文件中,这2个文件已存在 file1Path := "d:/abc.txt" file2Path := "d:/kkk.txt" data, err := ioutil.ReadFile(file1Path) if err != nil { fmt.Printf("read file err=%v\n",err) return } err = ioutil.WriteFile(file2Path,data,0666) if err != nil { fmt.Printf("write file error=%v",err) } }
三、使用字节切片读取
package main import ( "bytes" "fmt" "io" "os" ) func main() { file, _ := os.Open("d:/tmp.txt") var output bytes.Buffer for { buf := make([]byte, 5) //长度为5的切片,读取内容为5则不会显示后面的内容,需要使用循环判断 n, err := file.Read(buf) if err != nil { if err == io.EOF { break } else { fmt.Printf("Error:could read data from the pipe,%s\n", err)
return } } // fmt.Printf("length(buf):%v,string(buf):%v\n", n, string(buf)) if n > 0 { output.Write(buf[:n]) //循环写入 } } fmt.Printf("%s\n", output.String()) }
四、使用带缓冲的读取器
package main import ( "bufio" "fmt" "os" ) func main() { file, _ := os.Open("d:/tmp.txt") outputbuf := bufio.NewReader(file) output0, _, err := outputbuf.ReadLine() if err != nil { fmt.Printf("Error:could read data from the pipe,%s\n", err) return } fmt.Printf("%s\n", string(output0)) }