文件在程序中是以流的形式来操作的。
流:数据从数据源(文件)和程序(内存)之间经历的路径
输入流:数据从数据源(文件)到程序(内存)的路径
输出流:数据从程序(内存)到数据源(文件)的路径
读文件方式:
1.带缓冲区的方式,os.Open, file.Close, bufio.NewReader(), reader.ReadString函数和方法:
func main() { file, err := os.Open("b.txt") if err != nil { fmt.Println("open file err=", err) } defer file.Close() reader := bufio.NewReader(file) for { str, err := reader.ReadString('\n') fmt.Print(str) if err == io.EOF { break } } }
2.使用ioutil一次将整个文件读入到内存中,这种方式适用于文件不大的情况。 相关的方法和函数(ioutil.ReadFile):
func main() { content, err := ioutil.ReadFile("b.txt") if err != nil { fmt.Println("reard file err=", err) } fmt.Printf("%v", string(content)) }
写文件方式:
1.使用缓存bufio.NewWriter()
func main() { file, err := os.OpenFile("a.txt", os.O_WRONLY | os.O_CREATE, 0666) if err != nil { fmt.Println("open file err=", err) return } defer file.Close() str := "hello world\n" writer := bufio.NewWriter(file) for i := 0; i < 5; i++ { writer.WriteString(str) } writer.Flush() }
2.从一个文件读取内容后写入到另一个文件:ioutil.WriteFile, ioutil.ReadFile
func main() { data, err := ioutil.ReadFile("a.txt") if err != nil { fmt.Println("read file is err=", err) return } err = ioutil.WriteFile("b.txt", data, 0666) if err != nil { fmt.Println("read file is err=", err) } }
判断文件是否存在
golang判断文件或文件夹是否存在的方法为使用os.Stat()函数返回的错误值进行判断:
1)如果返回的错误为nil,说明文件或文件夹存在;
2)如果返回的错误类型使用os.IsNotExits()判断为true,说明文件或文件夹不存在;
3)如果返回的错误为其它类型,则不确定是否存在
func PathExits(path string) (bool, error) { _, err := os.Stat(path) if err == nil { return true, nil } if os.IsNotExist(err) { return false, nil } return false, err }