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)

 

posted @ 2021-08-18 15:32  小匡程序员  阅读(122)  评论(0编辑  收藏  举报