go語言學習-文件讀寫 io os ioutil

文件讀寫

os 打開文件,建立文件

  1. func Create(name string) (file *File, err error) 建立新文件,若是文件已存在,將被截斷。新建的文件是可讀寫的。默認權限爲0666(Linux 下文件的權限設置格式)。
  2. func Open(name string) (file *File, err error) 打開已經存在的文件,用來讀取文件內容。Open 打開的文件是隻讀的。不能寫。
  3. func OpenFile(name string, flag int, perm FileMode) (file *File, err error)OpenFile 是一個通用的函數,能夠用來建立文件,以只讀方式打開文件,以讀寫方式打開文件等
package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	/*打開文件 ,若是文件不存在將會新建,若是已存在,新寫入的內容將追加到文件尾
	os.O_RDONLY : 若是設置爲只讀,那麼將寫入不了數據
	os.O_RDWR : 設置爲讀寫
	*/
	f, err := os.OpenFile("./test.txt", os.O_RDWR | os.O_APPEND | os.O_CREATE, 0666)
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	f.WriteString("test a string!")


	buf := make([]byte, 1024)
	var str string
	/*重置文件指針,不然讀不到內容的。*/
	f.Seek(0, os.SEEK_SET)
	for {
		n, ferr := f.Read(buf)
		if ferr != nil && ferr != io.EOF {
			fmt.Println(ferr.Error())
			break
		}
		if n == 0 {
			break
		}
		fmt.Println(n)
		str += string(buf[0:n])
	}
	fmt.Println(str)
}

file

1.func (f *File) Seek(offset int64, whence int) (ret int64, err error) Seek 用來設置文件指針的位置,offet 是偏移量,whence 的取值能夠是下面的三個: SEEK_SET 相對文件開始偏移 SEEK_CUR 相對文件當前位置偏移 SEEK_END 相對文件末尾偏移函數

ioutil

1.func ReadAll(r io.Reader) ([]byte, error) 從 r 中讀取全部內容指針

package main

import (
	"fmt"
	"os"
	"io/ioutil"
)

func main() {
	f, err := os.OpenFile("./test.txt", os.O_RDWR | os.O_APPEND | os.O_CREATE, 0666)
	if err != nil {
		fmt.Println(err)
	}
	defer f.Close()
	//f.WriteString("test a string!")

	buf, err := ioutil.ReadAll(f)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(buf))
}

2.func ReadFile(filename string) ([]byte, error) 從文件 filename 中讀取內容,一次性讀取整個文件,成功 error=nil。code

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	buf, err := ioutil.ReadFile("./test.txt")
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	fmt.Println(string(buf))
}

3.func WriteFile(filename string, data []byte, perm os.FileMode) error 向文件中寫數據,若是文件不存在,將以 perm 權限建立文件。對象

//若是原來文件有內容,則會刪除覆蓋掉

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	err := ioutil.WriteFile("./test.txt", []byte("abcdefg"), 0777)
	if err != nil {
		fmt.Println(err.Error())
	} else {
		fmt.Println("OK")
	}
}

遍歷目錄下文件

OpenFile 除了能夠打開文件,還能夠打開一個目錄。在 File 對像有一個 Readdir 函數,用來讀取某目錄下的全部文件和目錄信息,位於 OS 包中.string

os

1.func (f *File) Readdir(n int) (fi []FileInfo, err error) n>0 最多返回 n 個文件。如個小於等零,返回全部的。it

filepath.Walk 也是用 Readdir 來實現的io

package main

import (
	"fmt"
	"os"
)

func main() {
	f, err := os.OpenFile("./", os.O_RDONLY, 0666)
	if err != nil {
		fmt.Println(err)
		return
	}
	arrFile, err1 := f.Readdir(0)
	if err1 != nil {
		fmt.Println(err1)
		return
	}
	for k, v := range arrFile {
		fmt.Println(k, "\t", v.Name(), "\t", v.IsDir())
	}
}

ioutil

1.func ReadDir(dirname string) ([]os.FileInfo, error) 讀取目錄下全部的文件和子目錄function

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	arrFile, err := ioutil.ReadDir("./")
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	for k, v := range arrFile {
		fmt.Println(k, "\t", v.Name(), "\t", v.IsDir())
	}
}

gob 序列化

序列化就是將對象的狀態信息轉換爲能夠存儲或傳輸的形式的過程。test

Gob 是 Go 中所特有的序列化技術,它支持除 interface,function,channel 外的全部 Go 數 據類型。序列化使用 Encoder,反序列化使用 Decoder。import

package main

import (
	"encoding/gob"
	"fmt"
	"os"
)

type Student struct {
	Name string
	Age  int
}

func main() {
	s := &Student{"張三", 19}
	f, err := os.Create("data.dat")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()

	//建立 Encoder 對像
	encode := gob.NewEncoder(f)
	//將s序列化到f文件中
	encode.Encode(s)

	//重置文件指針到開始位置
	f.Seek(0, os.SEEK_SET)

	decoder := gob.NewDecoder(f)
	var s1 Student
	//反序列化對像
	decoder.Decode(&s1)
	fmt.Println(s1)
}
相關文章
相關標籤/搜索