file】 文件读写【golang】


使用io/ioutil


// 读
  
package main
  

  
import (
  
    "fmt"
  
    "io/ioutil"
  
)
  

  
func main() {
  
    b, err := ioutil.ReadFile("test.log")
  
    if err != nil {
  
        fmt.Print(err)
  
    }
  
    fmt.Println(b)
  
    str := string(b)
  
    fmt.Println(str)
  
}
  

// 写
  
package main
  

  
import (
  
    "io/ioutil"
  
)
  

  
func check(e error) {
  
    if e != nil {
  
        panic(e)
  
    }
  
}
  

  
func main() {
  

  
    d1 := []byte("hello\ngo\n")
  
    err := ioutil.WriteFile("test.txt", d1, 0644)
  
    check(err)
  
}
  

os进行读写


// 读
  
package main
  

  
import (
  
    "log"
  
    "os"
  
)
  

  
func main() {
  
    f, err := os.OpenFile("notes.txt", os.O_RDWR|os.O_CREATE, 0755)
  
    if err != nil {
  
        log.Fatal(err)
  
    }
  
    if err := f.Close(); err != nil {
  
        log.Fatal(err)
  
    }
  
}
  

// 写
  
package main
  

  
import (
  
    "bufio"
  
    "fmt"
  
    "io/ioutil"
  
    "os"
  
)
  

  
func check(e error) {
  
    if e != nil {
  
        panic(e)
  
    }
  
}
  

  
func main() {
  

  
    f, err := os.Create("/tmp/dat2")
  
    check(err)
  

  
    defer f.Close()
  

  
    d2 := []byte{115, 111, 109, 101, 10}
  
    n2, err := f.Write(d2)
  
    check(err)
  
    fmt.Printf("wrote %d bytes\n", n2)
  

  
    n3, err := f.WriteString("writes\n")
  
    fmt.Printf("wrote %d bytes\n", n3)
  

  
    f.Sync()
  

  
    w := bufio.NewWriter(f)
  
    n4, err := w.WriteString("buffered\n")
  
    fmt.Printf("wrote %d bytes\n", n4)
  

  
    w.Flush()
  

  
}
  

一次性读取文件的全部内容到内存


func main() {
  
    filename := flag.String("f", "", "Specify the file name")
  
    flag.Parse()
  

  
    if filename == nil || len(*filename) == 0 {
  
        flag.Usage()
  
        os.Exit(1)
  
    }
  

  
    contents, err := ioutil.ReadFile(*filename)
  
    if err != nil {
  
        log.Printf("Failed to read file %s,err:%s", *filename, err.Error())
  
        os.Exit(1)
  
    }
  
    fmt.Println(string(contents))
  
}
  

一次只读取一行


func main() {
  
    filename := flag.String("f", "", "Specify the file name")
  
    flag.Parse()
  

  
    if filename == nil || len(*filename) == 0 {
  
        flag.Usage()
  
        os.Exit(1)
  
    }
  

  
    f,err := os.Open(*filename)
  
    if err != nil{
  
        log.Printf("Failed to open file %s,err:%s",*filename,err.Error())
  
        os.Exit(1)
  
    }
  
    defer f.Close()
  
    buf := bufio.NewReader(f)
  
    for {
  
        line,err := buf.ReadBytes('\n')
  
        log.Print(string(line))
  

  
        if err != nil{
  
            if err == io.EOF{
  
                log.Println("end of file")
  
                break
  
            }else {
  
                log.Printf("read file err:%s",err.Error())
  
                break
  
            }
  
        }
  
    }
  
}
  

按字节读取文件内容


func main() {
  
    filename := flag.String("f", "", "Specify the file name")
  
    flag.Parse()
  

  
    if filename == nil || len(*filename) == 0 {
  
        flag.Usage()
  
        os.Exit(1)
  
    }
  

  
    f, err := os.Open(*filename)
  
    if err != nil {
  
        log.Printf("Failed to read file %s,err:%s", *filename, err.Error())
  
        os.Exit(1)
  
    }
  
    //指定一次读取的文件大小
  
    buf := make([]byte, 64)
  
    for {
  
        n, err := f.Read(buf)
  
        if err != nil && err != io.EOF {
  
            log.Printf("Failed to read,err:%s", err.Error())
  
            break
  
        }
  
        if n == 0 {
  
            break
  
        }
  
        fmt.Print(string(buf[:n]))
  
    }
  
}
  

读取超大文件


// 流处理
  
func ReadFile(filePath string, handle func(string)) error {
  
    f, err := os.Open(filePath)
  
    defer f.Close()
  
    if err != nil {
  
        return err
  
    }
  
    buf := bufio.NewReader(f)
  
 
  
    for {
  
        line, err := buf.ReadLine("\n")
  
        line = strings.TrimSpace(line)
  
        handle(line)
  
        if err != nil {
  
            if err == io.EOF{
  
                return nil
  
            }
  
            return err
  
        }
  
        return nil
  
    }
  
}
  

  
// 分片处理
  
func ReadBigFile(fileName string, handle func([]byte)) error {
  
    f, err := os.Open(fileName)
  
    if err != nil {
  
        fmt.Println("can't opened this file")
  
        return err
  
    }
  
    defer f.Close()
  
    s := make([]byte, 4096)
  
    for {
  
        switch nr, err := f.Read(s[:]); true {
  
        case nr < 0:
  
            fmt.Fprintf(os.Stderr, "cat: error reading: %s\n", err.Error())
  
            os.Exit(1)
  
        case nr == 0: // EOF
  
            return nil
  
        case nr > 0:
  
            handle(s[0:nr])
  
        }
  
    }
  
    return nil
  
}
  

腾图小抄 SCWY.net v0.03 小抄561条 自2022-01-02访问366919次