The basic method of reading and writing files in Go language programming

  • 2020-05-30 20:22:57
  • OfStack

func Copy(dst Writer, src Reader) (written int64, err error) (written int64, err error) this function reads and copies from one file to another, and 1 directly copies to EOF which reads the file, so it does not return io.EOF error


import (
 "fmt"
 "io"
 "os"
) func main() {
 r, _ := os.Open("test.txt")
 w, _ := os.Create("write.txt")
 num, err := io.Copy(w, w)
 if err != nil {
  fmt.Println(err)
 }
 fmt.Println(num) // return int64 the 11 Open my write.txt It is test.txt The inside of the hello widuu

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


import (
 "fmt"
 "io"
 "io/ioutil"
 "os"
) func main() {
 r, _ := os.Open("test.txt")
 w, _ := os.Create("write1.txt")
 num, err := io.CopyN(w, r, 5)
 if err != nil {
  fmt.Println(err)
 }
 defer r.Close()
 b, _ := ioutil.ReadFile("write1.txt")
 fmt.Println(string(b)) // The output hello
 fmt.Println(num)       //5
}

3.func ReadAtLeast(r Reader, buf []byte, min int) (n int, err error) (n int, err error) But if the number of bytes you read is 5, you're going to return 1 'io.ErrUnexpectedEOF', and if it's greater than, you're going to return 'io.ErrShortBuffer', and when you're done, you're going to have 'io.EOF' ~~, we'll talk more about that, this Reader as long as we satisfy this interface


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

Where *File supports func (f *File) Read(b []byte) (n int, err error)


import (
 "fmt"
 "io"
 "os"
) func main() {
 r, _ := os.Open("write1.txt")
 b := make([]byte, 20)
 defer r.Close()
 var total int
 for {
  n, err := io.ReadAtLeast(r, b, 8)
  if err == nil {
   fmt.Println("Read enough value:", string(b)) // Read enough value: hello widuu
  }
  if err == io.ErrUnexpectedEOF { // The data read is less than the minimum read that we set 8
   fmt.Println("Read fewer value:", string(b[0:n]))
  }
  
  if err == io.ErrShortBuffer{   // This is what we set up buf That is b Less than we limit 8
   fmt.Println("buf too Short")
   os.Exit(1)
  }
  if err == io.EOF { // After reading the The output
   fmt.Println("Read end total", total) //Read end total 11
   break
  }
  total = total + n
 }
}

func ReadFull(r Reader, buf []byte) (n int, err error) this function is similar to the one above, except that it reads len(buf) and puts them in buf


import (
 "fmt"
 "io"
 "os"
) func main() {
 r, _ := os.Open("write.txt")
 b := make([]byte, 20)
 num, err := io.ReadFull(r, b)
 defer r.Close()
 if err == io.EOF {
  fmt.Println("Read end total", num)
 }
 if err == io.ErrUnexpectedEOF {
  fmt.Println("Read fewer value:", string(b[:num])) //Read fewer value: hello widuu , is still a buf The length is greater than the read length
  return
 }  fmt.Println("Read  value:", string(b)) // if b is 5 That's right there
}

func WriteString(w Writer, s string) It's all writer and this structure can be written


type Writer interface {
    Write(p []byte) (n int, err error)
}
with read1 The sample of our *File There is a func (f *File) Write(b []byte) (n int, err error) Of course we do *File It's already there WirteString the func (f *File) WriteString(s string) (ret int, err error)
import (
 "fmt"
 "io"
 "io/ioutil"
 "os"
) func main() {
 w, _ := os.OpenFile("write1.txt", os.O_RDWR, os.ModePerm)
 n, err := io.WriteString(w, "ni hao ma")
 if err != nil {
  fmt.Println(err) // When I use os.open() I don't have permission   The miserable ~~ The output write write1.txt: Access is denied.
 }
 defer w.Close()
 b, _ := ioutil.ReadFile("write1.txt")
 fmt.Println("write total", n) //write total 9
 fmt.Println(string(b))        // ni hao ma
}

6.type LimitedReader


type LimitedReader struct {
    R Reader // The reader
    N int64  // Maximum byte limit
}

Only one method was implemented, func (l *LimitedReader), Read(p []byte) (n int, err error)


import (
 "fmt"
 "io"
 "os"
) func main() {
 reader, _ := os.Open("test.txt")
 limitedreader := io.LimitedReader{
  R: reader,
  N: 20,
 }
 p := make([]byte, 10)
 var total int
 for {
  n, err := limitedreader.Read(p)
  if err == io.EOF {
   fmt.Println("read total", total)     //read total 11
   fmt.Println("read value", string(p)) //read value hello widuu
   break
  }
  total = total + n  } }

7.type PipeReader


type PipeReader struct {
    // contains filtered or unexported fields
}

(1)func Pipe() (*PipeReader, *PipeWriter) creates a pipe and returns its reader and writer. This will synchronize the pipe in memory. Its opening will io.Reader and then wait for the input of io.Writer


import (
 "fmt"
 "io"
 "reflect"
) func main() {
 r, w := io.Pipe()
 fmt.Println(reflect.TypeOf(r)) //*io.PipeReader
 fmt.Println(reflect.TypeOf(w)) //*io.PipeWriter
}

(2)func (r *PipeReader) Close() error (Write) ErrClosedPipe is returned after an ongoing or subsequent write to Write operation has been closed

import (
 "fmt"
 "io"
) func main() {
 r, w := io.Pipe()
 r.Close()  _, err := w.Write([]byte("hello widuu"))   if err == io.ErrClosedPipe {
  fmt.Println(" The pipe is closed and cannot write ") // The pipe is closed and cannot write
 }
}

(3)func (r *PipeReader) CloseWithError(err error) error this is r up here.Close when closed, the writer will return an error message


import (
 "errors"
 "fmt"
 "io"
) func main() {
 r, w := io.Pipe()
 r.Close()
 err := errors.New(" The pipe break is closed ") //errors We've talked about this bag before, just 1 A method of New No, you can look ahead
 r.CloseWithError(err)
 _, err = w.Write([]byte("test"))
 if err != nil {
  fmt.Println(err) // The pipe break is closed
 }
}

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


import (
 "fmt"
 "io"
) func main() {
 r, w := io.Pipe()
 go w.Write([]byte("hello widuu"))
 d := make([]byte, 11)
 n, _ := r.Read(d) // Reading data from a pipe
 fmt.Println(string(d))
 fmt.Println(n)
}


Related articles: