go应用专题:file操作
参考:
https://www.cnblogs.com/shiluoliming/p/8312928.html(简单写文件操作的4种方法)
创建文件
import ( "bufio" //缓存IO "fmt" "io" "io/ioutil" //io 工具包 "os" ) //变量 var wireteString = "测试n" var filename = "./output1.txt" var f *os.File //方式一: f, err1 = os.Create(filename) //创建文件 f, err1 = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件,可以包含创建 //方式二:ioutil.WriteFile创建并写入: var d1 = []byte(wireteString)
err2 := ioutil.WriteFile("./output2.txt", d1, 0666) //写入文件(字节数组)
底层原理:os.WriteFile(filename, data, perm) f = os.OpenFile(name, O_WRONLY|O_CREATE|O_TRUNC, perm) f.Write(data)
写文件(追加或修改,取决于打开文件的方式)
//方式1 n, err1 := io.WriteString(f, wireteString) //写入文件(字符串) //方式2 var d1 = []byte(wireteString) n2, err3 := f.Write(d1) //写入文件(字节数组) //方式3 n3, err3 := f.WriteString("writesn") //写入文件(字节数组) //方式4 w := bufio.NewWriter(f) //创建新的 Writer 对象 n4, err3 := w.WriteString("bufferedn") fmt.Printf("写入 %d 个字节n", n4) w.Flush()
读文件
//方式1:将整个文件读取到内存: 当文件非常大时,尤其在 RAM 存储量不足的情况下,把整个文件都读入内存是没有意义的。更好的方法是分块读取文件。这可以使用 bufio 包来完成。 #1.1 data, err := ioutil.ReadFile("test.txt") if err != nil { fmt.Println("File reading error", err) return } fmt.Println("Contents of file:", string(data)) #1.2同上 f, err := os.Open("file/test") if err != nil { fmt.Println("read file fail", err) return "" } defer f.Close() fd, err := ioutil.ReadAll(f) if err != nil { fmt.Println("read to fd fail", err) return "" } return string(fd) //方式2:逐行读取 2.1 file, err := os.Open("app-2019-06-01.log") if err != nil { log.Fatal(err) } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { lineText := scanner.Text() } 2.2 file, err := os.Open("filetoread.txt") if err != nil { fmt.Println(err) return } defer file.Close() scanner := bufio.NewScanner(file) scanner.Split(bufio.ScanLines) // 这是我们的缓冲区 var lines []string for scanner.Scan() { lines = append(lines, scanner.Text()) } fmt.Println("read lines:") for _, line := range lines { fmt.Println(line) } //方式3:按字节读取 f, err := os.Open("file/test") //把file读取到缓冲区中 defer f.Close() var chunk []byte buf := make([]byte, 1024) for { //从file读取到buf中 n, err := f.Read(buf) if err != nil && err != io.EOF{ fmt.Println("read buf fail", err) return "" } //说明读取结束 if n == 0 { break } //读取到最终的缓冲区中 chunk = append(chunk, buf[:n]...) } return string(chunk)