Golang的io包API中文說明

jopen 11年前發布 | 58K 次閱讀 Google Go/Golang開發 Golang

package io

import "io"

io包提供了對I/O原語的基本接口。本包的基本任務是包裝這些原語已有的實現(如os包里的原語),使之成為共享的公共接口,這些公共接口抽象出了泛用的函數并附加了一些相關的原語的操作。

因為這些接口和原語是對底層實現完全不同的低水平操作的包裝,除非得到其它方面的通知,客戶端不應假設它們是并發執行安全的。

Index

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

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 == EOFerr == nil。但不管怎樣,下一次Read調用必然返回(0, EOF)。調用者應該總是先處理讀取的n > 0字節再處理錯誤值。這么做可以正確的處理發生在讀取部分數據后的I/O錯誤,也能正確處理EOF事件。

如果Read的某個實現返回0字節數和nil錯誤值,表示被阻礙;調用者應該將這種情況視為未進行操作。

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中的數據,即使臨時修改也不行。

type Closer

type Closer interface { Close() error }

Closer接口用于包裝基本的關閉方法。

在第一次調用之后再次被調用時,Close方法的的行為是未定義的。某些實現可能會說明他們自己的行為。

type Seeker

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

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

Seek方法設定下一次讀寫的位置:偏移量為offset,校準點由whence確定:0表示相對于文件起始;1表示相對于當前位置;2表示相對于文件結尾。Seek方法返回新的位置以及可能遇到的錯誤。

移動到一個絕對偏移量為負數的位置會導致錯誤。移動到任何偏移量為正數的位置都是合法的,但其下一次I/O操作的具體行為則要看底層的實現。

type ReadCloser

type ReadCloser interface { Reader Closer }

ReadCloser接口聚合了基本的讀取和關閉操作。

type ReadSeeker

type ReadSeeker interface { Reader Seeker }

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

type WriteCloser

type WriteCloser interface { Writer Closer }

WriteCloser接口聚合了基本的寫入和關閉操作。

type WriteSeeker

type WriteSeeker interface { Writer Seeker }

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

type ReadWriter

type ReadWriter interface { Reader Writer }

ReadWriter接口聚合了基本的讀寫操作。

type ReadWriteCloser

type ReadWriteCloser interface { Reader Writer Closer }

ReadWriteCloser接口聚合了基本的讀寫和關閉操作。

type ReadWriteSeeker

type ReadWriteSeeker interface { Reader Writer Seeker }

ReadWriteSeeker接口聚合了基本的讀寫和移位操作。

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)個字節數據或者遇到錯誤。在這方面,ReadAtRead是不同的。如果ReadAt返回時到達輸入流的結尾,而返回值n == len(p),其返回值err既可以是EOF也可以是nil

如果ReadAt是從某個有偏移量的底層輸入流(的Reader包裝)讀取,ReadAt方法既不應影響底層的偏移量,也不應被底層的偏移量影響。

ReadAt方法的調用者可以對同一輸入流執行并行的ReadAt調用。

type WriterAt

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

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

WriteAtp全部len(p)字節數據寫入底層數據流的偏移量off位置。它返回寫入的字節數(0 <= n <= len(p))和遇到的任何導致寫入提取中止的錯誤。當其返回值n < len(p)時,WriteAt必須放哪會一個非nil的錯誤。

如果WriteAt寫入的對象是某個有偏移量的底層輸出流(的Writer包裝),WriteAt方法既不應影響底層的偏移量,也不應被底層的偏移量影響。

ReadAt方法的調用者可以對同一輸入流執行并行的WriteAt調用。(前提是寫入范圍不重疊)

type ByteReader

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

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

ReadByte讀取輸入中的單個字節并返回。如果沒有字節可讀取,會返回錯誤。

type ByteScanner

type ByteScanner interface { ByteReader UnreadByte() error }

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

UnreadByte方法讓下一次調用ReadByte時返回之前調用ReadByte時返回的同一個字節。連續調用兩次UnreadByte方法而中間沒有調用ReadByte時,可能會導致錯誤。

type RuneReader

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

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

ReadRune讀取單個utf-8編碼的字符,返回該字符和它的字節長度。如果沒有有效的字符,會返回錯誤。

type RuneScanner

type RuneScanner interface { RuneReader UnreadRune() error }

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

UnreadRune方法讓下一次調用ReadRune時返回之前調用ReadRune時返回的同一個utf-8字符。連續調用兩次UnreadRune方法而中間沒有調用ReadRune時,可能會導致錯誤。

type ByteWriter

type ByteWriter interface { WriteByte(c byte) error }

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

type ReaderFrom

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

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

ReadFrom方法從r讀取數據直到EOF或者遇到錯誤。返回值n是讀取的字節數,執行時遇到的錯誤(EOF除外)也會被返回。

type WriterTo

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

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

WriteTo方法將數據寫入w直到沒有數據可以寫入或者遇到錯誤。返回值n是寫入的字節數,執行時遇到的任何錯誤也會被返回。

type LimitedReader

type LimitedReader struct { R Reader // 底層Reader接口 N int64 // 剩余可讀取字節數 }

LimitedReaderR中讀取數據,但限制可以讀取的數據的量為最多N字節,每次調用Read方法都會更新N以標記剩余可以讀取的字節數。

func LimitReader

func LimitReader(r Reader, n int64) Reader

返回一個Reader,它從r中讀取n個字節后以EOF停止。返回值接口的底層為*LimitedReader類型。

func (*LimitedReader) Read

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

type SectionReader

type SectionReader struct { // 內含隱藏或非導出字段 }

SectionReader實現了對底層滿足ReadAt接口的輸入流某個片段的ReadReadAtSeek方法。

func NewSectionReader

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

返回一個從r中的偏移量off處為起始,讀取n個字節后以EOF停止的SectionReader

func (*SectionReader) Size

func (s *SectionReader) Size() int64

Size返回該片段的字節數。

func (*SectionReader) Read

func (s *SectionReader) Read(p []byte) (n int, err error)

func (*SectionReader) ReadAt

func (s *SectionReader) ReadAt(p []byte, off int64) (n int, err error)

func (*SectionReader) Seek

func (s *SectionReader) Seek(offset int64, whence int) (int64, error)

type PipeReader

type PipeReader struct { // 內含隱藏或非導出字段 }

PipeReader是一個管道的讀取端。

func Pipe

func Pipe() (*PipeReader, *PipeWriter)

Pipe創建一個同步的內存中的管道。它可以用于連接期望io.Reader的代碼和期望io.Writer的代碼。一端的讀取對應另一端的寫入,直接在兩端拷貝數據,沒有內部緩沖。可以安全的并行調用Read和Write或者Read/Write與Close方法。Close方法會在最后一次阻塞中的I /O操作結束后完成。并行調用Read或并行調用Write也是安全的:每一個獨立的調用會依次進行。

func (*PipeReader) Read

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

Read實現了標準Reader接口:它從管道中讀取數據,會阻塞直到寫入端開始寫入或寫入端被關閉。

func (*PipeReader) Close

func (r *PipeReader) Close() error

Close關閉讀取器;關閉后如果對管道的寫入端進行寫入操作,就會返回(0, ErrClosedPip)

func (*PipeReader) CloseWithError

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

CloseWithError類似Close方法,但將調用Write時返回的錯誤改為err

type PipeWriter

type PipeWriter struct { // 內含隱藏或非導出字段 }

PipeWriter是一個管道的寫入端。

func (*PipeWriter) Write

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

Write實現了標準Writer接口:它將數據寫入到管道中,會阻塞直到讀取器讀完所有的數據或讀取端被關閉。

func (*PipeWriter) Close

func (w *PipeWriter) Close() error

Close關閉寫入器;關閉后如果對管道的讀取端進行讀取操作,就會返回(0, EOF)

func (*PipeWriter) CloseWithError

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

CloseWithError類似Close方法,但將調用Read時返回的錯誤改為err

func TeeReader

func TeeReader(r Reader, w Writer) Reader

TeeReader返回一個將其從r讀取的數據寫入wReader接口。所有通過該接口對r的讀取都會執行對應的對w的寫入。沒有內部的緩沖:寫入必須在讀取完成前完成。寫入時遇到的任何錯誤都會作為讀取錯誤返回。

func MultiReader

func MultiReader(readers ...Reader) Reader

MultiReader返回一個將提供的Reader在邏輯上串聯起來的Reader接口。他們依次被讀取。當所有的輸入流都讀取完畢,Read才會返回EOF。如果readers中任一個返回了非nilEOF的錯誤,Read方法會返回該錯誤。

func MultiWriter

func MultiWriter(writers ...Writer) Writer

MultiWriter創建一個Writer接口,會將提供給其的數據寫入所有創建時提供的Writer接口。

func Copy

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

src的數據拷貝到dst,直到在src上到達EOF或發生錯誤。返回拷貝的字節數和遇到的第一個錯誤。

對成功的調用,返回值errnil而非EOF,因為Copy定義為從src讀取直到EOF,它不會將讀取到EOF視為應報告的錯誤。如果src實現了WriterTo接口,本函數會調用src.WriteTo(dst)進行拷貝;否則如果dst實現了ReaderFrom接口,本函數會調用dst.ReadFrom(src)進行拷貝。

func CopyN

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

src拷貝n個字節數據到dst,直到在src上到達EOF或發生錯誤。返回復制的字節數和遇到的第一個錯誤。

只有errnil時,written才會等于n。如果dst實現了ReaderFrom接口,本函數很調用它實現拷貝。

func ReadAtLeast

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

ReadAtLeastr至少讀取min字節數據填充進buf。函數返回寫入的字節數和錯誤(如果沒有讀取足夠的字節)。只有沒有讀取到字節時才可能返回EOF;如果讀取了有但不夠的字節時遇到了EOF,函數會返回ErrUnexpectedEOF。 如果minbuf的長度還大,函數會返回ErrShortBuffer。只有返回值errnil時,返回值n才會不小于min

func ReadFull

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

ReadFullr精確地讀取len(buf)字節數據填充進buf。函數返回寫入的字節數和錯誤(如果沒有讀取足夠的字節)。只有沒有讀取到字節時才可能返回EOF;如果讀取了有但不夠的字節時遇到了EOF,函數會返回ErrUnexpectedEOF。 只有返回值errnil時,返回值n才會等于len(buf)

func WriteString

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

WriteString函數將字符串s的內容寫入w中。如果w已經實現了WriteString方法,函數會直接調用該方法。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!