網(wǎng)站首頁 編程語言 正文
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)建新的文件,返回一個文件對象,默認權(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ū),強制寫出 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() }
原文鏈接:https://juejin.cn/post/7152749887698763790
相關(guān)推薦
- 2022-06-13 matplotlib繪制餅圖的基本配置(萬能模板案例)_python
- 2022-07-14 C語言每日練習(xí)之統(tǒng)計文本單詞數(shù)及高頻詞_C 語言
- 2023-04-03 Input系統(tǒng)分發(fā)策略及其應(yīng)用示例詳解_Android
- 2022-09-23 深入了解C++的多態(tài)與虛函數(shù)_C 語言
- 2022-11-12 基于Python制作一個匯率換算程序_python
- 2023-11-21 什么是交叉編譯、交叉編譯有什么用,為什么需要交叉編譯
- 2022-03-27 關(guān)于Android?Device?Monitor?無法打開問題_Android
- 2022-04-13 .NET5實現(xiàn)操作注冊表的方法_實用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支