IO

PPG007 ... 2021-12-26 About 2 min

# IO

# 终端输入输出

  • os.Stdin:标准输入的文件实例,类型为 *File。
  • os.Stdout:标准输出的文件实例,类型为 *File。
  • os.Stderr:标准错误输出的文件实例,类型为 *File。

# 读写文件

// 写文件
func WriteStringToFile(file string) {
  // 创建一个文件,默认权限 0666。
  f, err := os.Create(file)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer f.Close()
  for i := 0; i < 5; i++ {
    f.WriteString("李在赣神魔\n")
    f.Write([]byte("芜湖"))
  }
}

// 读文件
func ReadFileAsString(file string){
  f, err := os.Open(file)
  if err != nil {
    fmt.Println("打开文件错误")
    return
  }
  defer f.Close()
  var buf [128]byte
  var content []byte
  for {
    n, err := f.Read(buf[:])
    if err == io.EOF {
      break
    }
    if err != nil {
      fmt.Println("读取文件出错")
      return
    }
    content = append(content, buf[:n]...)
  }
  fmt.Println(string(content))
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

# 拷贝文件

func CopyFile (source, dest string) {
  destFile, err := os.Create(dest)
  if err != nil {
    fmt.Println(err)
    return
  }
  sourceFile, err2 := os.Open(source)
  if err2 != nil {
    fmt.Println(err2)
    return
  }
  var buffer [1024]byte
  for {
    n, err3 := sourceFile.Read(buffer[:])
    if err3 == io.EOF {
      break
    }
    destFile.Write(buffer[:n])
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 其他 API

删除文件:

os.Remove(filePath)
1

指定打开文件的方式、权限:

f, err := os.OpenFile("demo.txt", os.O_APPEND|os.O_RDWR, os.ModeAppend)
1

# bufio

bufio 包实现了带缓冲区的读写,是对文件读写的封装。

func BufferWrite(name string) {
  f, err := os.OpenFile(name, os.O_APPEND|os.O_WRONLY, 0666)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer f.Close()
  w := bufio.NewWriter(f)
  for i := 0; i < 10; i++ {
    w.WriteString("李在赣神魔\t")
  }
  w.Flush()
}
func BufferRead(name string) {
  f, err := os.Open(name)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer f.Close()
  r := bufio.NewReader(f)
  for {
    line, _, err := r.ReadLine()
    if err == io.EOF {
      break
    }
    if err != nil {
      return
    }
    fmt.Println(string(line))
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

通过 bufio 获取标准输入:

r := bufio.NewReader(os.Stdin)
line, _, _ := r.ReadLine()
1
2

# ioutil

读取所有内容:

f, err := os.Open("demo.txt")
if err != nil {
  return
}
// 直到读取到 EOF,但是不会将读取到 EOF 视为错误。
b, err2 := ioutil.ReadAll(f)
if err2 != nil {
  return
}
fmt.Println(string(b))
1
2
3
4
5
6
7
8
9
10

或者使用 ReadAll 方法:

b, err := ioutil.ReadFile("demo.txt")
if err != nil {
  return
}
fmt.Println(string(b))
1
2
3
4
5

向指定文件写入数据,如果文件不存在将按照给定权限创建文件,否则在写入前清空文件内容。

func main() {
  err := ioutil.WriteFile("demo.txt", []byte("拖,就硬拖"), 0666)
  if err != nil {
    fmt.Println(err)
    return
  }
}
1
2
3
4
5
6
7

读取指定目录中的信息:

func main() {
  fi, err := ioutil.ReadDir(".")
  if err != nil {
    fmt.Println(err)
    return
  }
  for _, v := range fi {
    fmt.Println(v.Name())
  }
}
1
2
3
4
5
6
7
8
9
10
Last update: December 26, 2021 03:54
Contributors: PPG007