Go語言IO輸入輸出底層原理及文件操作API
1.輸入輸出的底層原理
終端其實是一個文件,相關(guān)實例如下:
- os.Stdin:標(biāo)準(zhǔn)輸入的文件實例,類型為*File
- os.Stdout:標(biāo)準(zhǔn)輸出的文件實例,類型為*File
- os.Stderr:標(biāo)準(zhǔn)錯誤輸出的文件實例,類型為*File
以文件的方式操作終端:
package main
import "os"
func main() {
var buf [16]byte
os.Stdin.Read(buf[:])
os.Stdin.WriteString(string(buf[:]))
}
2. 文件操作相關(guān)API
- func Create(name string) (file *File, err Error) 根據(jù)提供的文件名創(chuàng)建新的文件,返回一個文件對象,默認(rèn)權(quán)限是0666
- func NewFile(fd uintptr, name string) *File 根據(jù)文件描述符創(chuàng)建相應(yīng)的文件,返回一個文件對象
- func Open(name string) (file *File, err Error) 只讀方式打開一個名稱為name的文件
- func OpenFile(name string, flag int, perm uint32) (file *File, err Error) 打開名稱為name的文件,flag是打開的方式,只讀、讀寫等,perm是權(quán)限
- func (file *File) Write(b []byte) (n int, err Error) 寫入byte類型的信息到文件
- func (file *File) WriteAt(b []byte, off int64) (n int, err Error) 在指定位置開始寫入byte類型的信息
- func (file *File) WriteString(s string) (ret int, err Error) 寫入string信息到文件
- func (file *File) Read(b []byte) (n int, err Error) 讀取數(shù)據(jù)到b中
- func (file *File) ReadAt(b []byte, off int64) (n int, err Error) 從off開始讀取數(shù)據(jù)到b中
- func Remove(name string) Error 刪除文件名為name的文件
3. 打開和關(guān)閉文件
os.Open()函數(shù)能夠打開一個文件,返回一個*File和一個err。對得到的文件實例調(diào)用close()方法能夠關(guān)閉文件。
package main
import (
"fmt"
"os"
)
func main() {
// 只讀方式打開當(dāng)前目錄下的main.go文件
file, err := os.Open("./main.go")
if err != nil {
fmt.Println("open file failed!, err:", err)
return
}
// 關(guān)閉文件
file.Close()
}
4. 寫文件
package main
import (
"fmt"
"os"
)
func main() {
// 新建文件
file, err := os.Create("./xxx.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
for i := 0; i < 5; i++ {
file.WriteString("ab\n")
file.Write([]byte("cd\n"))
}
}
5. 讀文件
文件讀取可以用file.Read()和file.ReadAt(),讀到文件末尾會返回io.EOF的錯誤
package main
import (
"fmt"
"io"
"os"
)
func main() {
// 打開文件
file, err := os.Open("./xxx.txt")
if err != nil {
fmt.Println("open file err :", err)
return
}
defer file.Close()
// 定義接收文件讀取的字節(jié)數(shù)組
var buf [128]byte
var content []byte
for {
n, err := file.Read(buf[:])
if err == io.EOF {
// 讀取結(jié)束
break
}
if err != nil {
fmt.Println("read file err ", err)
return
}
content = append(content, buf[:n]...)
}
fmt.Println(string(content))
}
6. 拷貝文件
package main
import (
"fmt"
"io"
"os"
)
func main() {
// 打開源文件
srcFile, err := os.Open("./xxx.txt")
if err != nil {
fmt.Println(err)
return
}
// 創(chuàng)建新文件
dstFile, err2 := os.Create("./abc2.txt")
if err2 != nil {
fmt.Println(err2)
return
}
// 緩沖讀取
buf := make([]byte, 1024)
for {
// 從源文件讀數(shù)據(jù)
n, err := srcFile.Read(buf)
if err == io.EOF {
fmt.Println("讀取完畢")
break
}
if err != nil {
fmt.Println(err)
break
}
//寫出去
dstFile.Write(buf[:n])
}
srcFile.Close()
dstFile.Close()
}
7. bufio
- bufio包實現(xiàn)了帶緩沖區(qū)的讀寫,是對文件讀寫的封裝
- bufio緩沖寫數(shù)據(jù)
os.O_WRONLY //只寫 os.O_CREATE //創(chuàng)建文件 os.O_RDONLY //只讀
os.O_RDWR //讀寫 os.O_TRUNC //清空 os.O_APPEND //追加
- bufio讀數(shù)據(jù)
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func wr() {
// 參數(shù)2:打開模式,所有模式d都在上面
// 參數(shù)3是權(quán)限控制
// w寫 r讀 x執(zhí)行 w 2 r 4 x 1
file, err := os.OpenFile("./xxx.txt", os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
return
}
defer file.Close()
// 獲取writer對象
writer := bufio.NewWriter(file)
for i := 0; i < 10; i++ {
writer.WriteString("hello\n")
}
// 刷新緩沖區(qū),強(qiáng)制寫出
writer.Flush()
}
func re() {
file, err := os.Open("./xxx.txt")
if err != nil {
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
line, _, err := reader.ReadLine()
if err == io.EOF {
break
}
if err != nil {
return
}
fmt.Println(string(line))
}
}
func main() {
re()
}以上就是Go語言IO輸入輸出底層原理及文件操作API的詳細(xì)內(nèi)容,更多關(guān)于Go IO操作輸入輸出API的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go slice 擴(kuò)容實現(xiàn)原理源碼解析
這篇文章主要為大家介紹了go slice 擴(kuò)容實現(xiàn)原理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
golang 刪除切片的某個元素及剔除切片內(nèi)的零值方式
這篇文章主要介紹了golang 刪除切片的某個元素及剔除切片內(nèi)的零值方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
一文帶你了解Go語言中函數(shù)設(shè)計的實踐示例
良好設(shè)計的函數(shù)具有清晰的職責(zé)和邏輯結(jié)構(gòu),提供準(zhǔn)確的命名和適當(dāng)?shù)膮?shù)控制,下面我們將一一描述函數(shù)設(shè)計時能夠遵循的最佳實踐,希望對大家有所幫助2023-06-06
一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法
在 Golang 中,結(jié)構(gòu)體和方法是實現(xiàn)面向?qū)ο缶幊痰闹匾M成部分,也是 Golang 的核心概念之一。在本篇文章中,我們將深入介紹 Golang 結(jié)構(gòu)體與方法的概念、使用方法以及相關(guān)的編程技巧和最佳實踐2023-04-04

