原文:Golang标准库——io

1、io

io包提供了对I/O原语的基本接口。本包的基本任务是包装这些原语已有的实现(如os包里的原语),使之成为共享的公共接口,这些公共接口抽象出了泛用的函数并附加了一些相关的原语的操作。

因为这些接口和原语是对底层实现完全不同的低水平操作的包装,除非得到其它方面的通知,客户端不应假设它们是并发执行安全的。

1.1 常量

Seek 值。

const (
SeekStart = 0 // 寻找相对于文件的起源
SeekCurrent = 1 // 寻找相对于当前的偏移量
SeekEnd = 2 // 寻求相对于目的
)

1.2 Variables

var EOF = errors.New("EOF")

EOF当无法得到更多输入时,Read方法返回EOF。当函数一切正常的到达输入的结束时,就应返回EOF。如果在一个结构化数据流中EOF在不期望的位置出现了,则应返回错误ErrUnexpectedEOF或者其它给出更多细节的错误。

var ErrClosedPipe = errors.New("io: read/write on closed pipe")

当从一个已关闭的Pipe读取或者写入时,会返回ErrClosedPipe。

var ErrNoProgress = errors.New("multiple Read calls return no data or error")

某些使用io.Reader接口的客户端如果多次调用Read都不返回数据也不返回错误时,就会返回本错误,一般来说是io.Reader的实现有问题的标志。

var ErrShortBuffer = errors.New("short buffer")

ErrShortBuffer表示读取操作需要大缓冲,但提供的缓冲不够大。

var ErrShortWrite = errors.New("short write")

ErrShortWrite表示写入操作写入的数据比提供的少,却没有显式的返回错误。

var ErrUnexpectedEOF = errors.New("unexpected EOF")

ErrUnexpectedEOF表示在读取一个固定尺寸的块或者数据结构时,在读取未完全时遇到了EOF。

1.3 type Reader

type Reader interface {
Read(p []byte) (n int, err error)
}

Reader接口用于包装基本的读取方法。

Read方法读取len(p)字节数据写入p。它返回写入的字节数和遇到的任何错误。即使Read方法返回值n < len(p),本方法在被调用时仍可能使用p的全部长度作为暂存空间。如果有部分可用数据,但不够len(p)字节,Read按惯例会返回可以读取到的数据,而不是等待更多数据。

当Read在读取n > 0个字节后遭遇错误或者到达文件结尾时,会返回读取的字节数。它可能会在该次调用返回一个非nil的错误,或者在下一次调用时返回0和该错误。一个常见的例子,Reader接口会在输入流的结尾返回非0的字节数,返回值err == EOF或err == nil。但不管怎样,下一次Read调用必然返回(0, EOF)。调用者应该总是先处理读取的n > 0字节再处理错误值。这么做可以正确的处理发生在读取部分数据后的I/O错误,也能正确处理EOF事件。

如果Read的某个实现返回0字节数和nil错误值,表示被阻碍;调用者应该将这种情况视为未进行操作。

1.4 type Writer

type Writer interface {
Write(p []byte) (n int, err error)
}

Writer接口用于包装基本的写入方法。

Write方法len(p) 字节数据从p写入底层的数据流。它会返回写入的字节数(0 <= n <= len(p))和遇到的任何导致写入提前结束的错误。Write必须返回非nil的错误,如果它返回的 n < len(p)。Write不能修改切片p中的数据,即使临时修改也不行。

1.5 type Closer

type Closer interface {
Close() error
}

Closer接口用于包装基本的关闭方法。

在第一次调用之后再次被调用时,Close方法的的行为是未定义的。某些实现可能会说明他们自己的行为。

1.6 type Seeker

type Seeker interface {
Seek(offset int64, whence int) (int64, error)
}

Seeker接口用于包装基本的移位方法。

Seek方法设定下一次读写的位置:偏移量为offset,校准点由whence确定:0表示相对于文件起始;1表示相对于当前位置;2表示相对于文件结尾。Seek方法返回新的位置以及可能遇到的错误。

移动到一个绝对偏移量为负数的位置会导致错误。移动到任何偏移量为正数的位置都是合法的,但其下一次I/O操作的具体行为则要看底层的实现。

1.7 type ReadCloser

type ReadCloser interface {
Reader
Closer
}

ReadCloser接口聚合了基本的读取和关闭操作。

1.8 type ReadSeeker

type ReadSeeker interface {
Reader
Seeker
}

ReadSeeker接口聚合了基本的读取和移位操作。

1.9 type WriteCloser

type WriteCloser interface {
Writer
Closer
}

WriteCloser接口聚合了基本的写入和关闭操作。

1.10 type WriteSeeker

type WriteSeeker interface {
Writer
Seeker
}

WriteSeeker接口聚合了基本的写入和移位操作。

1.11 type ReadWriter

type ReadWriter interface {
Reader
Writer
}

ReadWriter接口聚合了基本的读写操作。

1.12 type ReadWriteCloser

type ReadWriteCloser interface {
Reader
Writer
Closer
}

ReadWriteCloser接口聚合了基本的读写和关闭操作。

1.13 type ReadWriteSeeker

type ReadWriteSeeker interface {
Reader
Writer
Seeker
}

ReadWriteSeeker接口聚合了基本的读写和移位操作。

1.14 type ReaderAt

type ReaderAt interface {
ReadAt(p []byte, off int64) (n int, err error)
}

ReaderAt接口包装了基本的ReadAt方法。

ReadAt从底层输入流的偏移量off位置读取len(p)字节数据写入p, 它返回读取的字节数(0 <= n <= len(p))和遇到的任何错误。当ReadAt方法返回值n < len(p)时,它会返回一个非nil的错误来说明为啥没有读取更多的字节。在这方面,ReadAt是比Read要严格的。即使ReadAt方法返回值 n < len(p),它在被调用时仍可能使用p的全部长度作为暂存空间。如果有部分可用数据,但不够len(p)字节,ReadAt会阻塞直到获取len(p)个字节数据或者遇到错误。在这方面,ReadAt和Read是不同的。如果ReadAt返回时到达输入流的结尾,而返回值n == len(p),其返回值err既可以是EOF也可以是nil。

如果ReadAt是从某个有偏移量的底层输入流(的Reader包装)读取,ReadAt方法既不应影响底层的偏移量,也不应被底层的偏移量影响。

ReadAt方法的调用者可以对同一输入流执行并行的ReadAt调用。

1.15 type WriterAt

type WriterAt interface {
WriteAt(p []byte, off int64) (n int, err error)
}

WriterAt接口包装了基本的WriteAt方法。

WriteAt将p全部len(p)字节数据写入底层数据流的偏移量off位置。它返回写入的字节数(0 <= n <= len(p))和遇到的任何导致写入提前中止的错误。当其返回值n < len(p)时,WriteAt必须放哪会一个非nil的错误。

如果WriteAt写入的对象是某个有偏移量的底层输出流(的Writer包装),WriteAt方法既不应影响底层的偏移量,也不应被底层的偏移量影响。

ReadAt方法的调用者可以对同一输入流执行并行的WriteAt调用。(前提是写入范围不重叠)

1.16 type ByteReader

type ByteReader interface {
ReadByte() (c byte, err error)
}

ByteReader是基本的ReadByte方法的包装。

ReadByte读取输入中的单个字节并返回。如果没有字节可读取,会返回错误。

1.17 type ByteScanner

type ByteScanner interface {
ByteReader
UnreadByte() error
}

ByteScanner接口在基本的ReadByte方法之外还添加了UnreadByte方法。

UnreadByte方法让下一次调用ReadByte时返回之前调用ReadByte时返回的同一个字节。连续调用两次UnreadByte方法而中间没有调用ReadByte时,可能会导致错误。

1.18 type RuneReader

type RuneReader interface {
ReadRune() (r rune, size int, err error)
}

RuneReader是基本的ReadRune方法的包装。

ReadRune读取单个utf-8编码的字符,返回该字符和它的字节长度。如果没有有效的字符,会返回错误。

1.19 type RuneScanner

type RuneScanner interface {
RuneReader
UnreadRune() error
}

RuneScanner接口在基本的ReadRune方法之外还添加了UnreadRune方法。

UnreadRune方法让下一次调用ReadRune时返回之前调用ReadRune时返回的同一个utf-8字符。连续调用两次UnreadRune方法而中间没有调用ReadRune时,可能会导致错误。

1.20 type ByteWriter

type ByteWriter interface {
WriteByte(c byte) error
}

ByteWriter是基本的WriteByte方法的包装。

1.21 type ReaderFrom

type ReaderFrom interface {
ReadFrom(r Reader) (n int64, err error)
}

ReaderFrom接口包装了基本的ReadFrom方法。

ReadFrom方法从r读取数据直到EOF或者遇到错误。返回值n是读取的字节数,执行时遇到的错误(EOF除外)也会被返回。

1.22 type WriterTo

type WriterTo interface {
WriteTo(w Writer) (n int64, err error)
}

WriterTo接口包装了基本的WriteTo方法。

WriteTo方法将数据写入w直到没有数据可以写入或者遇到错误。返回值n是写入的字节数,执行时遇到的任何错误也会被返回。

1.23 type LimitedReader

type LimitedReader struct {
R Reader // 底层Reader接口
N int64 // 剩余可读取字节数
}

LimitedReader从R中读取数据,但限制可以读取的数据的量为最多N字节,每次调用Read方法都会更新N以标记剩余可以读取的字节数。

1.23.1 func LimitReader
func LimitReader(r Reader, n int64) Reader

返回一个Reader,它从r中读取n个字节后以EOF停止。返回值接口的底层为*LimitedReader类型。

1.23.2 func (*LimitedReader) Read
func (l *LimitedReader) Read(p []byte) (n int, err error)

1.24 type SectionReader

type SectionReader struct {
// 内含隐藏或非导出字段
}

SectionReader实现了对底层满足ReadAt接口的输入流某个片段的Read、ReadAt、Seek方法。

1.24.1 func NewSectionReader
func NewSectionReader(r ReaderAt, off int64, n int64) *SectionReader

返回一个从r中的偏移量off处为起始,读取n个字节后以EOF停止的SectionReader。

1.24.2 func (*SectionReader) Size
func (s *SectionReader) Size() int64

Size返回该片段的字节数。

1.24.3 func (*SectionReader) Read
func (s *SectionReader) Read(p []byte) (n int, err error)
1.24.4 func (*SectionReader) ReadAt
func (s *SectionReader) ReadAt(p []byte, off int64) (n int, err error)
1.24.5 func (*SectionReader) Seek
func (s *SectionReader) Seek(offset int64, whence int) (int64, error)

1.25 type PipeReader

type PipeReader struct {
// 内含隐藏或非导出字段
}

PipeReader是一个管道的读取端。

1.25.1 func Pipe
func Pipe() (*PipeReader, *PipeWriter)

Pipe创建一个同步的内存中的管道。它可以用于连接期望io.Reader的代码和期望io.Writer的代码。一端的读取对应另一端的写入,直接在两端拷贝数据,没有内部缓冲。可以安全的并行调用Read和Write或者Read/Write与Close方法。Close方法会在最后一次阻塞中的I/O操作结束后完成。并行调用Read或并行调用Write也是安全的:每一个独立的调用会依次进行。

1.25.2 func (*PipeReader) Read
func (r *PipeReader) Read(data []byte) (n int, err error)

Read实现了标准Reader接口:它从管道中读取数据,会阻塞直到写入端开始写入或写入端被关闭。

1.25.3 func (*PipeReader) Close
func (r *PipeReader) Close() error

Close关闭读取器;关闭后如果对管道的写入端进行写入操作,就会返回(0, ErrClosedPip)。

1.25.4 func (*PipeReader) CloseWithError
func (r *PipeReader) CloseWithError(err error) error

CloseWithError类似Close方法,但将调用Write时返回的错误改为err。

1.26 type PipeWriter

type PipeWriter struct {
// 内含隐藏或非导出字段
}

PipeWriter是一个管道的写入端。

1.26.1 func (*PipeWriter) Write
func (w *PipeWriter) Write(data []byte) (n int, err error)

Write实现了标准Writer接口:它将数据写入到管道中,会阻塞直到读取器读完所有的数据或读取端被关闭。

1.26.2 func (*PipeWriter) Close
func (w *PipeWriter) Close() error

Close关闭写入器;关闭后如果对管道的读取端进行读取操作,就会返回(0, EOF)。

1.26.3 func (*PipeWriter) CloseWithError
func (w *PipeWriter) CloseWithError(err error) error

CloseWithError类似Close方法,但将调用Read时返回的错误改为err。

1.27 func TeeReader

func TeeReader(r Reader, w Writer) Reader

TeeReader返回一个将其从r读取的数据写入w的Reader接口。所有通过该接口对r的读取都会执行对应的对w的写入。没有内部的缓冲:写入必须在读取完成前完成。写入时遇到的任何错误都会作为读取错误返回。

1.28 func MultiReader

func MultiReader(readers ...Reader) Reader

MultiReader返回一个将提供的Reader在逻辑上串联起来的Reader接口。他们依次被读取。当所有的输入流都读取完毕,Read才会返回EOF。如果readers中任一个返回了非nil非EOF的错误,Read方法会返回该错误。

1.29 func MultiWriter

func MultiWriter(writers ...Writer) Writer

MultiWriter创建一个Writer接口,会将提供给其的数据写入所有创建时提供的Writer接口。

1.30 func Copy

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

将src的数据拷贝到dst,直到在src上到达EOF或发生错误。返回拷贝的字节数和遇到的第一个错误。

对成功的调用,返回值err为nil而非EOF,因为Copy定义为从src读取直到EOF,它不会将读取到EOF视为应报告的错误。如果src实现了WriterTo接口,本函数会调用src.WriteTo(dst)进行拷贝;否则如果dst实现了ReaderFrom接口,本函数会调用dst.ReadFrom(src)进行拷贝。

1.31 func CopyN

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

从src拷贝n个字节数据到dst,直到在src上到达EOF或发生错误。返回复制的字节数和遇到的第一个错误。

只有err为nil时,written才会等于n。如果dst实现了ReaderFrom接口,本函数很调用它实现拷贝。

1.32 func ReadAtLeast

func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error)

ReadAtLeast从r至少读取min字节数据填充进buf。函数返回写入的字节数和错误(如果没有读取足够的字节)。只有没有读取到字节时才可能返回EOF;如果读取了有但不够的字节时遇到了EOF,函数会返回ErrUnexpectedEOF。 如果min比buf的长度还大,函数会返回ErrShortBuffer。只有返回值err为nil时,返回值n才会不小于min。

1.33 func ReadFull

func ReadFull(r Reader, buf []byte) (n int, err error)

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

1.34 func WriteString

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

WriteString函数将字符串s的内容写入w中。如果w已经实现了WriteString方法,函数会直接调用该方法。

2、ioutil

ioutil包实现了一些实用的io接口

2.1 Variables

var Discard io.Writer = devNull(0)

Discard是一个io.Writer接口,对它的所有Write调用都会无实际操作的成功返回。

2.2 func NopCloser

func NopCloser(r io.Reader) io.ReadCloser

NopCloser用一个无操作的Close方法包装r返回一个ReadCloser接口。

2.3 func ReadAll

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

ReadAll从r读取数据直到EOF或遇到error,返回读取的数据和遇到的错误。成功的调用返回的err为nil而非EOF。因为本函数定义为读取r直到EOF,它不会将读取返回的EOF视为应报告的错误。

2.4 func ReadFile

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

ReadFile 从filename指定的文件中读取数据并返回文件的内容。成功的调用返回的err为nil而非EOF。因为本函数定义为读取整个文件,它不会将读取返回的EOF视为应报告的错误。

2.5 func WriteFile

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

函数向filename指定的文件中写入数据。如果文件不存在将按给出的权限创建文件,否则在写入数据之前清空文件。

2.6 func ReadDir

func ReadDir(dirname string) ([]os.FileInfo, error)

返回dirname指定的目录的目录信息的有序列表。

func main() {
rd, err := ioutil.ReadDir("D://")
fmt.Println(err)
for _, fi := range rd {
if fi.IsDir() {
fmt.Printf("[%s]\n", fi.Name()) } else {
fmt.Println(fi.Name())
}
}
}

2.7 func TempDir

func TempDir(dir, prefix string) (name string, err error)

在dir目录里创建一个新的、使用prfix作为前缀的临时文件夹,并返回文件夹的路径。如果dir是空字符串,TempDir使用默认用于临时文件的目录(参见os.TempDir函数)。 不同程序同时调用该函数会创建不同的临时目录,调用本函数的程序有责任在不需要临时文件夹时摧毁它。

2.8 func TempFile

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

在dir目录下创建一个新的、使用prefix为前缀的临时文件,以读写模式打开该文件并返回os.File指针。如果dir是空字符串,TempFile使用默认用于临时文件的目录(参见os.TempDir函数)。不同程序同时调用该函数会创建不同的临时文件,调用本函数的程序有责任在不需要临时文件时摧毁它。

// 示例:临时目录、临时文件
func main() {
// 创建临时目录
dir, err := ioutil.TempDir("", "Test")
if err != nil {
fmt.Println(err)
}
defer os.Remove(dir) // 用完删除
fmt.Printf("%s\n", dir) // 创建临时文件
f, err := ioutil.TempFile(dir, "Test")
if err != nil {
fmt.Println(err)
}
defer os.Remove(f.Name()) // 用完删除
fmt.Printf("%s\n", f.Name())
}

Golang标准库——io的更多相关文章

  1. golang 标准库间依赖的可视化展示

    简介 国庆看完 << Go 语言圣经 >>,总想做点什么,来加深下印象.以可视化的方式展示 golang 标准库之间的依赖,可能是一个比较好的切入点.做之前,简单搜了下相关的内 ...

  2. Golang 标准库log的实现

      原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://gotaly.blog.51cto.com/8861157/1406905 前 ...

  3. Golang 标准库提供的Log(一)

      原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://gotaly.blog.51cto.com/8861157/1405754 G ...

  4. golang标准库分析之net/rpc

    net/rpc是golang提供的一个实现rpc的标准库.

  5. golang 标准库

    前言 不做文字搬运工,多做思路整理 就是为了能速览标准库,只整理我自己看过的...... 最好能看看英文的 标准库 fmt strconv string 跳转 golang知识库总结

  6. C 标准库IO缓冲区和内核缓冲区的区别

    1.C标准库的I/O缓冲区          UNIX的传统 是Everything is a file,键盘.显示器.串口.磁盘等设备在/dev 目录下都有一个特殊的设备文件与之对应,这些设备文件也 ...

  7. golang中的标准库IO操作

    参考链接 输入输出的底层原理 终端其实是一个文件,相关实例如下: os.Stdin:标准输入的文件实例,类型为*File os.Stdout:标准输出的文件实例,类型为*File os.Stderr: ...

  8. golang标准库 context的使用

    本文索引 问题引入 context包简介 示例 问题引入 goroutine为我们提供了轻量级的并发实现,作为golang最大的亮点之一更是备受推崇. goroutine的简单固然有利于我们的开发,但 ...

  9. Golang标准库——io-接口

    接口 Read相关 Reader Reader接口用于包装基本的读取方法. type Reader interface { //将数据读入到p中,直到读满p或者读取的过程中遇到错误,此时返回的n< ...

  10. python 标准库 —— io(StringIO)

    0. io流(io stream) 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操作 ...

随机推荐

  1. 基于Apache PDFBox的PDF数字签名

    在Java语言环境中完成数字签名主要基于itext-pdf.PDFBox两种工具,itext-pdf受商业限制,应用于商业服务中需要购买授权.PDFBox是apache基金会开源项目,基于apache ...

  2. axios文件上传和 Content-Type类型介绍

    Content-Type的作用是什么? Content-Type: 用于在请求头部指定资源的类型和字符编码. 请求头中的content-type,就是 B端发给S端的数据类型描述 . 即告诉服务器端, ...

  3. uni-app 顶部配置搜索框和左右图标

    顶部的图标只支持本地图片哈,所以你要将阿里巴巴上的图标下载到本地, 然后只要XXX.ttf这个文件就行了 然后放在static这个文件中 在pages.json中fontSrc进行引入. text:使 ...

  4. TienChin-课程管理-展示课程列表

    配置按钮权限 博主这里就不贴SQL了,自行手动添加一下吧. 更改表结构 ALTER TABLE `tienchin_course` MODIFY COLUMN `info` varchar(255) ...

  5. 虚拟IP绑定公网IP访问

    绑定公网 IP 我们目前的虚拟 IP,还不能通过公网的形式进行访问,我们首先,来使用内部的 IP 进行访问看看效果如下: curl 虚拟IP 如上图我访问了两次,第一次访问返回的是 2222 的 ng ...

  6. paddle DeBug 三步定位PARL飞桨报错原因,快速解决程序问题

    相关文章: [一]-环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简介 [五]-Sarsa&Qlea ...

  7. 9.2 Windows驱动开发:内核解析PE结构导出表

    在笔者的上一篇文章<内核特征码扫描PE代码段>中LyShark带大家通过封装好的LySharkToolsUtilKernelBase函数实现了动态获取内核模块基址,并通过ntimage.h ...

  8. 提升编码幸福感的秘密「GitHub 热点速览」

    写代码是一个充满挑战的事情,在这段充满挑战的旅途中,我们都渴望找到那个提升幸福感的秘密.没准是更先进或是更快的工具,希望本期热点速递的开源项目,能给你带来启迪和乐趣,上菜! 第一个上场的是一款用 Ru ...

  9. 基数排序|RadixSort|C++实现

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量干货博客汇总https://blog. ...

  10. webrtc终极版(一)5分钟搭建多人实时会议系统webrtc

    webrtc终极版(一),支持https,在线部署[不是本地demo],采用RTCMultiConnection官方demo,5分钟即可搭建成功 @ 目录 webrtc终极版(一),支持https,在 ...