一、文件的基本介绍

文件是数据源(保存数据的地方)的一种,比如经常使用的word文档,txt文件,excel文件都是文件。文件最主要的作用就是保存数据,它既可以保存一张图片,也可以保持视频,声音等等。

1、输入流和输出流  

 golang中的文件操作 随笔

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

2、os.File封装了所以文件相关操作,File是一个结构体

type File struct {
// 内含隐藏或非导出字段
}
File代表一个打开的文件对象。

func (f *File) Read(b []byte) (n int, err error)
Read方法从f中读取最多len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。文件终止标志是读取0个字节且返回值err为io.EOF。

func (f *File) ReadAt(b []byte, off int64) (n int, err error)
ReadAt从指定的位置(相对于文件开始位置)读取len(b)字节数据并写入b。它返回读取的字节数和可能遇到的任何错误。当n<len(b)时,本方法总是会返回错误;如果是因为到达文件结尾,返回值err会是io.EOF。

func (f *File) Write(b []byte) (n int, err error)
Write向文件中写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。

func (f *File) WriteAt(b []byte, off int64) (n int, err error)
WriteAt在指定的位置(相对于文件开始位置)写入len(b)字节数据。它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。

二、打开文件和关闭文件

func Open(name string) (file *File, err error)
Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathError。

func (f *File) Close() error
Close关闭文件f,使文件不能用于读写。它返回可能出现的错误。

package main

import (
	"fmt"
	"os"
)

func main() {
	//打开文件
	//file叫做对象、指针或者文件句柄
	file, err := os.Open("/Users/test/Desktop/demo/ssh.txt")
	if err != nil {
		fmt.Println("open fiel err=", err)
	}
	fmt.Printf("file=%v,%T", *file, file)

	err = file.Close()
	if err != nil {
		fmt.Println("close file err=", err)
	}
}

三、读写文件操作

读取文件的内容并显示在终端(带缓冲区的方式),使用os.Open,file.Close,bufio.NewReader(),reader.ReadString函数和方法

package main

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

func main() {
	//打开文件
	//file叫做对象、指针或者文件句柄
	file, err := os.Open("/Users/test/Desktop/demo/ssh.txt")
	if err != nil {
		fmt.Println("open fiel err=", err)
	}

	//当函数退出时,要及时关闭file,否则会有内存泄漏
	defer file.Close()
	if err != nil {
		fmt.Println("close file err=", err)
	}
	// 创建一个 *Reader ,是带缓冲的
	/*
		const (
		defaultBufSize = 4096 //默认的缓冲区为 4096 )
	*/

	reader := bufio.NewReader(file)

	//循环读取文件内容
	for {
		str, err := reader.ReadString('\n') //读到一个换行就结束
		if err == io.EOF { //io.EOF表示文件的末尾
			break
		}
		//输出内容
		fmt.Print(str)
	}
	fmt.Println("文件读取结束...")
}

读取文件的内容并显示在终端(使用ioutil一次将整个文件读入到内存中),这种方式适用于文件不大的情况。相关方法和函数(ioutil.ReadFile)

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

package main

import (
	"fmt"
	"io/ioutil"
)

func main() {
	//使用ioutil.ReadFile一次性将文件读取到位
	file := "/Users/bytedance/Desktop/bytedance/ssh.txt"

	content, err := ioutil.ReadFile(file)
	if err != nil {
		fmt.Printf("read file err=%v", err)
	}
	//把读取到的内容显示到终端
	fmt.Printf("%v\n", content) //[]byte
	fmt.Printf("%v", string(content))

	//没有显式的Open文件,也不需要显式Close文件
	//文件的Open和Close被封装到ReadFile函数内部
}

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄