go语言io reader_go语言之IO操作(待补充)
前言
在Go中,輸入和輸出操作都是使用原語實現的,原語將數據模擬成可讀的或者可寫的字節流。
而Go的io包提供了io.Reader(將數據從某個資源讀取到傳輸緩沖區被流式傳輸和使用)和io.Writer(從緩沖區讀取數據,并寫入目標資源)接口。實現了io.Reader接口的唯一方法Read(p []byte)(n int, err error),它就是一個讀取器。n 讀取到的字節數
err 發生錯誤的信息(注意:資源讀取完畢返回io.EOF錯誤)
使用Reader
思路: Reader方法內部是循環被調用的,每次迭代都會從數據源取一塊數據放入緩沖區p,資源讀取完畢返回io.EOF錯誤為止。
我們通過strings.NewReader(string) 創建一個字符串讀取器來迭代讀取:package main
import (
"fmt"
"io"
"os"
"strings"
)
func main() {
//創建一個字符串讀取器
reader := strings.NewReader("How are you today You were in a bad mood yesterday")
//創建一個長度為3的切片
p := make([]byte, 3)
//循環取數據
for {
//讀取到的字節數,err 發生錯誤的信息(注意:資源讀取完畢返回io.EOF錯誤)
n, err := reader.Read(p)
if err != nil {
if err == io.EOF {
fmt.Println("The resource is read!")
break
}
fmt.Println("Read err :", err.Error())
os.Exit(1)
}
fmt.Println(string(p[:n]), p[:n])
}
}
輸出打印的內容:How [72 111 119]
ar [32 97 114]
e y [101 32 121]
ou [111 117 32]
tod [116 111 100]
ay [97 121 32]
You [89 111 117]
we [32 119 101]
re [114 101 32]
in [105 110 32]
a b [97 32 98]
ad [97 100 32]
moo [109 111 111]
d y [100 32 121]
est [101 115 116]
erd [101 114 100]
ay [97 121]
The resource is read!
拓展例子(讀取文件行數并且打印每一行內容和二進制流)package main
import (
"bufio"
"fmt"
"os"
"time"
)
func main() {
if len(os.Args) < 2 {
os.Exit(1)
}
filename := os.Args[1]
file, err := os.Open(filename)
defer file.Close()
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
reader := bufio.NewReader(file)
var line int
fmt.Print("下面為你讀取",filename,"每一行的內容:\n")
for {
lineContent, isPrefix, err := reader.ReadLine()
if err != nil {
break
}
if !isPrefix {
line++
time.Sleep(time.Second*1)
fmt.Println("第",line,"行的二進制數據流為:", lineContent,"內容是:",string(lineContent))
fmt.Print("\n")
}
}
fmt.Println("名字為:",filename,"的文件一共有:", line,"行")
}
總結
以上是生活随笔為你收集整理的go语言io reader_go语言之IO操作(待补充)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: moore 数据集_警报数据集(alar
- 下一篇: 软件开发者如何加密软件产品文件加密软件开