本文目錄一覽:
golang文件操作摘抄
譯者按: rename 和 move 原理一樣
譯者按:熟悉Linux的讀者應該很熟悉權限模式,通過Linux命令chmod可以更改文件的權限
補充了原文未介紹的flag
一個普通的文件是一個指向硬盤的inode的地方。 硬鏈接創建一個新的指針指向同一個地方。只有所有的鏈接被刪除後文件才會被刪除。硬鏈接只在相同的文件系統中才工作。你可以認為一個硬鏈接是一個正常的鏈接。
symbolic link,又叫軟連接,和硬鏈接有點不一樣,它不直接指向硬盤中的相同的地方,而是通過名字引用其它文件。他們可以指向不同的文件系統中的不同文件。並不是所有的操作系統都支持軟鏈接。
複製文件
可以使用os包寫入一個打開的文件。 因為Go可執行包是靜態鏈接的可執行文件,你import的每一個包都會增加你的可執行文件的大小。其它的包如io、`ioutil`、`bufio`提供了一些方法,但是它們不是必須的。
ioutil包有一個非常有用的方法WriteFile()可以處理創建/打開文件、寫字節slice和關閉文件一系列的操作。如果你需要簡潔快速地寫字節slice到文件中,你可以使用它。
bufio包提供了帶緩存功能的writer,所以你可以在寫字節到硬盤前使用內存緩存。當你處理很多的數據很有用,因為它可以節省操作硬盤I/O的時間。在其它一些情況下它也很有用,比如你每次寫一個字節,把它們攢在內存緩存中,然後一次寫入到硬盤中,減少硬盤的磨損以及提升性能。
讀取最多N個字節
os.File提供了文件操作的基本功能, 而io、ioutil、bufio提供了額外的輔助函數。
有緩存寫也有緩存讀。 緩存reader會把一些內容緩存在內存中。它會提供比os.File和io.Reader更多的函數,缺省的緩存大小是4096,最小緩存是16。
Scanner是bufio包下的類型,在處理文件中以分隔符分隔的文本時很有用。 通常我們使用換行符作為分隔符將文件內容分成多行。在CSV文件中,逗號一般作為分隔符。 os.File文件可以被包裝成bufio.Scanner,它就像一個緩存reader。 我們會調用Scan()方法去讀取下一個分隔符,使用Text()或者Bytes()獲取讀取的數據。
分隔符可以不是一個簡單的字節或者字符,有一個特殊的方法可以實現分隔符的功能,以及將指針移動多少,返回什麼數據。 如果沒有定製的SplitFunc提供,缺省的ScanLines會使用newline字符作為分隔符,其它的分隔函數還包括ScanRunes和ScanWords,皆在bufio包中。
打包(zip) 文件
其它
臨時文件和目錄
ioutil提供了兩個函數: TempDir() 和 TempFile()。 使用完畢後,調用者負責刪除這些臨時文件和文件夾。 有一點好處就是當你傳遞一個空字符串作為文件夾名的時候,它會在操作系統的臨時文件夾中創建這些項目(/tmp on Linux)。 os.TempDir()返回當前操作系統的臨時文件夾。
上面的例子複製整個文件內容到內存中,傳遞給hash函數。 另一個方式是創建一個hash writer, 使用Write、WriteString、Copy將數據傳給它。 下面的例子使用 md5 hash,但你可以使用其它的Writer。
golang-文件讀寫
文件分類:文本文件和二進制文件
文本文件可讀性好,佔用的數據空間大
二進制文件,可讀性差,佔用的數據空間小
文件存取方式:隨機存取和順序存放
隨機存取:操作速度慢,對磁盤的消耗大
順序存放:操作數據塊,對磁盤的消耗小
初級方法
高級方法
在程序和文件之間,添加一個緩衝區,每次程序讀取文件內容的時候,先去緩衝區查看,如果需要的內容,直接獲取,如果沒有再去文件中獲取
由於緩衝是在內存當中的,和程序的交互返回速度會非常快,這樣可以大大提高程序的性能和速度
缺點:有的數據是只在緩衝中存儲的,如果在緩衝釋放之前,沒有將數據實例化落盤,會導致數據的丟失
按行操作文件對象
將之前的file方法封裝起來,可以更加方便的使用
使用gzip.NewReader(文件句柄),來操作壓縮文件
示例: file,err := os.OpenFile(“main.go”, os.O_WRONLY|os.O_WRONLY, 0666)
三個參數,
文件操作方法,需要注意不能衝突
操作完成後,當前目錄出現一個text.txt 文件,內容是:hello world,test
這裡可以可以考慮使用buffio來實現
GoLang — json文件操作
json格式可以算我們日常最常用的序列化格式之一了,Go語言作為一個由Google開發,號稱互聯網的C語言的語言,自然也對JSON格式支持很好。官方提供的Json解析包已經非常強大,我們接下來講解Json的序列化與反序列化操作。另外還有一些第三方的Json解析庫,也能夠高效的操作Json對象,比如simplejson,ffjson等。下面是兩個比較重要的函數:
• Json Marshal:將數據編碼成json字符串
Marshal 用於將struct對象序列化到json對象中。v是interface{}類型,任何類型都實現了空接口。
1:tag中的第一個參數是用來指定別名,比如Name 指定別名為 username `json:”username”`
2:如果不想指定別名但是想指定其他參數用逗號來分隔,omitempty 指定到一個field時,如果在賦值時對該屬性未賦值或者對該屬性賦值為 zero value,那麼將Person序列化成json時會忽略該字段
3:- 指定到一個field時,無論有沒有值,將Person序列化成json時都會忽略該字段
4:string 指定到一個field時,比如Person中的Count為int類型 如果沒有任何指定在序列化到json之後也是int 比如這個樣子 “Count”:0,但是如果指定了string之後序列化之後也是string類型的,那麼就是這個樣子”Count”:”0″
• struct序列化為Json
• slice序列化為Json
• map 序列化為Json
• Json Unmarshal:將json字符串解碼到相應的數據結構,Unmarshal的第一個參數是[]byte,第二個參數是接受json解析的數據結構。
下面我們依次講解Json的操作。
1:將Json序列化進入結構體
2::將Json序列化到結構體slice
3:將Json序列化進Map
4:將Json序列化進Slice
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/301507.html