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