go语言io reader_go语言之IO操作(待补充)
前言
在Go中,输入和输出操作都是使用原语实现的,原语将数据模拟成可读的或者可写的字节流。
而Go的io包提供了io.Reader(将数据从某个资源读取到传输缓冲区被流式传输和使用)和io.Writer(从缓冲区读取数据,并写入目标资源)接口。实现了io.Reader接口的唯一方法Read(p []byte)(n int, err error),它就是一个读取器。n 读取到的字节数
err 发生错误的信息(注意:资源读取完毕返回io.EOF错误)
使用Reader
思路: Reader方法内部是循环被调用的,每次迭代都会从数据源取一块数据放入缓冲区p,资源读取完毕返回io.EOF错误为止。
我们通过strings.NewReader(string) 创建一个字符串读取器来迭代读取:package main
import (
"fmt"
"io"
"os"
"strings"
)
func main() {
//创建一个字符串读取器
reader := strings.NewReader("How are you today You were in a bad mood yesterday")
//创建一个长度为3的切片
p := make([]byte, 3)
//循环取数据
for {
//读取到的字节数,err 发生错误的信息(注意:资源读取完毕返回io.EOF错误)
n, err := reader.Read(p)
if err != nil {
if err == io.EOF {
fmt.Println("The resource is read!")
break
}
fmt.Println("Read err :", err.Error())
os.Exit(1)
}
fmt.Println(string(p[:n]), p[:n])
}
}
输出打印的内容:How [72 111 119]
ar [32 97 114]
e y [101 32 121]
ou [111 117 32]
tod [116 111 100]
ay [97 121 32]
You [89 111 117]
we [32 119 101]
re [114 101 32]
in [105 110 32]
a b [97 32 98]
ad [97 100 32]
moo [109 111 111]
d y [100 32 121]
est [101 115 116]
erd [101 114 100]
ay [97 121]
The resource is read!
拓展例子(读取文件行数并且打印每一行内容和二进制流)package main
import (
"bufio"
"fmt"
"os"
"time"
)
func main() {
if len(os.Args) < 2 {
os.Exit(1)
}
filename := os.Args[1]
file, err := os.Open(filename)
defer file.Close()
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
reader := bufio.NewReader(file)
var line int
fmt.Print("下面为你读取",filename,"每一行的内容:\n")
for {
lineContent, isPrefix, err := reader.ReadLine()
if err != nil {
break
}
if !isPrefix {
line++
time.Sleep(time.Second*1)
fmt.Println("第",line,"行的二进制数据流为:", lineContent,"内容是:",string(lineContent))
fmt.Print("\n")
}
}
fmt.Println("名字为:",filename,"的文件一共有:", line,"行")
}
go语言io reader_go语言之IO操作(待补充)相关推荐
- go语言io reader_Go语言中异步拆分io.Reader
在Go语言中处理任何stream数据时,我已经深陷io.Reader和io.Writer的灵活性中不能自拔.同时我在有一点上又或多或少的受了些折磨,挑战我的reader interface在你看来可能 ...
- STM32笔记 GPIO介绍及IO口操作 STM32F0 利用C语言位域实现仿位带操作
文章目录 GPIO简介 工作方式 相关寄存器介绍 IO 操作步骤 IO口三种操作细解 附录:C语言相关 偏移地址与绝对地址 GPIO简介 GPIO:每个连接到I/O总线上的设备都有自己的I/O地址集, ...
- 51单片机C语言程序100例分析(1)IO+C语言+头文件
51单片机C语言程序100例分析(1)IO+C语言+头文件 \\\插播一条:文章末尾有惊喜哟~/// P1=0xfe;//P1=11111110B,即P1.0输出低电平} 分析:通过这短短的几行代码 ...
- c语言io口置1,AVR C语言编程的小技巧-IO口置位
avr AVR C语言编程的小技巧-IO口置位 给单片机IO口置位是编程用的比较多的操作,这是我在学习C语言编程中的一点小小心得,希望大家觉得有用! AVR 单片机的IO口是标准的双向端口,首先要设置 ...
- c语言io口置1,AVR_C语言编程的小技巧-IO口置位.doc
AVR C语言编程的小技巧-IO口置位 给单片机IO口置位是编程用的比较多的操作,这是我在学习C语言编程中的一点小小心得,希望大家觉得有用!AVR 单片机的IO口是标准的双向端口,首先要设置IO口的状 ...
- linux原子过程,linux系统编程:IO读写过程的原子性操作实验
所谓原子性操作指的是:内核保证某系统调用中的所有步骤(操作)作为独立操作而一次性加以执行,其间不会被其他进程或线程所中断. 举个通俗点的例子:你和女朋友OOXX的时候,突然来了个电话,势必会打断你们高 ...
- 实验1:用户的登录与退出、IO重定向与简单文件操作
实验1:用户的登录与退出.IO重定向与简单文件操作 1.实验目的 (1).掌握系统开启和关闭的方法及正常关闭系统的意义和必要性: (2).掌握用户的登录与退出的方法及用户退出系统或注销的意义和必要性: ...
- 文件IO实现图片的加密操作
目录 1.什么是文件IO 2.什么是文件描述符 3.文件相关系统调用函数 (1)打开关闭文件 文件打开open(): 文件关闭close() (2)读写文件 读文件read() 写文件write() ...
- 使用OperatorHub.io自动化群集上的操作
使用OperatorHub.io自动化群集上的操作 作者:Diane Mueller,红帽云平台社区发展总监 开发者和Kubernetes管理员面临的重要挑战之一,是缺乏快速查找在Kubernetes ...
最新文章
- 数据结构 第三周第四周学习小结
- python学习日常-编码与字符串格式化
- 实现一个bind函数
- php表单提交邮箱_最全实现dede订单表单提交发送到指定邮箱(附前台设置)
- docker安装nextcloud(附nextcloud win7客户端下载教程)
- Python Set:一文彻底粉碎集合类型
- 什么是AWT_Swing_Scroll面板,上!!!
- Oracle EBS连接数不足
- 堡垒机全称是什么?是运维安全审计系统吗?
- SQL Server高级编程
- Thread小练习(网图下载)
- Service Mesh的未来将与Knative和Apahce Whisk等技术和谐共存——采访RedHat的Istio产品经理...
- [Android UI] graphics
- Ubuntu 安装sogo 输入法
- 个人能力知识体系如何构建?
- Persist Security Info = true | false作用
- 用python函数画德国国旗代码_每日一程-11.利用Python turtle库绘制国旗
- 学会读源码,很重要!
- XML之父拒绝甲骨文橄榄枝 加盟谷歌Android【转载】
- 工具 | Cursor:一个不只是写代码的工具
热门文章
- Nginx -静态资源Web服务
- js ajax java传参_ajax参数传递与后台接收
- VB实现6大排序算法---动态过程展示(建议收藏)
- AJAX与SQL Server(一)
- Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap简单的区别
- linux之如何快速查看文件的大小
- Android插件化开发之动态加载基础之ClassLoader工作机制
- Hook API (C++)
- Android之React Native平台与Android本地模块之间的调用
- 有关 php __autoload 自动加载类函数的用法