Go File 处理
· 阅读需 2 分钟
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()
}
