Go語言fmt、os、io\ioutil、bufio包
fmt、os、io\ioutil、bufio包是與系統、檔案、輸入輸出相關的包
一、os包
os包是與作業系統有關的包。
os包提供了作業系統函式的不依賴平臺的介面。設計為Unix風格的,雖然錯誤處理是go風格的;失敗的呼叫會返回錯誤值而非錯誤碼。通常錯誤值裡包含更多資訊。
系統級的操作如獲取系統資訊等可查閱文件,主要討論對檔案系統的操作。
主要結構體
type File struct { // 內含隱藏或非匯出欄位 } type FileInfo interface { Name() string // 檔案的名字(不含副檔名) Size() int64 // 普通檔案返回值表示其大小;其他檔案的返回值含義各系統不同 Mode() FileMode // 檔案的模式位 ModTime() time.Time // 檔案的修改時間 IsDir() bool // 等價於Mode().IsDir() Sys() interface{} // 底層資料來源(可以返回nil) } //FileInfo可以通過Stat()函式得到,如下 fileInfo, _ := os.Stat("hello.txt") //通過方法返回檔案資訊 isDir := fileInfo.IsDir() size:= fileInfo.Size() fmt.Println("isDir: ",isDir) fmt.Println("size :",size)
檔案開啟模式
const ( O_RDONLY int = syscall.O_RDONLY // 只讀模式開啟檔案 O_WRONLY int = syscall.O_WRONLY // 只寫模式開啟檔案 O_RDWR int = syscall.O_RDWR // 讀寫模式開啟檔案 O_APPEND int = syscall.O_APPEND // 寫操作時將資料附加到檔案尾部 O_CREATE int = syscall.O_CREAT // 如果不存在將建立一個新檔案 O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,檔案必須不存在 O_SYNC int = syscall.O_SYNC // 開啟檔案用於同步I/O O_TRUNC int = syscall.O_TRUNC // 如果可能,開啟時清空檔案 )
檔案許可權模式
type FileMode uint32
FileMode代表檔案的模式和許可權位。
0666代表任何人可讀可寫但不可執行。
File方法
File的方法最多,有建立開啟以及讀寫等方法。
OpenFile系列方法
OpenFile需要傳入三個引數,檔名、檔案開啟模式、檔案許可權模式。
Open方法只需要一個引數、檔名,預設以只讀模式開啟。
Create方法用於建立一個檔案、預設可讀可寫不可執行,已存在的檔案會被截斷並重新建立。
Read/Write系列方法
Read/Write方法用於檔案讀寫。
例項
使用OpenFile方法開啟檔案,並且使用Read方法讀取,WriteString寫入。
file, _ := os.OpenFile("Fps.txt", os.O_APPEND|os.O_RDONLY, 0666)
defer file.Close()//習慣性的關閉
bytes := make([]byte, 1024)
n, _ := file.Read(bytes)
file.WriteString("write it!!!")
fmt.Println(string(bytes[0:n]))
標準輸出也是可以的
os.Stdout.WriteString("hello")
二、fmt包
fmt包實現了類似C語言printf和scanf的格式化I/O。格式化動作('verb')源自C語言但更簡單。
之前已經描述過,主要的方法和功能就是printf和scanf。
標準輸入輸出
fmt.Println()//輸出任意型別資料,並換行
fmt.Print() //輸出任意型別資料,不換行
fmt.Printf()//格式化輸出資料,不換行
fmt.Scan()//掃描,必須所有引數都被填充後換行才結束掃描
fmt.Scanln()//掃描,但是遇到換行就結束掃描
fmt.Scanf()//格式化掃描,換行就結束
File輸入輸出
這裡指的File其實是Writer,只是File實現了Writer,暫且這樣表示。
io.Writer
fmt.Fprintln()//輸出任意型別資料到File中,並換行
fmt.Fprint() //輸出任意型別資料File中,不換行
fmt.Fprintf()//格式化輸出任意型別資料到File中,不換行
fmt.Fscanln()//從File中讀取資料進入引數中
file, _ := os.OpenFile("Fps.txt", os.O_CREATE|os.O_RDWR, 0666)
defer file.Close()//習慣性的關閉
fmt.Fprintln(file,"hello Fprintln!!!")//將資料輸入到file中
字串輸入輸出
S系列和字串相關,感興趣可以自行研究。
fmt.Sprintln()
三、io/ioutil包
io包下主要有兩個介面,這兩個介面被很多type實現,如FIle。
除此之外,還有一系列介面。
type Reader
type Reader interface {
Read(p []byte) (n int, err error)
}
Reader介面用於包裝基本的讀取方法。
type Writer
type Writer interface {
Write(p []byte) (n int, err error)
}
Writer介面用於包裝基本的寫入方法。
以及一個Copy函式。
func Copy
func Copy(dst Writer, src Reader) (written int64, err error)
將src的資料拷貝到dst,直到在src上到達EOF或發生錯誤。返回拷貝的位元組數和遇到的第一個錯誤。
hello, _ := os.OpenFile("hello.txt",os.O_RDWR,0666)
hi ,_:= os.OpenFile("hi.txt",os.O_RDWR,0666)
defer hello.Close()
defer hi.Close()
io.Copy(hi,hello)
io.Copy(os.Stdout,hello)
ioutil直接提供了讀取檔案的函式,如下。
func ReadFile
func ReadFile(filename string) ([]byte, error)
ReadFile 從filename指定的檔案中讀取資料並返回檔案的內容。成功的呼叫返回的err為nil而非EOF。因為本函式定義為讀取整個檔案,它不會將讀取返回的EOF視為應報告的錯誤。
bytes, _ := ioutil.ReadFile("hello.txt")
fmt.Println(string(bytes))
func WriteFile
func WriteFile(filename string, data []byte, perm os.FileMode) error
函式向filename指定的檔案中寫入資料。如果檔案不存在將按給出的許可權建立檔案,否則在寫入資料之前清空檔案。
四、bufio包
bufio包實現了有緩衝的I/O。它包裝一個io.Reader或io.Writer介面物件,建立另一個也實現了該介面,且同時還提供了緩衝和一些文字I/O的幫助函式的物件。
包下有兩個結構體,名字和io包下的介面一樣.
type Reader
type Reader struct {
// 內含隱藏或非匯出欄位
}
type Writer
type Writer struct {
// 內含隱藏或非匯出欄位
}
通過以下兩個函式來獲取相應的快取io物件。
func NewReader
func NewReader(rd io.Reader) *Reader
NewReader建立一個具有預設大小緩衝、從r讀取的*Reader。
func NewWriter
func NewWriter(w io.Writer) *Writer
NewWriter建立一個具有預設大小緩衝、寫入w的*Writer。
其他用法和io用法類似,如下:
file, _ := os.OpenFile("hello.txt", os.O_RDWR, os.ModeAppend)
reader := bufio.NewReader(file)
bytes := make([]byte, 100)
n, _ := reader.Read(bytes)
fmt.Println(string(bytes[0:n]))
還有一些擴充套件的方法。