go标准库io、ioutil

标准库io


io. WriteString

s输出到w

func WriteString(w Writer, s string) (n int, err error)

io.Copy    

自动以32k字节的buf进行遍历复制直到遇到io.EOF。返回总共复制的字节数,如果成功err返回nil

func Copy(dst Writer, src Reader) (written int64, err error) {
   return copyBuffer(dst, src, nil)
}

 例如

func handlefunc(w http.ResponseWriter, r *http.Request)  {
	f, _ := os.Open("./1.txt")
        defer f.Close()
	 _,err := io.Copy(w,f)
        errCheck(err)
}

io.CopyBuffer

比io.Copy多一项可以自定buf大小

func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) {
   if buf != nil && len(buf) == 0 {
      panic("empty buffer in io.CopyBuffer")
   }
   return copyBuffer(dst, src, buf)
}

io.CopyN

只复制前n字节,src内容足够n个字节时err返回nil,否则返回io.EOF

func CopyN(dst Writer, src Reader, n int64) (written int64, err error) 

 io.MultiReader

func MultiReader(readers ...Reader) Reader
	r1 := strings.NewReader("first reader ")
	r2 := strings.NewReader("second reader ")
	r3 := strings.NewReader("third reader\n")
	r := io.MultiReader(r1, r2, r3)
	if _, err := io.Copy(os.Stdout, r); err != nil {
		log.Fatal(err)
	}
	// Output: first reader second reader third reader

 

io.Multiwriter

func MultiWriter(writers ...Writer) Writer 
        r := strings.NewReader("some io.Reader stream to be read\n")
	var buf1, buf2 bytes.Buffer
	w := io.MultiWriter(&buf1, &buf2)

	if _, err := io.Copy(w, r); err != nil {
		log.Fatal(err)
	}
	fmt.Print(buf1.String())
	fmt.Print(buf2.String())
	// Output:
	// some io.Reader stream to be read
	// some io.Reader stream to be read

io.pipe

读和写用channel通信,读操作阻塞直到有被写入内容

func Pipe() (*PipeReader, *PipeWriter)
        r, w := io.Pipe()
	go func() {
		fmt.Fprint(w, "some text to be read\n")
		w.Close()
	}()
	buf := new(bytes.Buffer)
	buf.ReadFrom(r)
	fmt.Print(buf.String())
	// Output: some text to be read

io.TeeReader

将w传给r的内容同样传给返回的reader

func TeeReader(r Reader, w Writer) Reader
 

io.NewSectionReader

从第off个字节开始读取n个字节

func NewSectionReader(r ReaderAt, off int64, n int64) *SectionReader
        r := strings.NewReader("some io.Reader stream to be read\n")
	s := io.NewSectionReader(r, 5, 16)
	buf := make([]byte, 6)
	if _, err := s.ReadAt(buf, 10); err != nil {  //SectionReader的方法
		log.Fatal(err)
	}
	fmt.Printf("%s\n", buf)
	// Output: stream
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
        r := strings.NewReader("some io.Reader stream to be read\n")
	if _, err := io.Copy(os.Stdout, r); err != nil {
		log.Fatal(err)
	}
	r.Seek(15, io.SeekStart)
	if _, err := io.Copy(os.Stdout, r); err != nil {
		log.Fatal(err)
	}
	r.Seek(-5, io.SeekEnd)
	if _, err := io.Copy(os.Stdout, r); err != nil {
		log.Fatal(err)
	}
	// Output:
	// some io.Reader stream to be read
	// stream to be read
	// read
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
其他:
至少读min个字节到buf,否则返回error: short buffer
func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)
将buf填满,否则返回error: unexpected EOF
func ReadFull(r Reader, buf []byte) (n int, err error) 
返回读取传入的reader前n个字节的reader
func LimitReader(r Reader, n int64) Reader

标准库ioutil


 ioutil.ReadAll

遍历增加函数内部buf容量并读取,直到把内容全部读到buf中(所以比其他方法消耗内存)

func ReadAll(r io.Reader) ([]byte, error)

ioutil.ReadFile

调用readall方法直接全部读取文件内容

func ReadFile(filename string) ([]byte, error) 

ioutil.WriteFile

写内容到文件,如果文件不存在则新建,如果存在则清空再写

func WriteFile(filename string, data []byte, perm os.FileMode) error 

ioutil.ReadDir

获取指定文件地址下面文件的信息

func ReadDir(dirname string) ([]os.FileInfo, error) 
        f,_:= ioutil.ReadDir("./")
	for index,fileInfo := range f{
		fmt.Println(index,fileInfo.Name())
	}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 ioutil.TempFile

在指定地址生成一个以pattern为前缀随机数为后缀的随机名字的文件。每调用一次会更新内部的随机种子。如果过程中发现生成的文件名在该地址已存在,再进行一次生成,和已存在文件名不同时才新建文件。

func TempFile(dir, pattern string) (f *os.File, err error)

 ioutil.TempDir

方法同上生成文件夹,返回生成的名字。

func TempDir(dir, prefix string) (name string, err error)
//文件夹操作
        content := []byte("temporary file's content")
	dir, err := ioutil.TempDir("", "example")
	if err != nil {
		log.Fatal(err)
	}
	defer os.RemoveAll(dir) // 文件夹不用可以删除
	tmpfn := filepath.Join(dir, "tmpfile")
	if err := ioutil.WriteFile(tmpfn, content, 0666); err != nil {
		log.Fatal(err)
	}

//文件操作
        content := []byte("temporary file's content")
	tmpfile, err := ioutil.TempFile("", "example.*.txt")
	if err != nil {
		log.Fatal(err)
	}

	defer os.Remove(tmpfile.Name()) // 文件不用可以删除

	if _, err := tmpfile.Write(content); err != nil {
		tmpfile.Close()
		log.Fatal(err)
	}
	if err := tmpfile.Close(); err != nil {
		log.Fatal(err)
	}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

猜你喜欢

转载自blog.csdn.net/sinat_26682309/article/details/89704904