跳到主要内容

Go File 处理

· 阅读需 3 分钟
ahKevinXy

预览图

os.ReadFile 指定文件读取文件

package main

import (
"fmt"
"os"
)

func main() {
fileName := "test.txt"
content, err := os.ReadFile(fileName)
if err != nil {
return
}
fmt.Println(string(content))
}

ioutil.ReadFile 读取文件

package main

import (
"fmt"
"io/ioutil"
)

func main() {

fileName := "test.txt"
content, err := ioutil.ReadFile(fileName)

if err != nil {
fmt.Println(err)

return
}
fmt.Println(string(content))
}

os.Open 通过句柄打开文件

package main

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

func main() {
fileName := "test.txt"
file, err := os.Open(fileName)

if err != nil {
fmt.Println(err)
return
}

defer file.Close()

content, err := ioutil.ReadAll(file)

if err !=nil {

fmt.Println(err)
return
}

fmt.Println(string(content))
}

os.OpenFile 打开文件

package main

import (
"fmt"
"os"
)

func main() {
fileName := "test.txt"
// If the file does not exist, and the O_CREATE flag
// flag:文件的打开方式,如只读、只写、读写等
//文件的读写权限
file, err := os.OpenFile(fileName, os.O_RDONLY, 0)

if err != nil {

fmt.Println(err)

return
}

defer file.Close()

content, err := ioutil.ReadAll(file)

if err !=nil {

fmt.Println(err)
return
}

fmt.Println(string(content))

}

切片读取文件 按照行读取

package main

import (
"bufio"
"fmt"
"io"
"os"
"strings"
)

func main() {
fileName := "test.txt"
file, err := os.Open(fileName)

if err != nil {
fmt.Println(err)
return
}

defer file.Close()
// 解决 content 文件过大导致
// content, err := ioutil.ReadAll(file)

r := bufio.NewReader(file)
for {
lineBytes, err := r.ReadBytes('\n')
line := strings.TrimSpace(string(lineBytes))

if err != nil && err != io.EOF {

return
}
if err == = io.EOF {
break
}

fmt.Println(line)
}

}

按照固定长度读取

package main

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

func main() {
file, err := os.Open("test.txt")
if err != nil {
fmt.Println(err)
return
}

r := bufio.NewReader(file)

buf := make([]byte, 1024)
for {
n, err := r.Read(buf)
if err != nil && err != io.EOF {
fmt.Println(err)
return
}
if n ==0 {
break
}
fmt.Println(string(buf[:n]))

}
}

使用syscall

会每次读取 100 字节的数据,并发送到通道中,由另外一个协程进行读取并打印出来

package main

import (
"fmt"
"sync"
"syscall"
)

func main() {
fd, err := syscall.Open("christmas_apple.py", syscall.O_RDONLY, 0)
if err != nil {
fmt.Println("Failed on open: ", err)
}
defer syscall.Close(fd)

var wg sync.WaitGroup
wg.Add(2)
dataChan := make(chan []byte)
go func() {
wg.Done()
for {
data := make([]byte, 100)
n, _ := syscall.Read(fd, data)
if n == 0 {
break
}
dataChan <- data
}
close(dataChan)
}()

go func() {
defer wg.Done()
for {
select {
case data, ok := <-dataChan:
if !ok {
return
}

fmt.Printf(string(data))
default:

}
}
}()
wg.Wait()
}
标签:
Loading Comments...