Golang学习笔记(09-9-IO相关操作)

156 阅读6分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情 >>

1. IO 包

io包主要是定义了一堆interface,以及一些组合的interface,具体的实现还是其它的包完成的。

1.1. 变量信息

1.	var EOF = errors.New("EOF")
		EOF当无法得到更多输入时,Read方法返回EOF,即正常读文件到结束
    
2.	var ErrNoProgress = errors.New("multiple Read calls return no data or error")
		某些使用io.Reader接口的客户端如果多次调用Read都不返回数据也不返回错误时,就会返回本错误.
    一般来说是io.Reader的实现有问题的标志。
    
3.	var ErrShortBuffer = errors.New("short buffer")
		ErrShortBuffer表示读取操作需要大缓冲,但提供的缓冲不够大。
    
4.	var ErrShortWrite = errors.New("short write")
		ErrShortWrite表示写入操作写入的数据比提供的少,却没有显式的返回错误。
    
5.	var ErrUnexpectedEOF = errors.New("unexpected EOF")
		ErrUnexpectedEOF表示在读取一个固定尺寸的块或者数据结构时,在读取未完全时遇到了EOF。

1.2. 接口信息

io 包最核心的接口有三个:

  • 实现 Read() 方法的 Reader 接口,用于从读取内容
  • 实现 Write() 方法的 Writer 接口,用于写入内容
  • 实现 Close() 方法的 Closer 接口,用于关闭被打开的内容
1.	type Reader interface { Read(p []byte) (n int, err error) }
		Reader接口用于包装基本的读取方法。Read方法读取len(p)字节数据写入p。
    
2.	type Writer interface { Write(p []byte) (n int, err error) }
		Writer接口用于包装基本的写入方法。Write方法len(p) 字节数据从p写入底层的数据流。
    
3.	type Seeker interface { Seek(offset int64, whence int) (int64, error) }
		Seek方法设定下一次读写的位置:偏移量为offset,校准点由whence确定:
    0表示相对于文件起始;1表示相对于当前位置;2表示相对于文件结尾。
    Seek方法返回新的位置以及可能遇到的错误。
    
4.	type Closer interface { Close() error }
		Closer接口用于包装基本的关闭方法。
    
5.	type ByteReader interface { ReadByte() (c byte, err error) }
		ReadByte读取输入中的单个字节并返回。如果没有字节可读取,会返回错误。
    
6.	type RuneReader interface { ReadRune() (r rune, size int, err error) }
		ReadRune读取单个utf-8编码的字符,返回该字符和它的字节长度。如果没有有效的字符,会返回错误。
    
7.	type ReaderFrom interface { ReadFrom(r Reader) (n int64, err error) }
		ReadFrom方法从r读取数据直到EOF或者遇到错误。返回值n是读取的字节数,执行时遇到的错误(EOF除外)也会被返回。
    
8.	type WriterTo interface { WriteTo(w Writer) (n int64, err error) }
		WriteTo方法将数据写入w直到没有数据可以写入或者遇到错误。
    返回值n是写入的字节数,执行时遇到的任何错误也会被返回。
    
// ReadWriter is the interface that groups the basic Read and Write methods.
type ReadWriter interface {
    Reader
    Writer
}

// ReadCloser is the interface that groups the basic Read and Close methods.
type ReadCloser interface {
    Reader
    Closer
}

// WriteCloser is the interface that groups the basic Write and Close methods.
type WriteCloser interface {
    Writer
    Closer
}

// ReadWriteCloser is the interface that groups the basic Read, Write and Close methods.
type ReadWriteCloser interface {
    Reader
    Writer
    Closer
}

// ReadSeeker is the interface that groups the basic Read and Seek methods.
type ReadSeeker interface {
    Reader
    Seeker
}

// ReadSeekCloser is the interface that groups the basic Read, Seek and Close
// methods.
type ReadSeekCloser interface {
    Reader
    Seeker
    Closer
}

// WriteSeeker is the interface that groups the basic Write and Seek methods.
type WriteSeeker interface {
    Writer
    Seeker
}

// ReadWriteSeeker is the interface that groups the basic Read, Write and Seek methods.
type ReadWriteSeeker interface {
    Reader
    Writer
    Seeker
}

1.3. 函数

对于实现了上述接口的包而言,可以使用以下函数进行一些便捷操作,比如从Copy,WriteString等。

1.	func TeeReader(r Reader, w Writer) Reader
		TeeReader返回一个将其从r读取的数据写入w的Reader接口。所有通过该接口对r的读取都会执行对应的对w的写入。
    没有内部的缓冲:写入必须在读取完成前完成。写入时遇到的任何错误都会作为读取错误返回。
    
2.	func MultiReader(readers ...Reader) Reader
		MultiReader返回一个将提供的Reader在逻辑上串联起来的Reader接口。他们依次被读取。
    当所有的输入流都读取完毕,Read才会返回EOF。如果readers中任一个返回了非nil非EOF的错误,Read方法会返回该错误。
    
3.	func Copy(dst Writer, src Reader) (written int64, err error)
		将src的数据拷贝到dst,直到在src上到达EOF或发生错误。返回拷贝的字节数和遇到的第一个错误。
    对成功的调用,返回值err为nil而非EOF,因为Copy定义为从src读取直到EOF,它不会将读取到EOF视为应报告的错误。
    
4.	func CopyN(dst Writer, src Reader, n int64) (written int64, err error)
		从src拷贝n个字节数据到dst,直到在src上到达EOF或发生错误。

5.	func ReadFull(r Reader, buf []byte) (n int, err error)
		ReadFull从r精确地读取len(buf)字节数据填充进buf。函数返回写入的字节数和错误(如果没有读取足够的字节)。
    只有没有读取到字节时才可能返回EOF;如果读取了有但不够的字节时遇到了EOF,函数会返回ErrUnexpectedEOF。 
    只有返回值err为nil时,返回值n才会等于len(buf)。

6.	func WriteString(w Writer, s string) (n int, err error)
		WriteString函数将字符串s的内容写入w中。如果w已经实现了WriteString方法,函数会直接调用该方法。

1.2. ioutil包

1.	func ReadAll(r io.Reader) ([]byte, error)
		ReadAll从r读取数据直到EOF或遇到error,返回读取的数据和遇到的错误。成功的调用返回的err为nil而非EOF。
    因为本函数定义为读取r直到EOF,它不会将读取返回的EOF视为应报告的错误
    
2.	func ReadFile(filename string) ([]byte, error)
		ReadFile 从filename指定的文件中读取数据并返回文件的内容。成功的调用返回的err为nil而非EOF。
    因为本函数定义为读取整个文件,它不会将读取返回的EOF视为应报告的错误
    
3.	func WriteFile(filename string, data []byte, perm os.FileMode) error
		函数向filename指定的文件中写入数据。如果文件不存在将按给出的权限创建文件,否则在写入数据之前清空文件。
    
4.	func TempDir(dir, prefix string) (name string, err error)
		在dir目录里创建一个新的、使用prfix作为前缀的临时文件夹,并返回文件夹的路径。
    如果dir是空字符串,TempDir使用默认用于临时文件的目录(参见os.TempDir函数)。 
    不同程序同时调用该函数会创建不同的临时目录,调用本函数的程序有责任在不需要临时文件夹时摧毁它。
    
5.	func TempFile(dir, prefix string) (f *os.File, err error)
		在dir目录下创建一个新的、使用prefix为前缀的临时文件,以读写模式打开该文件并返回os.File指针。
    如果dir是空字符串,TempFile使用默认用于临时文件的目录(参见os.TempDir函数)。
    不同程序同时调用该函数会创建不同的临时文件,调用本函数的程序有责任在不需要临时文件时摧毁它。
    
6.	func ReadDir(dirname string) ([]os.FileInfo, error)
		返回dirname指定的目录的目录信息的有序列表。