Go语言IO操作输入输出底层原理及文件操作API
短信预约 -IT技能 免费直播动态提醒
1.输入输出的底层原理
终端其实是一个文件,相关实例如下:
- os.Stdin:标准输入的文件实例,类型为*File
- os.Stdout:标准输出的文件实例,类型为*File
- os.Stderr:标准错误输出的文件实例,类型为*File
以文件的方式操作终端:
package main
import "os"
func main() {
var buf [16]byte
os.Stdin.Read(buf[:])
os.Stdin.WriteString(string(buf[:]))
}
2. 文件操作相关API
- func Create(name string) (file *File, err Error) 根据提供的文件名创建新的文件,返回一个文件对象,默认权限是0666
- func NewFile(fd uintptr, name string) *File 根据文件描述符创建相应的文件,返回一个文件对象
- func Open(name string) (file *File, err Error) 只读方式打开一个名称为name的文件
- func OpenFile(name string, flag int, perm uint32) (file *File, err Error) 打开名称为name的文件,flag是打开的方式,只读、读写等,perm是权限
- func (file *File) Write(b []byte) (n int, err Error) 写入byte类型的信息到文件
- func (file *File) WriteAt(b []byte, off int64) (n int, err Error) 在指定位置开始写入byte类型的信息
- func (file *File) WriteString(s string) (ret int, err Error) 写入string信息到文件
- func (file *File) Read(b []byte) (n int, err Error) 读取数据到b中
- func (file *File) ReadAt(b []byte, off int64) (n int, err Error) 从off开始读取数据到b中
- func Remove(name string) Error 删除文件名为name的文件
3. 打开和关闭文件
os.Open()函数能够打开一个文件,返回一个*File和一个err。对得到的文件实例调用close()方法能够关闭文件。
package main
import (
"fmt"
"os"
)
func main() {
// 只读方式打开当前目录下的main.go文件
file, err := os.Open("./main.go")
if err != nil {
fmt.Println("open file failed!, err:", err)
return
}
// 关闭文件
file.Close()
}
4. 写文件
package main
import (
"fmt"
"os"
)
func main() {
// 新建文件
file, err := os.Create("./xxx.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
for i := 0; i < 5; i++ {
file.WriteString("ab\n")
file.Write([]byte("cd\n"))
}
}
5. 读文件
文件读取可以用file.Read()和file.ReadAt(),读到文件末尾会返回io.EOF的错误
package main
import (
"fmt"
"io"
"os"
)
func main() {
// 打开文件
file, err := os.Open("./xxx.txt")
if err != nil {
fmt.Println("open file err :", err)
return
}
defer file.Close()
// 定义接收文件读取的字节数组
var buf [128]byte
var content []byte
for {
n, err := file.Read(buf[:])
if err == io.EOF {
// 读取结束
break
}
if err != nil {
fmt.Println("read file err ", err)
return
}
content = append(content, buf[:n]...)
}
fmt.Println(string(content))
}
6. 拷贝文件
package main
import (
"fmt"
"io"
"os"
)
func main() {
// 打开源文件
class="lazy" data-srcFile, err := os.Open("./xxx.txt")
if err != nil {
fmt.Println(err)
return
}
// 创建新文件
dstFile, err2 := os.Create("./abc2.txt")
if err2 != nil {
fmt.Println(err2)
return
}
// 缓冲读取
buf := make([]byte, 1024)
for {
// 从源文件读数据
n, err := class="lazy" data-srcFile.Read(buf)
if err == io.EOF {
fmt.Println("读取完毕")
break
}
if err != nil {
fmt.Println(err)
break
}
//写出去
dstFile.Write(buf[:n])
}
class="lazy" data-srcFile.Close()
dstFile.Close()
}
7. bufio
- bufio包实现了带缓冲区的读写,是对文件读写的封装
- bufio缓冲写数据
os.O_WRONLY //只写 os.O_CREATE //创建文件 os.O_RDONLY //只读
os.O_RDWR //读写 os.O_TRUNC //清空 os.O_APPEND //追加
- bufio读数据
package main
import (
"bufio"
"fmt"
"io"
"os"
)
func wr() {
// 参数2:打开模式,所有模式d都在上面
// 参数3是权限控制
// w写 r读 x执行 w 2 r 4 x 1
file, err := os.OpenFile("./xxx.txt", os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
return
}
defer file.Close()
// 获取writer对象
writer := bufio.NewWriter(file)
for i := 0; i < 10; i++ {
writer.WriteString("hello\n")
}
// 刷新缓冲区,强制写出
writer.Flush()
}
func re() {
file, err := os.Open("./xxx.txt")
if err != nil {
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
line, _, err := reader.ReadLine()
if err == io.EOF {
break
}
if err != nil {
return
}
fmt.Println(string(line))
}
}
func main() {
re()
}
以上就是Go语言IO操作输入输出底层原理及文件操作API的详细内容,更多关于Go IO操作输入输出API的资料请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341