外部读写

终端读写

操作终端相关的文件句柄常量

  • os.Stdin:标准输入
  • os.Stdout:标准输出
  • os.Stderr:标准错误输出
fmt.Fprintf(os.Stdout, "do balance err\n")   // 相当于fmt.Println()

终端读写示例

fmt.Println("Please enter your file name")   // 打印到终端
fmt.Scanln(&firstName, &lastName)   // 只能读空格分隔的字符串
fmt.Scanf("%s %s", &firstName, &lastName)
fmt.Printf("Hi %s %s!\n", firstName, lastName)

// 使用Sscanf提取内容
var str = "stu01 18 18.09"
var stu Students
// fmt.Sscanf(要提取的字符串, 提取格式, 提取到哪儿...)
fmt.Sscanf(str, "%s %d %f", &stu.Name, &stu.Age, &stu.Score)
fmt.Println(stu)  // {stu01 18 18.09}

带缓存区的读写

package main

import (
	"bufio"
	"fmt"
	"os"
)

var inputReader *bufio.Reader
var input string
var err error

func main() {
	inputReader = bufio.NewReader(os.Stdin)
	fmt.Println("Please enter some input: ")
	input, err = inputReader.ReadString('\n')
	if err == nil {
		fmt.Printf("The input was %s\n", input)
	}
}

文件读取

os.File封装所有文件相关的操作,之前的os.Stdin,os.Stdout,os.Stderr都是*os.File

  • 打开一个文件进行读操作:os.Open(name string) (*File, error)

  • 关闭一个文件:File.Close()

package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
)

func main() {
	file, e := os.Open("/home/ericjin/Desktop/test.txt")
	if e != nil {
		fmt.Printf("open file error:%v\n", e)
		return
	}
	defer file.Close()
	reader := bufio.NewReader(file) // 将文件读取到缓存里面
	for {
		s, i := reader.ReadString('\n')
		if i == io.EOF {
			// 文件读完了
			return
		}
		fmt.Printf("the line was %s", s)
	}
}

ioutil

使用ioutil可以读取整个文件

package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	inputFile := "/home/ericjin/Desktop/test.txt"
	outFile := "/home/ericjin/Desktop/test1.txt"
	bytes, e := ioutil.ReadFile(inputFile)  // 读取整个文件到字节数组
	if e != nil {
		fmt.Fprint(os.Stderr, "File Error: %v\n", e)
		return
	}
	fmt.Printf("%s\n", string(bytes))
	err := ioutil.WriteFile(outFile, bytes, 0x64)  // 将内容写到文件中
	if err != nil {
		panic(err.Error())
	}
}

读取压缩文件

package main

import (
	"bufio"
	"compress/gzip"
	"fmt"
	"os"
)

func main() {
	fName := "MyFile.gz"
	var r *bufio.Reader
	// 打开文件
	fi, err := os.Open(fName)
    defer fi.Close()
	if err != nil {
		fmt.Fprint(os.Stderr, "err %v\n", err)
	}
	// 解压缩
	fz, err := gzip.NewReader(fi)
	if err != nil {
		fmt.Fprint(os.Stderr, "err %v\n", err)
	}
	// 读取文件内容
	r = bufio.NewReader(fz)
	for {
		line, err := r.ReadString('\n')
		if err != nil {
			fmt.Fprint(os.Stderr, "err %v\n", err)
		}
		fmt.Println(line)
	}
}

总结

读取文件的几种方式

  • Open一个文件直接读

  • Open一个文件,通过bufio放到缓冲区里面读

  • 通过ioutil整个读取

文件写入

os.OpenFile("test.txt", os.O_WRONLY|os.O_CREATE, 0666)

第二个参数:文件的打开模式

  • os.O_WRONLY 只写

  • os.O_CREATE 创建文件

  • os.O_RDONLY 只读

  • os.O_RDWR 读写

  • os.O_TRUNC 清空

第三个参数:权限控制

  • r 004

  • w 002

  • x 001

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	outputFile, outputErr := os.OpenFile("outPutFile.txt", os.O_WRONLY|os.O_CREATE, 0666)
	// 关闭文件
	defer outputFile.Close()
	if outputErr != nil {
		fmt.Fprint(os.Stderr, "err %v\n", outputErr)
		return
	}
	writer := bufio.NewWriter(outputFile)
	outputStr := "hello world\n"
	for i := 0; i < 10; i++ {
		writer.WriteString(outputStr)
	}
	// 将writer里面的数据刷新到磁盘
	writer.Flush()
}

拷贝文件

使用io.Copy即可拷贝文件

package main

import (
	"io"
	"os"
)

func main() {
	source, err := os.Open("outPutFile.txt")
	defer source.Close()
	if err != nil {
		return
	}
	destination, err := os.OpenFile("outPutFile1.txt", os.O_WRONLY|os.O_CREATE, 0644)
	defer destination.Close()
	if err != nil {
		return
	}
	io.Copy(destination, source)
}

 

posted @ 2019-05-24 16:57  Jin同学  阅读(92)  评论(0)    收藏  举报