Golang——文件创建和写入、OpenFile追加写入、Open读取文件、ReadBytes缓冲区读取、os.Args、flag
Create創(chuàng)建文件:
os.Create:文件不存在則創(chuàng)建,文件存在則刪除文件中的內(nèi)容
語法:
file:創(chuàng)建文件的指針 err:創(chuàng)建文件出現(xiàn)異常后的信息file, err := os.Create("創(chuàng)建文件存放的路徑")演示:
func CreateFile() {file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")if err != nil {fmt.Println(err)}// 關(guān)流(不關(guān)流會長時間占用內(nèi)存)defer file.Close() }寫入數(shù)據(jù):
使用WriteString寫數(shù)據(jù):
WriteString底層也是調(diào)用的Write,但是Write需要轉(zhuǎn)換字節(jié)數(shù)組,比較麻煩,WriteString不需要手動轉(zhuǎn)換,比較方便
func FileWriteString() {// 創(chuàng)建文件file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")if err != nil {fmt.Println(err)}defer file.Close()// WriteString寫數(shù)據(jù),返回值參數(shù)1是寫的字符長度,參數(shù)2是異常信息len, err := file.WriteString("WriteString寫入的數(shù)據(jù)")if err != nil {fmt.Println(err)}fmt.Println(len) }使用Write寫數(shù)據(jù):
func FileWrite() {// 創(chuàng)建文件file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")if err != nil {fmt.Println(err)}defer file.Close()// Write寫數(shù)據(jù),返回值參數(shù)1是寫的字符長度,參數(shù)2是異常信息str := "Write寫入的數(shù)據(jù)"len, err := file.Write([]byte(str)) //將字符串轉(zhuǎn)換成字節(jié)切片if err != nil {fmt.Println(err)}fmt.Println(len) }使用WriteAt寫數(shù)據(jù):在指定的位置寫入數(shù)據(jù)
func FileWriteAt() {// 創(chuàng)建文件file, err := os.Create("/Users/itzhuzhu/Desktop/filetest/CreateFile")if err != nil {fmt.Println(err)}defer file.Close()// WriteAt寫數(shù)據(jù),返回值參數(shù)1是寫的字符長度,參數(shù)2是異常信息// WriteAt寫數(shù)據(jù),參數(shù)列表中參數(shù)1是要寫的數(shù)據(jù),參數(shù)2是要寫入數(shù)據(jù)的開始索引var str string = "WriteAt寫入的數(shù)據(jù)"num, _ := file.Seek(0, io.SeekEnd) //SeekEnd:將數(shù)據(jù)追加到源文件,參數(shù)一:追加數(shù)據(jù)的開始索引,fmt.Println("num:", num)len, err := file.WriteAt([]byte(str), num)if err != nil {fmt.Println(err)}fmt.Println(len) }OpenFile追加數(shù)據(jù):
- 文件里已經(jīng)有數(shù)據(jù)的情況下,用上面的三種方式去寫,會出現(xiàn)覆蓋的效果,WriteAt可以指定索引,但是比較麻煩。
os.OpenFile():打開指定文件進(jìn)行操作
- OpenFile有三個參數(shù):
- 參數(shù)1:打開文件的路徑
- 參數(shù)2:模式,常見的模式有
| O_RDONLY | 只讀方式打開 |
| O_WRONLY | 只寫方式打開 |
| O_RDWR | 讀寫方式打開 |
| O_APPEND | 追加方式打開 |
| O_CREATE | 不存在,則創(chuàng)建 |
| O_EXCL | 如果文件存在,且標(biāo)定了O_CREATE的話,則產(chǎn)生一個錯誤 |
| O_TRUNG | 如果文件存在,且它成功地被打開為只寫或讀寫方式,將其長度裁剪唯一(覆蓋) |
| O_NOCTTY | 如果文件名代表一個終端設(shè)備,則不把該設(shè)備設(shè)為調(diào)用進(jìn)程的控制設(shè)備 |
| O_NONBLOCK | 如果文件名代表一個FIFO,或一個塊設(shè)備,字符設(shè)備文件,則在以后的文件及I/O操作中置為非阻塞模式 |
| O_SYNC | 當(dāng)進(jìn)行一系列寫操作時,每次都要等待上次的I/O操作完成再進(jìn)行 |
- 參數(shù)3:表示權(quán)限,取值范圍(0-7),和linux里操作文件那個讀寫一樣
0:沒有任何權(quán)限
1:執(zhí)行權(quán)限(如果是可執(zhí)行文件,是可以運行的)
2:寫權(quán)限
3:寫權(quán)限與執(zhí)行權(quán)限
4:讀權(quán)限
5:讀權(quán)限與執(zhí)行權(quán)限
6:讀權(quán)限與寫權(quán)限
7:讀權(quán)限,寫權(quán)限,執(zhí)行權(quán)限
演示:
func OpenFileTest() {// 追加寫數(shù)據(jù)file, err := os.OpenFile("/Users/itzhuzhu/Desktop/filetest/OpenFileTest.txt", os.O_APPEND|os.O_WRONLY, 6)if err != nil {fmt.Println(err)}defer file.Close()// 通過文件指針讀寫數(shù)據(jù)len, err := file.WriteString("\t我追加了嗎")if err != nil {fmt.Println(err)}fmt.Println(len) }Open讀取文件:
讀取指定文件的數(shù)據(jù)
演示:
func OpenFileTest2() {// 追加寫數(shù)據(jù)file, err := os.Open("/Users/itzhuzhu/Desktop/filetest/OpenFileTest.txt")if err != nil {fmt.Println(err)}defer file.Close()// 讀數(shù)據(jù),定義一個切片存儲文件讀取的數(shù)據(jù)buffer := make([]byte, 1024)len, err := file.Read(buffer)// len:讀取文件中的數(shù)據(jù)長度if err != nil {fmt.Println(err)}fmt.Println(len)//fmt.Println(buffer) // 直接打印都是數(shù)字(ascii碼值),長度是1024,數(shù)據(jù)沒滿的時候就會用默認(rèn)值0代替,可以使用截取操作fmt.Println(buffer[:len])fmt.Println(string(buffer[:len])) // 將類型轉(zhuǎn)換為string,可以展示出內(nèi)容 }ReadBytes緩沖區(qū)讀取:
在使用ReadBytes( )函數(shù)讀取數(shù)據(jù)時,需要用到緩沖區(qū),所謂緩沖區(qū)就是存儲數(shù)據(jù)的區(qū)域,也就是先將從文件中讀取的數(shù)據(jù)存儲在該區(qū)域內(nèi),然后在將區(qū)域中的數(shù)據(jù)取出來,寫到磁盤上。
提供緩沖區(qū)的原因是:
為了緩和 CPU 與 磁盤設(shè)備之間速度不匹配矛盾。文件緩沖區(qū)是用以暫時存放讀寫期間的文件數(shù)據(jù)而在內(nèi)存區(qū)預(yù)留的一定空間。
演示:
func ReadBytesTest() {// 追加寫數(shù)據(jù)file, err := os.Open("/Users/itzhuzhu/Desktop/filetest/OpenFileTest.txt")if err != nil {fmt.Println(err)}defer file.Close()// 讀數(shù)據(jù),定義一個切片存儲文件讀取的數(shù)據(jù)r := bufio.NewReader(file)for {buf, err := r.ReadBytes('\n')if err == io.EOF { // io.EOF是io包中的變量, 表示文件結(jié)束的錯誤:break}fmt.Println(err)fmt.Println("buf", string(buf))} }os.Args:
os.Args是一個string的切片,可以存儲所有的命令行參數(shù)
package mainimport ("fmt""os" )func main() {// 獲取命令行參數(shù),第0個參數(shù)是文件本身,后面的是啟動可執(zhí)行文件后傳入的參數(shù)args := os.Args// 因為規(guī)定了上傳文件需要攜帶至少一個的文件路徑,所以需要在這里判斷一下上傳的文件數(shù)是否滿足格式if len(args) != 2 {fmt.Println("格式為:go run 可執(zhí)行文件名.go 文件名")return}//提取文件名path := args[1]// 獲取文件屬性stat, err := os.Stat(path)if err != nil {fmt.Println("os.Stat 出錯了:", err)return}fmt.Println("文件名:", stat.Name())fmt.Println("文件名:", stat.Size()) }執(zhí)行結(jié)果:
itzhuzhu@itzhuzhudeMacBook-Pro ~ % go run /Users/itzhuzhu/Desktop/goCode/basics/src/day08/命令行參數(shù).go /Users/itzhuzhu/Desktop/產(chǎn)品經(jīng)理自學(xué)路線圖.jpeg 文件名: 產(chǎn)品經(jīng)理自學(xué)路線圖.jpeg 文件名: 588986 itzhuzhu@itzhuzhudeMacBook-Pro ~ %flag:
flag包實現(xiàn)了命令行解析,使用Args拿到命令行參數(shù)如果不是按照順序?qū)懙木蜁袉栴},可以使用flag解析,指定名稱然后帶參數(shù),類似于mysql登錄的時候?qū)?u -p一樣
func listFiles6() {var user stringvar password stringvar host stringvar port int/**參數(shù)1:設(shè)置對應(yīng)的標(biāo)簽名,可以通過該標(biāo)簽名來或得對應(yīng)值參數(shù)2:如果沒有設(shè)置該標(biāo)簽,則采用這個值即該值為默認(rèn)值參數(shù)3:這個參數(shù)為幫助信息,一般用于help調(diào)用展示&user:接收用戶命令行中輸入的 -u 后面的參數(shù)"u":-u的參數(shù)"":默認(rèn)值"用戶名默認(rèn)為空":提示說明*/flag.StringVar(&user, "u", "", "用戶名默認(rèn)為空")flag.StringVar(&password, "p", "", "密碼默認(rèn)為空")flag.StringVar(&host, "h", "localhost", "主機名默認(rèn)為localhost")flag.IntVar(&port, "port", 8000, "端口號默認(rèn)8000")// Parse:從args中解析注冊的flag。也就是轉(zhuǎn)換的flag.Parse()fmt.Printf("user=%v password=%v host=%v port=%v\n", user, password, host, port) }執(zhí)行結(jié)果:
itzhuzhu@itzhuzhudeMacBook-Pro day06 % go run 文件操作.go -u root -p ppp -h 127.0.0.1 -port 3306 user=root password=ppp host=127.0.0.1 port=3306總結(jié)
以上是生活随笔為你收集整理的Golang——文件创建和写入、OpenFile追加写入、Open读取文件、ReadBytes缓冲区读取、os.Args、flag的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu 转mysql_(转)Ubu
- 下一篇: mysql不兼容_mysql5.7 不兼