1// Copyright 2009 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5// Package io provides basic interfaces to I/O primitives. 6// Its primary job is to wrap existing implementations of such primitives, 7// such as those in package os, into shared public interfaces that 8// abstract the functionality, plus some other related primitives. 9// 10// Because these interfaces and primitives wrap lower-level operations with 11// various implementations, unless otherwise informed clients should not 12// assume they are safe for parallel execution. 13package io 14 15import ( 16 "errors" 17) 18 19// Seek whence values. 20const ( 21 SeekStart = 0 // seek relative to the origin of the file 22 SeekCurrent = 1 // seek relative to the current offset 23 SeekEnd = 2 // seek relative to the end 24) 25 26// ErrShortWrite means that a write accepted fewer bytes than requested 27// but failed to return an explicit error. 28var ErrShortWrite = errors.New("short write") 29 30// ErrShortBuffer means that a read required a longer buffer than was provided. 31var ErrShortBuffer = errors.New("short buffer") 32 33// EOF is the error returned by Read when no more input is available. 34// Functions should return EOF only to signal a graceful end of input. 35// If the EOF occurs unexpectedly in a structured data stream, 36// the appropriate error is either ErrUnexpectedEOF or some other error 37// giving more detail. 38var EOF = errors.New("EOF") 39 40// ErrUnexpectedEOF means that EOF was encountered in the 41// middle of reading a fixed-size block or data structure. 42var ErrUnexpectedEOF = errors.New("unexpected EOF") 43 44// ErrNoProgress is returned by some clients of an io.Reader when 45// many calls to Read have failed to return any data or error, 46// usually the sign of a broken io.Reader implementation. 47var ErrNoProgress = errors.New("multiple Read calls return no data or error") 48 49// Reader is the interface that wraps the basic Read method. 50// 51// Read reads up to len(p) bytes into p. It returns the number of bytes 52// read (0 <= n <= len(p)) and any error encountered. Even if Read 53// returns n < len(p), it may use all of p as scratch space during the call. 54// If some data is available but not len(p) bytes, Read conventionally 55// returns what is available instead of waiting for more. 56// 57// When Read encounters an error or end-of-file condition after 58// successfully reading n > 0 bytes, it returns the number of 59// bytes read. It may return the (non-nil) error from the same call 60// or return the error (and n == 0) from a subsequent call. 61// An instance of this general case is that a Reader returning 62// a non-zero number of bytes at the end of the input stream may 63// return either err == EOF or err == nil. The next Read should 64// return 0, EOF. 65// 66// Callers should always process the n > 0 bytes returned before 67// considering the error err. Doing so correctly handles I/O errors 68// that happen after reading some bytes and also both of the 69// allowed EOF behaviors. 70// 71// Implementations of Read are discouraged from returning a 72// zero byte count with a nil error, except when len(p) == 0. 73// Callers should treat a return of 0 and nil as indicating that 74// nothing happened; in particular it does not indicate EOF. 75// 76// Implementations must not retain p. 77type Reader interface { 78 Read(p []byte) (n int, err error) 79} 80 81// Writer is the interface that wraps the basic Write method. 82// 83// Write writes len(p) bytes from p to the underlying data stream. 84// It returns the number of bytes written from p (0 <= n <= len(p)) 85// and any error encountered that caused the write to stop early. 86// Write must return a non-nil error if it returns n < len(p). 87// Write must not modify the slice data, even temporarily. 88// 89// Implementations must not retain p. 90type Writer interface { 91 Write(p []byte) (n int, err error) 92} 93 94// Closer is the interface that wraps the basic Close method. 95// 96// The behavior of Close after the first call is undefined. 97// Specific implementations may document their own behavior. 98type Closer interface { 99 Close() error 100} 101 102// Seeker is the interface that wraps the basic Seek method. 103// 104// Seek sets the offset for the next Read or Write to offset, 105// interpreted according to whence: 106// SeekStart means relative to the start of the file, 107// SeekCurrent means relative to the current offset, and 108// SeekEnd means relative to the end. 109// Seek returns the new offset relative to the start of the 110// file and an error, if any. 111// 112// Seeking to an offset before the start of the file is an error. 113// Seeking to any positive offset is legal, but the behavior of subsequent 114// I/O operations on the underlying object is implementation-dependent. 115type Seeker interface { 116 Seek(offset int64, whence int) (int64, error) 117} 118 119// ReadWriter is the interface that groups the basic Read and Write methods. 120type ReadWriter interface { 121 Reader 122 Writer 123} 124 125// ReadCloser is the interface that groups the basic Read and Close methods. 126type ReadCloser interface { 127 Reader 128 Closer 129} 130 131// WriteCloser is the interface that groups the basic Write and Close methods. 132type WriteCloser interface { 133 Writer 134 Closer 135} 136 137// ReadWriteCloser is the interface that groups the basic Read, Write and Close methods. 138type ReadWriteCloser interface { 139 Reader 140 Writer 141 Closer 142} 143 144// ReadSeeker is the interface that groups the basic Read and Seek methods. 145type ReadSeeker interface { 146 Reader 147 Seeker 148} 149 150// WriteSeeker is the interface that groups the basic Write and Seek methods. 151type WriteSeeker interface { 152 Writer 153 Seeker 154} 155 156// ReadWriteSeeker is the interface that groups the basic Read, Write and Seek methods. 157type ReadWriteSeeker interface { 158 Reader 159 Writer 160 Seeker 161} 162 163// ReaderFrom is the interface that wraps the ReadFrom method. 164// 165// ReadFrom reads data from r until EOF or error. 166// The return value n is the number of bytes read. 167// Any error except io.EOF encountered during the read is also returned. 168// 169// The Copy function uses ReaderFrom if available. 170type ReaderFrom interface { 171 ReadFrom(r Reader) (n int64, err error) 172} 173 174// WriterTo is the interface that wraps the WriteTo method. 175// 176// WriteTo writes data to w until there's no more data to write or 177// when an error occurs. The return value n is the number of bytes 178// written. Any error encountered during the write is also returned. 179// 180// The Copy function uses WriterTo if available. 181type WriterTo interface { 182 WriteTo(w Writer) (n int64, err error) 183} 184 185// ReaderAt is the interface that wraps the basic ReadAt method. 186// 187// ReadAt reads len(p) bytes into p starting at offset off in the 188// underlying input source. It returns the number of bytes 189// read (0 <= n <= len(p)) and any error encountered. 190// 191// When ReadAt returns n < len(p), it returns a non-nil error 192// explaining why more bytes were not returned. In this respect, 193// ReadAt is stricter than Read. 194// 195// Even if ReadAt returns n < len(p), it may use all of p as scratch 196// space during the call. If some data is available but not len(p) bytes, 197// ReadAt blocks until either all the data is available or an error occurs. 198// In this respect ReadAt is different from Read. 199// 200// If the n = len(p) bytes returned by ReadAt are at the end of the 201// input source, ReadAt may return either err == EOF or err == nil. 202// 203// If ReadAt is reading from an input source with a seek offset, 204// ReadAt should not affect nor be affected by the underlying 205// seek offset. 206// 207// Clients of ReadAt can execute parallel ReadAt calls on the 208// same input source. 209// 210// Implementations must not retain p. 211type ReaderAt interface { 212 ReadAt(p []byte, off int64) (n int, err error) 213} 214 215// WriterAt is the interface that wraps the basic WriteAt method. 216// 217// WriteAt writes len(p) bytes from p to the underlying data stream 218// at offset off. It returns the number of bytes written from p (0 <= n <= len(p)) 219// and any error encountered that caused the write to stop early. 220// WriteAt must return a non-nil error if it returns n < len(p). 221// 222// If WriteAt is writing to a destination with a seek offset, 223// WriteAt should not affect nor be affected by the underlying 224// seek offset. 225// 226// Clients of WriteAt can execute parallel WriteAt calls on the same 227// destination if the ranges do not overlap. 228// 229// Implementations must not retain p. 230type WriterAt interface { 231 WriteAt(p []byte, off int64) (n int, err error) 232} 233 234// ByteReader is the interface that wraps the ReadByte method. 235// 236// ReadByte reads and returns the next byte from the input or 237// any error encountered. If ReadByte returns an error, no input 238// byte was consumed, and the returned byte value is undefined. 239type ByteReader interface { 240 ReadByte() (byte, error) 241} 242 243// ByteScanner is the interface that adds the UnreadByte method to the 244// basic ReadByte method. 245// 246// UnreadByte causes the next call to ReadByte to return the same byte 247// as the previous call to ReadByte. 248// It may be an error to call UnreadByte twice without an intervening 249// call to ReadByte. 250type ByteScanner interface { 251 ByteReader 252 UnreadByte() error 253} 254 255// ByteWriter is the interface that wraps the WriteByte method. 256type ByteWriter interface { 257 WriteByte(c byte) error 258} 259 260// RuneReader is the interface that wraps the ReadRune method. 261// 262// ReadRune reads a single UTF-8 encoded Unicode character 263// and returns the rune and its size in bytes. If no character is 264// available, err will be set. 265type RuneReader interface { 266 ReadRune() (r rune, size int, err error) 267} 268 269// RuneScanner is the interface that adds the UnreadRune method to the 270// basic ReadRune method. 271// 272// UnreadRune causes the next call to ReadRune to return the same rune 273// as the previous call to ReadRune. 274// It may be an error to call UnreadRune twice without an intervening 275// call to ReadRune. 276type RuneScanner interface { 277 RuneReader 278 UnreadRune() error 279} 280 281// StringWriter is the interface that wraps the WriteString method. 282type StringWriter interface { 283 WriteString(s string) (n int, err error) 284} 285 286// WriteString writes the contents of the string s to w, which accepts a slice of bytes. 287// If w implements StringWriter, its WriteString method is invoked directly. 288// Otherwise, w.Write is called exactly once. 289func WriteString(w Writer, s string) (n int, err error) { 290 if sw, ok := w.(StringWriter); ok { 291 return sw.WriteString(s) 292 } 293 return w.Write([]byte(s)) 294} 295 296// ReadAtLeast reads from r into buf until it has read at least min bytes. 297// It returns the number of bytes copied and an error if fewer bytes were read. 298// The error is EOF only if no bytes were read. 299// If an EOF happens after reading fewer than min bytes, 300// ReadAtLeast returns ErrUnexpectedEOF. 301// If min is greater than the length of buf, ReadAtLeast returns ErrShortBuffer. 302// On return, n >= min if and only if err == nil. 303// If r returns an error having read at least min bytes, the error is dropped. 304func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error) { 305 if len(buf) < min { 306 return 0, ErrShortBuffer 307 } 308 for n < min && err == nil { 309 var nn int 310 nn, err = r.Read(buf[n:]) 311 n += nn 312 } 313 if n >= min { 314 err = nil 315 } else if n > 0 && err == EOF { 316 err = ErrUnexpectedEOF 317 } 318 return 319} 320 321// ReadFull reads exactly len(buf) bytes from r into buf. 322// It returns the number of bytes copied and an error if fewer bytes were read. 323// The error is EOF only if no bytes were read. 324// If an EOF happens after reading some but not all the bytes, 325// ReadFull returns ErrUnexpectedEOF. 326// On return, n == len(buf) if and only if err == nil. 327// If r returns an error having read at least len(buf) bytes, the error is dropped. 328func ReadFull(r Reader, buf []byte) (n int, err error) { 329 return ReadAtLeast(r, buf, len(buf)) 330} 331 332// CopyN copies n bytes (or until an error) from src to dst. 333// It returns the number of bytes copied and the earliest 334// error encountered while copying. 335// On return, written == n if and only if err == nil. 336// 337// If dst implements the ReaderFrom interface, 338// the copy is implemented using it. 339func CopyN(dst Writer, src Reader, n int64) (written int64, err error) { 340 written, err = Copy(dst, LimitReader(src, n)) 341 if written == n { 342 return n, nil 343 } 344 if written < n && err == nil { 345 // src stopped early; must have been EOF. 346 err = EOF 347 } 348 return 349} 350 351// Copy copies from src to dst until either EOF is reached 352// on src or an error occurs. It returns the number of bytes 353// copied and the first error encountered while copying, if any. 354// 355// A successful Copy returns err == nil, not err == EOF. 356// Because Copy is defined to read from src until EOF, it does 357// not treat an EOF from Read as an error to be reported. 358// 359// If src implements the WriterTo interface, 360// the copy is implemented by calling src.WriteTo(dst). 361// Otherwise, if dst implements the ReaderFrom interface, 362// the copy is implemented by calling dst.ReadFrom(src). 363func Copy(dst Writer, src Reader) (written int64, err error) { 364 return copyBuffer(dst, src, nil) 365} 366 367// CopyBuffer is identical to Copy except that it stages through the 368// provided buffer (if one is required) rather than allocating a 369// temporary one. If buf is nil, one is allocated; otherwise if it has 370// zero length, CopyBuffer panics. 371// 372// If either src implements WriterTo or dst implements ReaderFrom, 373// buf will not be used to perform the copy. 374func CopyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) { 375 if buf != nil && len(buf) == 0 { 376 panic("empty buffer in io.CopyBuffer") 377 } 378 return copyBuffer(dst, src, buf) 379} 380 381// copyBuffer is the actual implementation of Copy and CopyBuffer. 382// if buf is nil, one is allocated. 383func copyBuffer(dst Writer, src Reader, buf []byte) (written int64, err error) { 384 // If the reader has a WriteTo method, use it to do the copy. 385 // Avoids an allocation and a copy. 386 if wt, ok := src.(WriterTo); ok { 387 return wt.WriteTo(dst) 388 } 389 // Similarly, if the writer has a ReadFrom method, use it to do the copy. 390 if rt, ok := dst.(ReaderFrom); ok { 391 return rt.ReadFrom(src) 392 } 393 if buf == nil { 394 size := 32 * 1024 395 if l, ok := src.(*LimitedReader); ok && int64(size) > l.N { 396 if l.N < 1 { 397 size = 1 398 } else { 399 size = int(l.N) 400 } 401 } 402 buf = make([]byte, size) 403 } 404 for { 405 nr, er := src.Read(buf) 406 if nr > 0 { 407 nw, ew := dst.Write(buf[0:nr]) 408 if nw > 0 { 409 written += int64(nw) 410 } 411 if ew != nil { 412 err = ew 413 break 414 } 415 if nr != nw { 416 err = ErrShortWrite 417 break 418 } 419 } 420 if er != nil { 421 if er != EOF { 422 err = er 423 } 424 break 425 } 426 } 427 return written, err 428} 429 430// LimitReader returns a Reader that reads from r 431// but stops with EOF after n bytes. 432// The underlying implementation is a *LimitedReader. 433func LimitReader(r Reader, n int64) Reader { return &LimitedReader{r, n} } 434 435// A LimitedReader reads from R but limits the amount of 436// data returned to just N bytes. Each call to Read 437// updates N to reflect the new amount remaining. 438// Read returns EOF when N <= 0 or when the underlying R returns EOF. 439type LimitedReader struct { 440 R Reader // underlying reader 441 N int64 // max bytes remaining 442} 443 444func (l *LimitedReader) Read(p []byte) (n int, err error) { 445 if l.N <= 0 { 446 return 0, EOF 447 } 448 if int64(len(p)) > l.N { 449 p = p[0:l.N] 450 } 451 n, err = l.R.Read(p) 452 l.N -= int64(n) 453 return 454} 455 456// NewSectionReader returns a SectionReader that reads from r 457// starting at offset off and stops with EOF after n bytes. 458func NewSectionReader(r ReaderAt, off int64, n int64) *SectionReader { 459 return &SectionReader{r, off, off, off + n} 460} 461 462// SectionReader implements Read, Seek, and ReadAt on a section 463// of an underlying ReaderAt. 464type SectionReader struct { 465 r ReaderAt 466 base int64 467 off int64 468 limit int64 469} 470 471func (s *SectionReader) Read(p []byte) (n int, err error) { 472 if s.off >= s.limit { 473 return 0, EOF 474 } 475 if max := s.limit - s.off; int64(len(p)) > max { 476 p = p[0:max] 477 } 478 n, err = s.r.ReadAt(p, s.off) 479 s.off += int64(n) 480 return 481} 482 483var errWhence = errors.New("Seek: invalid whence") 484var errOffset = errors.New("Seek: invalid offset") 485 486func (s *SectionReader) Seek(offset int64, whence int) (int64, error) { 487 switch whence { 488 default: 489 return 0, errWhence 490 case SeekStart: 491 offset += s.base 492 case SeekCurrent: 493 offset += s.off 494 case SeekEnd: 495 offset += s.limit 496 } 497 if offset < s.base { 498 return 0, errOffset 499 } 500 s.off = offset 501 return offset - s.base, nil 502} 503 504func (s *SectionReader) ReadAt(p []byte, off int64) (n int, err error) { 505 if off < 0 || off >= s.limit-s.base { 506 return 0, EOF 507 } 508 off += s.base 509 if max := s.limit - off; int64(len(p)) > max { 510 p = p[0:max] 511 n, err = s.r.ReadAt(p, off) 512 if err == nil { 513 err = EOF 514 } 515 return n, err 516 } 517 return s.r.ReadAt(p, off) 518} 519 520// Size returns the size of the section in bytes. 521func (s *SectionReader) Size() int64 { return s.limit - s.base } 522 523// TeeReader returns a Reader that writes to w what it reads from r. 524// All reads from r performed through it are matched with 525// corresponding writes to w. There is no internal buffering - 526// the write must complete before the read completes. 527// Any error encountered while writing is reported as a read error. 528func TeeReader(r Reader, w Writer) Reader { 529 return &teeReader{r, w} 530} 531 532type teeReader struct { 533 r Reader 534 w Writer 535} 536 537func (t *teeReader) Read(p []byte) (n int, err error) { 538 n, err = t.r.Read(p) 539 if n > 0 { 540 if n, err := t.w.Write(p[:n]); err != nil { 541 return n, err 542 } 543 } 544 return 545} 546