网站首页 > 基础教程 正文
Reading File 读文件
读写文件是许多Go程序所需的基本任务。首先,我们将看一些读取文件的示例。读取文件需要检查是否出现调用错误。
最基本的文件读取任务是将文件的全部内容读到内存中ioutil.ReadFile。
也可以控制读取文件的方式和内容。对于这些任务,首先打开一个文件os.Open以获取os.File对象。可以从文件开头读取Read一些字节,并且允许指定读取的字节数,但以实际读取的字节数为准。
还可以从指定的文件位置读取。io包提供了一些可能有助于文件读取的功能。例如,使用io.ReadAtLeast使得程序更加健壮。
没有内置rewind,使用Seek(0, 0)实现类似的功能。bufio包实现了一个带缓冲的读取器bufio.NewReader,它在频繁地、小长度的读取操作很有效率。
读取文件完成后需要关闭该文件(通常在打开文件后立刻使用defer关闭文件)。
结果:
$ echo "hello" > /tmp/dat
$ echo "go" >> /tmp/dat
$ go run reading-files.go
hello
go
5 bytes: hello
2 bytes @ 6: go
2 bytes @ 6: go
5 bytes: hello
Writing File 写文件
在Go中写入文件的模式与我们前面看到的读取文件的操作类似。
首先,这里介绍如何将字符串(或仅字节)转储到文件中。要进行更细微的写入控制,使用打开文件方法os.Create进行写入。在打开文件后立即延迟关闭是一种习惯做法。您可以按预期Write写入字节切片。还可以使用WriteString直接写入字符串。Sync方法使写入操作刷新到存储器上。
除了前面看到的缓冲读取器bufio.NewReader之外,bufio还提供了缓冲写入器bufio.NewWriter。使用Flush可确保所有缓冲的操作都已应用于底层的写入器上。
结果:
$ go run writing-files.go
wrote 5 bytes
wrote 7 bytes
wrote 9 bytes
$ cat /tmp/dat1
hello
go
$ cat /tmp/dat2
some
writes
buffered
Line Filte 行过滤器
行过滤器是一种常见的程序类型,它在stdin上读取输入,对其进行处理,然后将结果打印到stdout上。grep和sed是常用的行过滤器,下面是Go中行过滤器的一个示例,它打印每行输入的大写版本。
您可以使用此模式来编写自己的Go行过滤器。使用bufio.NewScanner包装未缓冲的os.Stdin,此包装提供了一种方便的扫描方法Scan,可以将扫描仪推进到下一个标记,即下一行。Text从输入返回当前标记,即本行文本,打印出文本的大写版本。在扫描过程中检查错误,错误并未包含文件末尾。
结果:
$ echo 'hello' > /tmp/lines
$ echo 'filter' >> /tmp/lines
$ cat /tmp/lines | go run line-filters.go
HELLO
FILTER
- 上一篇: Go 面试系列(五) - io.ReadAll 怎样读全部?
- 下一篇: 文件处理和 I/O 操作
猜你喜欢
- 2024-11-26 golang defer、panic、recover实践
- 2024-11-26 go-fastdfs文件上传
- 2024-11-26 OpenHarmony3.0在树莓派3B上的烧录与通讯
- 2024-11-26 go|bytes.buffer
- 2024-11-26 AOVX资产跟踪产品测试工具mPower1203如何使用python对接 (二)
- 2024-11-26 Python os.dup2() 方法是什么?os.du
- 2024-11-26 go中关于文件和json操作的知识点小结
- 2024-11-26 python3从零学习-5.8.4、mmap—内存映射文件支持
- 2024-11-26 29.Python 读取文件的六种方式
- 2024-11-26 macOS安装并设置五笔输入法
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)