Go语言fmt、os、ioioutil、bufio包

fmt、os、ioioutil、bufio包是与系统、文件、输入输出相关的包

一、os包

os包是与操作系统有关的包。

os包提供了操作系统函数的不依赖平台的接口。设计为Unix风格的,虽然错误处理是go风格的;失败的调用会返回错误值而非错误码。通常错误值里包含更多信息。

系统级的操作如获取系统信息等可查阅文档,主要讨论对文件系统的操作。

主要结构体

type File struct {
    // 内含隐藏或非导出字段
}


type FileInfo interface {
    Name() string       // 文件的名字(不含扩展名)
    Size() int64        // 普通文件返回值表示其大小;其他文件的返回值含义各系统不同
    Mode() FileMode     // 文件的模式位
    ModTime() time.Time // 文件的修改时间
    IsDir() bool        // 等价于Mode().IsDir()
    Sys() interface{}   // 底层数据来源(可以返回nil)
}

//FileInfo可以通过Stat()函数得到,如下

	fileInfo, _ := os.Stat("hello.txt")

	//通过方法返回文件信息
	isDir := fileInfo.IsDir()
	size:= fileInfo.Size()

	fmt.Println("isDir: ",isDir)
	fmt.Println("size :",size)

文件打开模式

const (
    O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
    O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
    O_RDWR   int = syscall.O_RDWR   // 读写模式打开文件
    O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
    O_CREATE int = syscall.O_CREAT  // 如果不存在将创建一个新文件
    O_EXCL   int = syscall.O_EXCL   // 和O_CREATE配合使用,文件必须不存在
    O_SYNC   int = syscall.O_SYNC   // 打开文件用于同步I/O
    O_TRUNC  int = syscall.O_TRUNC  // 如果可能,打开时清空文件
)

文件权限模式

type FileMode uint32
FileMode代表文件的模式和权限位。
0666代表任何人可读可写但不可执行。

File方法

File的方法最多,有创建打开以及读写等方法。

OpenFile系列方法

OpenFile需要传入三个参数,文件名、文件打开模式、文件权限模式。

Open方法只需要一个参数、文件名,默认以只读模式开启。

Create方法用于创建一个文件、默认可读可写不可执行,已存在的文件会被截断并重新创建。

Read/Write系列方法

Read/Write方法用于文件读写。

实例

使用OpenFile方法打开文件,并且使用Read方法读取,WriteString写入。

	file, _ := os.OpenFile("Fps.txt", os.O_APPEND|os.O_RDONLY, 0666)

	 defer file.Close()//习惯性的关闭

	bytes := make([]byte, 1024)

	n, _ := file.Read(bytes)
	
	file.WriteString("write it!!!")

	fmt.Println(string(bytes[0:n]))

标准输出也是可以的

os.Stdout.WriteString("hello")

二、fmt包

fmt包实现了类似C语言printf和scanf的格式化I/O。格式化动作('verb')源自C语言但更简单。

之前已经描述过,主要的方法和功能就是printf和scanf。

标准输入输出

	fmt.Println()//输出任意类型数据,并换行
	fmt.Print()  //输出任意类型数据,不换行
	fmt.Printf()//格式化输出数据,不换行

	fmt.Scan()//扫描,必须所有参数都被填充后换行才结束扫描
	fmt.Scanln()//扫描,但是遇到换行就结束扫描
	fmt.Scanf()//格式化扫描,换行就结束

File输入输出

这里指的File其实是Writer,只是File实现了Writer,暂且这样表示。

io.Writer
    fmt.Fprintln()//输出任意类型数据到File中,并换行
	fmt.Fprint()  //输出任意类型数据File中,不换行
	fmt.Fprintf()//格式化输出任意类型数据到File中,不换行

	fmt.Fscanln()//从File中读取数据进入参数中
	file, _ := os.OpenFile("Fps.txt", os.O_CREATE|os.O_RDWR, 0666)

	defer  file.Close()//习惯性的关闭

	fmt.Fprintln(file,"hello Fprintln!!!")//将数据输入到file中

字符串输入输出

S系列和字符串相关,感兴趣可以自行研究。

fmt.Sprintln()

三、io/ioutil包

io包下主要有两个接口,这两个接口被很多type实现,如FIle。

除此之外,还有一系列接口。

type Reader

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

Reader接口用于包装基本的读取方法。

type Writer

type Writer interface {
    Write(p []byte) (n int, err error)
}

Writer接口用于包装基本的写入方法。

以及一个Copy函数。

func Copy

func Copy(dst Writer, src Reader) (written int64, err error)

将src的数据拷贝到dst,直到在src上到达EOF或发生错误。返回拷贝的字节数和遇到的第一个错误。

    hello, _ := os.OpenFile("hello.txt",os.O_RDWR,0666)
	hi ,_:= os.OpenFile("hi.txt",os.O_RDWR,0666)

	defer hello.Close()
	defer hi.Close()


	io.Copy(hi,hello)
	io.Copy(os.Stdout,hello)

ioutil直接提供了读取文件的函数,如下。

func ReadFile

func ReadFile(filename string) ([]byte, error)

ReadFile 从filename指定的文件中读取数据并返回文件的内容。成功的调用返回的err为nil而非EOF。因为本函数定义为读取整个文件,它不会将读取返回的EOF视为应报告的错误。

	bytes, _ := ioutil.ReadFile("hello.txt")

	fmt.Println(string(bytes))

func WriteFile

func WriteFile(filename string, data []byte, perm os.FileMode) error

函数向filename指定的文件中写入数据。如果文件不存在将按给出的权限创建文件,否则在写入数据之前清空文件。

四、bufio包

bufio包实现了有缓冲的I/O。它包装一个io.Reader或io.Writer接口对象,创建另一个也实现了该接口,且同时还提供了缓冲和一些文本I/O的帮助函数的对象。

包下有两个结构体,名字和io包下的接口一样.

type Reader

type Reader struct {
    // 内含隐藏或非导出字段
}

type Writer

type Writer struct {
    // 内含隐藏或非导出字段
}

通过以下两个函数来获取相应的缓存io对象。

func NewReader

func NewReader(rd io.Reader) *Reader

NewReader创建一个具有默认大小缓冲、从r读取的*Reader。

func NewWriter

func NewWriter(w io.Writer) *Writer

NewWriter创建一个具有默认大小缓冲、写入w的*Writer。

其他用法和io用法类似,如下:

    file, _ := os.OpenFile("hello.txt", os.O_RDWR, os.ModeAppend)
	reader := bufio.NewReader(file)

	bytes := make([]byte, 100)

	n, _ := reader.Read(bytes)
	fmt.Println(string(bytes[0:n]))

还有一些扩展的方法。

原文地址:https://www.cnblogs.com/cgl-dong/p/14035018.html