1. 程式人生 > 實用技巧 >Go語言fmt、os、io\ioutil、bufio包

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]))

還有一些擴充套件的方法。