文件打开和关闭

osOpen()*FileerrClose()Open()
func Open(name string) (*File, error)
Open()Close()
func (file *File) Close() error

示例:

import ("fmt""os"
)func main() {file, err := os.Open("./main.go")if err != nil {fmt.Println("open file failed!, err:", err)return}// 关闭文件,配合defer能防止忘记关闭defer file.Close()
}

文件读取

Read()方法

定义:

func (f *File) Read(b []byte) (n int, err error)
Read()0io.EOFio
import ("fmt""io""os"
)func main() {// 只读方式打开当前目录下的main.go文件file, err := os.Open("./main.go")if err != nil {fmt.Println("open file failed!, err:", err)return}defer file.Close()// 循环读取文件var content []bytevar tmp = make([]byte, 128)for {n, err := file.Read(tmp)if err == io.EOF {fmt.Println("文件读完了")break}if err != nil {fmt.Println("read file failed, err:", err)return}content = append(content, tmp[:n]...)}fmt.Println(string(content))
}

bufio按行读取

bufio
import ("bufio""fmt""io""os"
)func main() {file, err := os.Open("./main.go")if err != nil {fmt.Println("open file failed, err:", err)return}defer file.Close()// 新建一个缓冲区,把内容先放在缓冲区reader := bufio.NewReader(file)for {// 遇到'\n'则结束读取,读取内容包括'\n'line, err := reader.ReadString('\n') // 注意是字符if err == io.EOF {if len(line) != 0 {fmt.Println(line)}fmt.Println("文件读完了")break}if err != nil {fmt.Println("read file failed, err:", err)return}fmt.Print(line)}
}
bufioNewReader()
func NewReader(rd io.Reader) *Reader
NewReader()io.Stdin
ReadString()
func (b *Reader) ReadString(delim byte) (string, error)
ReadString()\n

ioutil一次性读取整个文件

io/ioutil
import ("fmt""io/ioutil"
)func main() {content, err := ioutil.ReadFile("./main.go")if err != nil {fmt.Println("read file failed, err:", err)return}fmt.Println(string(content))
}
ReadFile()
func ReadFile(filename string) ([]byte, error)
ReadFile()

文件写入

os.OpenFile()
func OpenFile(name string, flag int, perm FileMode) (*File, error)
nameflag
const (// Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.O_RDONLY int = syscall.O_RDONLY // open the file read-only.O_WRONLY int = syscall.O_WRONLY // open the file write-only.O_RDWR   int = syscall.O_RDWR   // open the file read-write.// The remaining values may be or'ed in to control behavior.O_APPEND int = syscall.O_APPEND // append data to the file when writing.O_CREATE int = syscall.O_CREAT  // create a new file if none exists.O_EXCL   int = syscall.O_EXCL   // used with O_CREATE, file must not exist.O_SYNC   int = syscall.O_SYNC   // open for synchronous I/O.O_TRUNC  int = syscall.O_TRUNC  // truncate regular writable file when opened.
)
permrwx

Write和WriteString

直接将内容写入文件。

import ("fmt""os"
)func main() {file, err := os.OpenFile("t1.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)if err != nil {fmt.Println("open file failed, err:", err)return}defer file.Close()str := "hello 浙江\n"file.Write([]byte(str))      // 写入字节切片数据file.WriteString("hello 杭州") // 直接写入字符串数据
}
Write()
func (f *File) Write(b []byte) (n int, err error)
Write()
WriteString()
func (f *File) WriteString(s string) (n int, err error) {return f.Write([]byte(s))
}
WriteString()Write()

bufio.NewWriter

将数据先写入缓冲区,写完后一次性将缓冲区中的内容写入文件。

import ("bufio""fmt""os""strconv"
)func main() {file, err := os.OpenFile("t1.txt", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666)if err != nil {fmt.Println("open file failed, err:", err)return}defer file.Close()writer := bufio.NewWriter(file)for i := 0; i < 10; i++ {writer.WriteString("hello中国" + strconv.Itoa(i) + "\n") // 将数据先写入缓存}writer.Flush() // 将缓存中的内容写入文件
}
NewWriter()
func NewWriter(w io.Writer) *Writer
NewWriter()
WriteString()
func (b *Writer) WriteString(s string) (int, error)
WriteString()len(s)
Flush()

ioutil.WriteFile

将内容直接写入文件。

func main() {str := `hello 中国hello 浙江hello 杭州`err := ioutil.WriteFile("t1.txt", []byte(str), 0666)if err != nil {fmt.Println("write file failed, err:", err)return}
}
WriteFile()
func WriteFile(filename string, data []byte, perm os.FileMode) error

参考