Source File
io.go
Belonging Package
io
// Copyright 2009 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file.// Package io provides basic interfaces to I/O primitives.// Its primary job is to wrap existing implementations of such primitives,// such as those in package os, into shared public interfaces that// abstract the functionality, plus some other related primitives.//// Because these interfaces and primitives wrap lower-level operations with// various implementations, unless otherwise informed clients should not// assume they are safe for parallel execution.package ioimport ()// Seek whence values.const (SeekStart = 0 // seek relative to the origin of the fileSeekCurrent = 1 // seek relative to the current offsetSeekEnd = 2 // seek relative to the end)// ErrShortWrite means that a write accepted fewer bytes than requested// but failed to return an explicit error.var ErrShortWrite = errors.New("short write")// errInvalidWrite means that a write returned an impossible count.var errInvalidWrite = errors.New("invalid write result")// ErrShortBuffer means that a read required a longer buffer than was provided.var ErrShortBuffer = errors.New("short buffer")// EOF is the error returned by Read when no more input is available.// (Read must return EOF itself, not an error wrapping EOF,// because callers will test for EOF using ==.)// Functions should return EOF only to signal a graceful end of input.// If the EOF occurs unexpectedly in a structured data stream,// the appropriate error is either ErrUnexpectedEOF or some other error// giving more detail.var EOF = errors.New("EOF")// ErrUnexpectedEOF means that EOF was encountered in the// middle of reading a fixed-size block or data structure.var ErrUnexpectedEOF = errors.New("unexpected EOF")// ErrNoProgress is returned by some clients of an Reader when// many calls to Read have failed to return any data or error,// usually the sign of a broken Reader implementation.var ErrNoProgress = errors.New("multiple Read calls return no data or error")// Reader is the interface that wraps the basic Read method.//// Read reads up to len(p) bytes into p. It returns the number of bytes// read (0 <= n <= len(p)) and any error encountered. Even if Read// returns n < len(p), it may use all of p as scratch space during the call.// If some data is available but not len(p) bytes, Read conventionally// returns what is available instead of waiting for more.//// When Read encounters an error or end-of-file condition after// successfully reading n > 0 bytes, it returns the number of// bytes read. It may return the (non-nil) error from the same call// or return the error (and n == 0) from a subsequent call.// An instance of this general case is that a Reader returning// a non-zero number of bytes at the end of the input stream may// return either err == EOF or err == nil. The next Read should// return 0, EOF.//// Callers should always process the n > 0 bytes returned before// considering the error err. Doing so correctly handles I/O errors// that happen after reading some bytes and also both of the// allowed EOF behaviors.//// Implementations of Read are discouraged from returning a// zero byte count with a nil error, except when len(p) == 0.// Callers should treat a return of 0 and nil as indicating that// nothing happened; in particular it does not indicate EOF.//// Implementations must not retain p.type Reader interface {Read(p []byte) (n int, err error)}// Writer is the interface that wraps the basic Write method.//// Write writes len(p) bytes from p to the underlying data stream.// It returns the number of bytes written from p (0 <= n <= len(p))// and any error encountered that caused the write to stop early.// Write must return a non-nil error if it returns n < len(p).// Write must not modify the slice data, even temporarily.//// Implementations must not retain p.type Writer interface {Write(p []byte) (n int, err error)}// Closer is the interface that wraps the basic Close method.//// The behavior of Close after the first call is undefined.// Specific implementations may document their own behavior.type Closer interface {Close() error}// Seeker is the interface that wraps the basic Seek method.//// Seek sets the offset for the next Read or Write to offset,// interpreted according to whence:// SeekStart means relative to the start of the file,// SeekCurrent means relative to the current offset, and// SeekEnd means relative to the end.// Seek returns the new offset relative to the start of the// file and an error, if any.//// Seeking to an offset before the start of the file is an error.// Seeking to any positive offset is legal, but the behavior of subsequent// I/O operations on the underlying object is implementation-dependent.type Seeker interface {Seek(offset int64, whence int) (int64, error)}// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface {ReaderWriter}// ReadCloser is the interface that groups the basic Read and Close methods.type ReadCloser interface {ReaderCloser}// WriteCloser is the interface that groups the basic Write and Close methods.type WriteCloser interface {WriterCloser}// ReadWriteCloser is the interface that groups the basic Read, Write and Close methods.type ReadWriteCloser interface {ReaderWriterCloser}// ReadSeeker is the interface that groups the basic Read and Seek methods.type ReadSeeker interface {ReaderSeeker}// ReadSeekCloser is the interface that groups the basic Read, Seek and Close// methods.type ReadSeekCloser interface {ReaderSeekerCloser}// WriteSeeker is the interface that groups the basic Write and Seek methods.type WriteSeeker interface {WriterSeeker}// ReadWriteSeeker is the interface that groups the basic Read, Write and Seek methods.type ReadWriteSeeker interface {ReaderWriterSeeker}// ReaderFrom is the interface that wraps the ReadFrom method.//// ReadFrom reads data from r until EOF or error.// The return value n is the number of bytes read.// Any error except EOF encountered during the read is also returned.//// The Copy function uses ReaderFrom if available.type ReaderFrom interface {ReadFrom(r Reader) (n int64, err error)}// WriterTo is the interface that wraps the WriteTo method.//// WriteTo writes data to w until there's no more data to write or// when an error occurs. The return value n is the number of bytes// written. Any error encountered during the write is also returned.//// The Copy function uses WriterTo if available.type WriterTo interface {WriteTo(w Writer) (n int64, err error)}// ReaderAt is the interface that wraps the basic ReadAt method.//// ReadAt reads len(p) bytes into p starting at offset off in the// underlying input source. It returns the number of bytes// read (0 <= n <= len(p)) and any error encountered.//// When ReadAt returns n < len(p), it returns a non-nil error// explaining why more bytes were not returned. In this respect,// ReadAt is stricter than Read.//// Even if ReadAt returns n < len(p), it may use all of p as scratch// space during the call. If some data is available but not len(p) bytes,// ReadAt blocks until either all the data is available or an error occurs.// In this respect ReadAt is different from Read.//// If the n = len(p) bytes returned by ReadAt are at the end of the// input source, ReadAt may return either err == EOF or err == nil.//// If ReadAt is reading from an input source with a seek offset,// ReadAt should not affect nor be affected by the underlying// seek offset.//// Clients of ReadAt can execute parallel ReadAt calls on the// same input source.//// Implementations must not retain p.type ReaderAt interface {ReadAt(p []byte, off int64) (n int, err error)}// WriterAt is the interface that wraps the basic WriteAt method.//// WriteAt writes len(p) bytes from p to the underlying data stream// at offset off. It returns the number of bytes written from p (0 <= n <= len(p))// and any error encountered that caused the write to stop early.// WriteAt must return a non-nil error if it returns n < len(p).//// If WriteAt is writing to a destination with a seek offset,// WriteAt should not affect nor be affected by the underlying// seek offset.//// Clients of WriteAt can execute parallel WriteAt calls on the same// destination if the ranges do not overlap.//// Implementations must not retain p.type WriterAt interface {WriteAt(p []byte, off int64) (n int, err error)}// ByteReader is the interface that wraps the ReadByte method.//// ReadByte reads and returns the next byte from the input or// any error encountered. If ReadByte returns an error, no input// byte was consumed, and the returned byte value is undefined.//// ReadByte provides an efficient interface for byte-at-time// processing. A Reader that does not implement ByteReader// can be wrapped using bufio.NewReader to add this method.type ByteReader interface {ReadByte() (byte, error)}// ByteScanner is the interface that adds the UnreadByte method to the// basic ReadByte method.//// UnreadByte causes the next call to ReadByte to return the same byte// as the previous call to ReadByte.// It may be an error to call UnreadByte twice without an intervening// call to ReadByte.type ByteScanner interface {ByteReaderUnreadByte() error}// ByteWriter is the interface that wraps the WriteByte method.type ByteWriter interface {WriteByte(c byte) error}// RuneReader is the interface that wraps the ReadRune method.//// ReadRune reads a single UTF-8 encoded Unicode character// and returns the rune and its size in bytes. If no character is// available, err will be set.type RuneReader interface {ReadRune() (r rune, size int, err error)}// RuneScanner is the interface that adds the UnreadRune method to the// basic ReadRune method.//// UnreadRune causes the next call to ReadRune to return the same rune// as the previous call to ReadRune.// It may be an error to call UnreadRune twice without an intervening// call to ReadRune.type RuneScanner interface {RuneReaderUnreadRune() error}// StringWriter is the interface that wraps the WriteString method.type StringWriter interface {WriteString(s string) (n int, err error)}// WriteString writes the contents of the string s to w, which accepts a slice of bytes.// If w implements StringWriter, its WriteString method is invoked directly.// Otherwise, w.Write is called exactly once.func ( Writer, string) ( int, error) {if , := .(StringWriter); {return .WriteString()}return .Write([]byte())}// ReadAtLeast reads from r into buf until it has read at least min bytes.// It returns the number of bytes copied and an error if fewer bytes were read.// The error is EOF only if no bytes were read.// If an EOF happens after reading fewer than min bytes,// ReadAtLeast returns ErrUnexpectedEOF.// If min is greater than the length of buf, ReadAtLeast returns ErrShortBuffer.// On return, n >= min if and only if err == nil.// If r returns an error having read at least min bytes, the error is dropped.func ( Reader, []byte, int) ( int, error) {if len() < {return 0, ErrShortBuffer}for < && == nil {var int, = .Read([:])+=}if >= {= nil} else if > 0 && == EOF {= ErrUnexpectedEOF}return}// ReadFull reads exactly len(buf) bytes from r into buf.// It returns the number of bytes copied and an error if fewer bytes were read.// The error is EOF only if no bytes were read.// If an EOF happens after reading some but not all the bytes,// ReadFull returns ErrUnexpectedEOF.// On return, n == len(buf) if and only if err == nil.// If r returns an error having read at least len(buf) bytes, the error is dropped.func ( Reader, []byte) ( int, error) {return ReadAtLeast(, , len())}// CopyN copies n bytes (or until an error) from src to dst.// It returns the number of bytes copied and the earliest// error encountered while copying.// On return, written == n if and only if err == nil.//// If dst implements the ReaderFrom interface,// the copy is implemented using it.func ( Writer, Reader, int64) ( int64, error) {, = Copy(, LimitReader(, ))if == {return , nil}if < && == nil {// src stopped early; must have been EOF.= EOF}return}// Copy copies from src to dst until either EOF is reached// on src or an error occurs. It returns the number of bytes// copied and the first error encountered while copying, if any.//// A successful Copy returns err == nil, not err == EOF.// Because Copy is defined to read from src until EOF, it does// not treat an EOF from Read as an error to be reported.//// If src implements the WriterTo interface,// the copy is implemented by calling src.WriteTo(dst).// Otherwise, if dst implements the ReaderFrom interface,// the copy is implemented by calling dst.ReadFrom(src).func ( Writer, Reader) ( int64, error) {return copyBuffer(, , nil)}// CopyBuffer is identical to Copy except that it stages through the// provided buffer (if one is required) rather than allocating a// temporary one. If buf is nil, one is allocated; otherwise if it has// zero length, CopyBuffer panics.//// If either src implements WriterTo or dst implements ReaderFrom,// buf will not be used to perform the copy.func ( Writer, Reader, []byte) ( int64, error) {if != nil && len() == 0 {panic("empty buffer in CopyBuffer")}return copyBuffer(, , )}// copyBuffer is the actual implementation of Copy and CopyBuffer.// if buf is nil, one is allocated.func ( Writer, Reader, []byte) ( int64, error) {// If the reader has a WriteTo method, use it to do the copy.// Avoids an allocation and a copy.if , := .(WriterTo); {return .WriteTo()}// Similarly, if the writer has a ReadFrom method, use it to do the copy.if , := .(ReaderFrom); {return .ReadFrom()}if == nil {:= 32 * 1024if , := .(*LimitedReader); && int64() > .N {if .N < 1 {= 1} else {= int(.N)}}= make([]byte, )}for {, := .Read()if > 0 {, := .Write([0:])if < 0 || < {= 0if == nil {= errInvalidWrite}}+= int64()if != nil {=break}if != {= ErrShortWritebreak}}if != nil {if != EOF {=}break}}return ,}// LimitReader returns a Reader that reads from r// but stops with EOF after n bytes.// The underlying implementation is a *LimitedReader.func ( Reader, int64) Reader { return &LimitedReader{, } }// A LimitedReader reads from R but limits the amount of// data returned to just N bytes. Each call to Read// updates N to reflect the new amount remaining.// Read returns EOF when N <= 0 or when the underlying R returns EOF.type LimitedReader struct {R Reader // underlying readerN int64 // max bytes remaining}func ( *LimitedReader) ( []byte) ( int, error) {if .N <= 0 {return 0, EOF}if int64(len()) > .N {= [0:.N]}, = .R.Read().N -= int64()return}// NewSectionReader returns a SectionReader that reads from r// starting at offset off and stops with EOF after n bytes.func ( ReaderAt, int64, int64) *SectionReader {return &SectionReader{, , , + }}// SectionReader implements Read, Seek, and ReadAt on a section// of an underlying ReaderAt.type SectionReader struct {r ReaderAtbase int64off int64limit int64}func ( *SectionReader) ( []byte) ( int, error) {if .off >= .limit {return 0, EOF}if := .limit - .off; int64(len()) > {= [0:]}, = .r.ReadAt(, .off).off += int64()return}var errWhence = errors.New("Seek: invalid whence")var errOffset = errors.New("Seek: invalid offset")func ( *SectionReader) ( int64, int) (int64, error) {switch {default:return 0, errWhencecase SeekStart:+= .basecase SeekCurrent:+= .offcase SeekEnd:+= .limit}if < .base {return 0, errOffset}.off =return - .base, nil}func ( *SectionReader) ( []byte, int64) ( int, error) {if < 0 || >= .limit-.base {return 0, EOF}+= .baseif := .limit - ; int64(len()) > {= [0:], = .r.ReadAt(, )if == nil {= EOF}return ,}return .r.ReadAt(, )}// Size returns the size of the section in bytes.func ( *SectionReader) () int64 { return .limit - .base }// TeeReader returns a Reader that writes to w what it reads from r.// All reads from r performed through it are matched with// corresponding writes to w. There is no internal buffering -// the write must complete before the read completes.// Any error encountered while writing is reported as a read error.func ( Reader, Writer) Reader {return &teeReader{, }}type teeReader struct {r Readerw Writer}func ( *teeReader) ( []byte) ( int, error) {, = .r.Read()if > 0 {if , := .w.Write([:]); != nil {return ,}}return}// Discard is an Writer on which all Write calls succeed// without doing anything.var Discard Writer = discard{}type discard struct{}// discard implements ReaderFrom as an optimization so Copy to// io.Discard can avoid doing unnecessary work.var _ ReaderFrom = discard{}func (discard) ( []byte) (int, error) {return len(), nil}func (discard) ( string) (int, error) {return len(), nil}var blackHolePool = sync.Pool{New: func() interface{} {:= make([]byte, 8192)return &},}func (discard) ( Reader) ( int64, error) {:= blackHolePool.Get().(*[]byte):= 0for {, = .Read(*)+= int64()if != nil {blackHolePool.Put()if == EOF {return , nil}return}}}// NopCloser returns a ReadCloser with a no-op Close method wrapping// the provided Reader r.func ( Reader) ReadCloser {return nopCloser{}}type nopCloser struct {Reader}func (nopCloser) () error { return nil }// ReadAll reads from r until an error or EOF and returns the data it read.// A successful call returns err == nil, not err == EOF. Because ReadAll is// defined to read from src until EOF, it does not treat an EOF from Read// as an error to be reported.func ( Reader) ([]byte, error) {:= make([]byte, 0, 512)for {if len() == cap() {// Add more capacity (let append pick how much).= append(, 0)[:len()]}, := .Read([len():cap()])= [:len()+]if != nil {if == EOF {= nil}return ,}}}