【sync】I/O

前言

同步于roadmap : advanced/io.md

IO相关类型层次关系

IO

IO是最广义的输入输出抽象类型

IO流

IOStream描述了一个带缓存的、操作系统输入输出流的包裹,它通常用于表示open所得

IO上下文

IOContext提供给show传递输出配置设置的机制,它有两个域:io包裹了一个IO示例,而dict是一个不可变字典(::Base.ImmutableDict{Symbol, Any}),保存了相关设置
可以使用IOContext(io::IO, KV::Pair...)从给定IO实例创建IO上下文 或 IOContext(io::IO, context::IOContext),这会复制相关设置
通常来说,用于show的有以下设置:

  • compatBool):输出应该更兼容且保证没有换行,例如数字应显示更少数位(这个设置会在显示数组元素时使用)
  • limitBool):容器的输出应被缩短(例如使用
  • displaysizeTuple{Int,Int}):标注文字输出的行列数限制,它可能被覆盖(override),因此建议使用displaysize获取窗口大小
  • typeinfoType):标注相关的类型信息,这使得Float16(0)被显示为Float16(0.0)而不是Float16(Float16(0.0))
  • colorBool):标注是否支持(且希望)允许文字风格

IO缓冲区

Base.GenericIOBuffer可以将数组作为缓冲区包裹

IOBuffer可以用于快速生成一个Base.GenericIOBuffer{Vector{UInt8}}实例,这可以方便地将常用数据包裹成I/O

julia> buf=IOBuffer()
IOBuffer(data=UInt8[...], readable=true, writable=true, seekable=true, append=false, size=0, maxsize=Inf, ptr=1, mark=-1)

julia> write(buf,"foo")
3

julia> String(take!(buf))
"foo"

管道

Pipe函数可以创建一个未初始化的Pipe实例,当它用于进程生成时恰当的端将被自动初始化,从而很好地与pipeline联动
pipeline可以用于生成OrCmds实例,它的一个原型是pipeline(command; stdin, stdout, stderr, append=false),用于给指定命令重定向I/O,其中append参数指定是否对于文件使用补加而不是覆盖
另一个原型是pipeline(from, to, ...),用于创建从一个「数据来源」到「目的地」的管线,本质是pipeline(from; stdout=to)。参数可以是命令,IO实例或字符串(表示文件路径),且保证至少一个参数是命令
多个参数会将pipeline(a,b,c)处理成pipeline(pipeline(a,b),c)

通用函数

名称 描述
read(io::IO, T) 从io中读取T类型的单个值,使用标准二进制表示,需手动使用ntohltoh调整大小端
read(io::IO, String) 将整个io作为字符串读入
read(s::IO, nb=typemax(Int)) 从s中读入最多nb个字符,返回Vector{UInt8}实例
read!(stream::IO, array::AbstractArray) 从io中读取二进制数据填充array
write(io::IO, x) 将x的二进制表示写入io
print([io::IO], xs...) 将x(们)的文字表示写入io
show 自定义显示
flush 提交所有缓存

标记

可以使用mark在当前位置作标记,使用unmark取消标记(若有),使用ismarked查看是否有标记,使用reset跳到上一个标记(无标记抛出错误)

3 个赞