Golang——IO操作

server/2024/11/25 19:39:52/

        1. 输入输出的底层原理

        终端其实是一个文件(Linux下一切皆文件),相关实例如下:

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

        以文件方式操作终端:

package mainimport ("os"
)func main() {var buf []byteos.Stdin.Read(buf[:])             //从标准输入中读取os.Stdin.WriteString(string(buf)) //写入标准输入
}

        2. 文件操作相关API 

        根据提供的文件名创建新的文件,返回一个文件对象,默认权限0666,任何人可读可写,不可执行,如果文件存在,则会截断它(为空文件),如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。如果出错,错误底层类型是*PathError。

func Create(name string) (file *File, err error)

        NewFile使用给出的Unix文件描述符和名称创建一个文件。 

func NewFile(fd uintptr, name string) *File

        只读方式打开一个名称为name文件。

func Open(name string) (file *File, err error)

        打开一个名为name的文件,flag是打开方式,只读或只写,不存在创建等,perm文件权限。 

func OpenFile(name string, flag int, perm FileMode) (file *File, err error)

        在指定位置(相对于文件起始位置),写入byte类型的数据到文件,它返回写入的字节数和可能遇到的任何错误。如果返回值n!=len(b),本方法会返回一个非nil的错误。

func (f *File) WriteAt(b []byte, off int64) (n int, err error)

        向文件中写入string类型的信息到文件。

func (f *File) WriteString(s string) (ret int, err error)

        从f中读取最多len(b)字节数的数据到b。

func (f *File) Read(b []byte) (n int, err error)

        从f的指定位置(相对于文件起始位置),读取len(b)字节数并写入b。

func (f *File) ReadAt(b []byte, off int64) (n int, err error)

       删除name指定的文件或目录。

func Remove(name string) error

 3. 打开和关闭文件

        os.Open()函数能够打开一个文件,返回一个*File和一个err。对得到的文件实例调用close()方法能够关闭文件。

package mainimport ("log""os"
)func main() {//只读的方式打开文件f, err := os.Open("./main.go")if err != nil {log.Println("open main.go file fail")return}//关闭文件defer f.Close()
}

4. 写文件

package mainimport ("log""os"
)func main() {//可读可写的方式创建一个文件f, err := os.Create("./xx.txt")if err != nil {log.Println("create file fail")return}defer f.Close()for i := 0; i < 5; i++ {f.Write([]byte("ab\n"))f.WriteString("ab\n")}
}

5. 读文件

        文件读取可以用file.Read()和file.ReadAt(),读到文件末尾会返回io.EOF的错误。

package mainimport ("fmt""io""log""os"
)func main() {f, err := os.Open("./xx.txt")if err != nil {log.Println("open file fail")return}defer f.Close()var content []bytefor {var buf [128]byten, err := f.Read(buf[:])if err == io.EOF {//读到文件末尾break}if err != nil {log.Println("Read file fail", err)return}content = append(content, buf[:n]...) //buf[:n]切片被打散传入}fmt.Println(string(content))
}

 “…”的用法:三个点“...”其实是go的一种语法糖(糖衣语法)

● 第一个用法主要是用于函数有多个不定参数的情况,表示为可变参数,可以接受任意个数但相同类型的参数。

● 第二个用法是slice可以被打散进行传递。

 6. 拷贝文件

package mainimport ("io""log""os"
)func main() {f1, err := os.Open("./xx.txt")if err != nil {log.Println("open xx.txt file fail", err)return}defer f1.Close()f2, err := os.Create("./abc.txt")if err != nil {log.Println("create file fail ", err)return}defer f2.Close()for {var buf [128]byten, err := f1.Read(buf[:])if err == io.EOF {log.Println("读取完毕")break}if err != nil {return}f2.Write(buf[:n])}
}

7. bufio

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

  • bufio读数据 ,bufio先把数据读/写到缓冲区,达到某一上限,会刷新到文件中,也可以强制刷新。
package mainimport ("bufio""fmt""io""log""os"
)func wr() {f, err := os.OpenFile("./xxx.txt", os.O_CREATE|os.O_WRONLY, 0664)if err != nil {log.Println("open file fail ", err)return}defer f.Close()//获取writer对象writer := bufio.NewWriter(f)for i := 0; i < 5; i++ {writer.WriteString("hello\n")}//刷新缓冲区,强制写入writer.Flush()
}func rd() {f, err := os.Open("./xxx.txt")if err != nil {log.Println("open file fail")return}defer f.Close()//获取reader对象reader := bufio.NewReader(f)var content []bytefor {line, _, err := reader.ReadLine()if err == io.EOF {log.Println("读取完毕")break}if err != nil {return}content = append(content, line...)}fmt.Println(string(content))
}func main() {wr()rd()
}

8. ioutil工具包

  • 工具包写文件
  • 工具包读文件
package mainimport ("fmt""io/ioutil""log"
)func wr() {err := ioutil.WriteFile("./xxxx.txt", []byte("hello world!"), 0666)if err != nil {log.Println("err")return}
}func rd() {data, err := ioutil.ReadFile("./xxxx.txt")if err != nil {log.Println("err")return}fmt.Println(string(data))
}func main() {wr()rd()
}

9. 例子

        实现cat命令

package mainimport ("bufio""flag""fmt""io""log""os"
)func cat(reader *bufio.Reader) {for {buf, err := reader.ReadBytes('\n') //注意是字符if err == io.EOF {break}fmt.Fprintf(os.Stdout, "%s", string(buf))}
}func main() {flag.Parse()if flag.NArg() == 0 {cat(bufio.NewReader(os.Stdin))} else {for i := 0; i < flag.NArg(); i++ {f, err := os.Open(flag.Arg(i))if err != nil {log.Printf("open file %s fail, err %v\n", flag.Arg(i), err)continue}cat(bufio.NewReader(f))f.Close()}}
}

http://www.ppmy.cn/server/38327.html

相关文章

批量图片重命名及汇总

又一堆图片文件需要处理... 源文件分布&#xff1a; 有N个文件夹&#xff0c;每个文件夹下又有M个子文件夹&#xff0c;每个子文件夹下有X张图片。 例如文件夹A下有子文件夹A1,A2,A3&#xff0c;子文件夹A1下有图片a-1,a-2,a-3...... 处理目标&#xff1a; 1、将所有图片汇…

Linux-信号保存

1. 概念 进程执行信号的处理动作&#xff0c;称为 信号递达&#xff08;Delivery&#xff09; 信号从产生到递达之间的状态&#xff0c;称为 信号未决&#xff08;Pending&#xff09; 进程可以选择 阻塞&#xff08;Block&#xff09;某个信号 过程&#xff1a; 信号产生 ——…

盘点一下4种常见的微信的广告类型,在微信上打广告要花多少钱?

微信是一款社交媒体应用&#xff0c;集Facebook、Instagram和Snapchat的功能于一身。该应用拥有超过12亿的月活跃用户&#xff0c;其中约7亿为日活跃用户。由于其在中国网民中的成功和广泛的通信工具&#xff0c;微信是推广您业务的绝佳平台。 在这篇博客文章中&#xff0c;我…

qt day 3

优化登录框&#xff0c;点击登录按钮&#xff0c;如果账号和密码匹配&#xff0c;则弹出 信息对话框 给出提示信息“登录成功”&#xff0c;并给出一个 ok 按钮&#xff0c;当用户点击 ok 后&#xff0c;关闭当前界面&#xff0c;跳转到另一个界面&#xff1b;如果账号和密码不…

前端css中径向渐变(radial-gradient)的使用

前端css中径向渐变的使用 一、前言二、主要内容说明&#xff08;一&#xff09;、径向渐变的形状1.椭圆形渐变&#xff08;ellipse&#xff09;&#xff0c;源码12.源码1运行效果3.圆形渐变&#xff08;circle&#xff09;&#xff0c;源码24.源码2运行效果 &#xff08;二&…

通义千问-7B-Chat-Int4

通义千问-7B-Chat-Int4 代码仓库地址&#xff1a;https://github.com/QwenLM/Qwen 安装 克隆我们的仓库并跳转到相应目录 git clone https://www.modelscope.cn/qwen/Qwen-7B-Chat-Int4.git cd Qwen-7B-Chat-Int4 2. 创建 conda 环境 conda create -n qwenint4 python3.8…

快速排序应用

题目描述 著名的快速排序算法里有一个经典的划分过程:通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定一个划分后的正整数序列,请问有多少个元素可能是划分过程中选取的主元? 并按升序输出这些主元。 解…

4. 寻找两个正序数组的中位数

题目描述 2个有序数组&#xff08;保证不能同时为空&#xff09;长度分别为m&#xff0c;n&#xff1b;求他们的中位数。 要求时间复杂度O(long(mn))。 解题思路 题目的要求可以转述为求第k大个数&#xff0c;k可能为1个数&#xff0c;可能为2个数。 k(mn)/2 num1[k/2]表示…