github.com/szq-123/codingpractice@v0.0.0-20240430111904-2778dfaf7994/golang/io_test.go (about) 1 package golang 2 3 import ( 4 "GolangPractice/utils/logger" 5 "archive/zip" 6 "bufio" 7 "bytes" 8 "github.com/gookit/color" 9 "io" 10 "os" 11 "testing" 12 ) 13 14 // here are some frequently used package provided by the official group. 15 // io: basic `reader`, `writer`, etc. pipe, 16 // os: file 17 // bufio: reading and writing with buffer. 18 // ioutil: read and write files. It's about to be obsolete. previous functions will be translocated to package `io`,`os`. 19 // archive/zip: read and write compressed files with buffer. 20 // io/fs: file system. 21 22 func TestWorkDir(t *testing.T) { 23 // Get current work directory 24 workDir, err := os.Getwd() 25 if err != nil { 26 logger.Errorln(err) 27 return 28 } 29 logger.Infoln("workDir:", workDir) 30 31 // change current directory 32 err = os.Chdir("/root") 33 if err != nil { 34 logger.Errorln(err) 35 return 36 } 37 } 38 39 func TestFile(t *testing.T) { 40 // get user home dir 41 homeDir, _ := os.UserHomeDir() 42 43 // flag `os.O_CREATE` used for creating a file when not existing. you can use os.Create() instead. 44 f, err := os.OpenFile(homeDir+"test.txt", os.O_RDWR|os.O_CREATE, 0666) 45 if err != nil { 46 logger.Errorln("open file err:", err) 47 return 48 } 49 defer f.Close() 50 51 n, err := f.Write([]byte(`you are the beast!`)) 52 if err != nil { 53 logger.Errorf("writing does not finish. %d bytes writed\n", n) 54 } 55 56 os.Remove("test1.txt") 57 } 58 59 func TestReadFile(t *testing.T) { 60 // METHOD 1: os.Open just for Reading. 61 file, err := os.Open("test.txt") 62 if err != nil { 63 logger.Errorln("open file err: ", err) 64 return 65 } 66 defer file.Close() 67 68 content := bytes.NewBuffer(nil) 69 var buf [128]byte 70 for { 71 n, err1 := file.Read(buf[:]) 72 // complete reading file. 73 if err1 == io.EOF { 74 break 75 } 76 if err1 != nil { 77 logger.Errorln("read file err:", err1) 78 return 79 } 80 content.Write(buf[:n]) 81 } 82 logger.Infoln("content:", content.String()) 83 84 // METHOD 2 85 content1, err := os.ReadFile("test.txt") 86 logger.Infof("content1: %s, err: %s\n", content1, err.Error()) 87 } 88 89 func TestZip(t *testing.T) { 90 // TODO 91 f, _ := os.OpenFile("demo.zip", os.O_RDWR|os.O_CREATE, 0666) 92 defer f.Close() 93 94 z := zip.NewWriter(f) 95 defer z.Close() // `Flush` will execute in the function. 96 } 97 98 func TestStd(t *testing.T) { 99 input := make([]byte, 0, 20) 100 _, err := os.Stdin.Read(input) 101 logger.Infof("input: %s, err: %s", input, err.Error()) 102 103 _, err = os.Stdout.Write(input) 104 logger.Errorln("Write err:", err) 105 106 // TODO doesn't work well 107 // redirect output to particular file 108 redirectFile, err := os.OpenFile("/tmp/redirectFile", os.O_RDWR|os.O_CREATE|os.O_SYNC, 0766) 109 if err != nil { 110 color.Redln("failed to open redirectFile file, reason: ", err.Error()) 111 return 112 } 113 defer redirectFile.Close() 114 os.Stdout = redirectFile 115 os.Stderr = redirectFile 116 117 logger.Infoln("output after redirect") 118 } 119 120 func TestBufIO(t *testing.T) { 121 f, err := os.OpenFile("test.txt", os.O_RDWR|os.O_CREATE, 0666) 122 if err != nil { 123 logger.Errorln("open file err: ", err) 124 return 125 } 126 defer f.Close() 127 128 bufWriter := bufio.NewWriter(f) 129 for i := 0; i < 10; i++ { 130 bufWriter.Write([]byte("123\n")) 131 bufWriter.Flush() 132 } 133 134 // bufio.NewReader(f) = bufio.NewReaderSize(f, 4096) 135 reader := bufio.NewReaderSize(f, 4096) 136 137 reader.ReadBytes('\n') 138 }