io 包
介绍
io 包提供对字符串、缓冲区、字节数组等进行读写操作的流。
主要接口
interface InputStream
public interface InputStream {
func read(buffer: Array<Byte>): Int64
}
接口 InputStream,输入流接口,继承该接口的 class、interface、struct 需要遵守该接口中函数的入参及返回值定义。
func read
func read(buffer: Array<Byte>): Int64
功能:从输入流中读取数据放到 buffer 中。没有数据可读,返回 0;读取失败,抛出异常。
参数:
- buffer:读取数据存放的缓冲区,若 buffer 为空则抛出异常
返回值:读取成功,返回读取字节数
interface OutputStream
public interface OutputStream {
func write(buffer: Array<Byte>): Unit
func flush(): Unit
}
接口 OutputStream,输出流接口,继承该接口的 class、interface、struct 需要遵守该接口中函数的入参及返回值定义。
func write
func write(buffer: Array<Byte>): Unit
功能:将 buffer 中的数据写入到输出流中,当数据全部成功写入则函数返回,写入失败或者只写入了部分数据,则抛出异常。
参数:
- buffer:待写入数据的缓冲区,若 buffer 为空则直接返回
func flush
func flush(): Unit
功能:清空缓存区,该函数提供默认实现,默认实现为空。
interface IOStream
public interface IOStream <: InputStream & OutputStream {}
接口 IOStream,输入输出流接口,继承该接口的 class、interface、struct 需要遵守该接口中函数的入参及返回值定义。
interface Seekable
public interface Seekable {
func seek(sp: SeekPosition): Int64
prop length: Int64
prop position: Int64
prop remainLength: Int64
}
接口 Seekable,移动光标接口,继承该接口的 class、interface、struct 需要遵守该接口中函数的入参及返回值定义。
func seek
func seek(sp: SeekPosition): Int64
参数:
- sp:指定光标跳转后的位置
返回值:返回流中数据头部到跳转后位置的偏移量(以字节为单位)
prop length
prop length: Int64
功能:返回当前流中的总数据量。
prop remainLength
prop remainLength: Int64
功能:获取当前流中可读的数据量。
prop position
prop position: Int64
功能:获取流当前光标位置。
class IOException
public class IOException <: Exception {
public init()
public init(message: String)
}
异常处理类,继承了 Exception 类,用于处理 io 流相关的异常。
init
public init()
功能:创建 IOException 实例。
init
public init(message: String)
功能:创建带有异常信息 message 的 IOException 实例。
class ContentFormatException
public class ContentFormatException <: Exception
异常处理类,继承了 Exception 类,用于处理字符格式相关的异常。
enum SeekPosition
public enum SeekPosition {
| Current(Int64)
| Begin(Int64)
| End(Int64)
}
SeekPosition 枚举类型表示光标在文件中的位置。
Current
Current(Int64)
功能:构造 SeekPosition 枚举实例,表示在当前实际位置基础上偏移后的位置,偏移量为入参值。
Begin
Begin(Int64)
功能:构造 SeekPosition 枚举实例,表示在文件开始位置基础上偏移后的位置,偏移量为入参值。
End
End(Int64)
功能:构造 SeekPosition 枚举实例,表示在文件结束位置基础上偏移后的位置,偏移量为入参值。
class ByteArrayStream
public class ByteArrayStream <: InputStream & OutputStream & Seekable {
public init()
public init(capacity: Int64)
}
此类基于 Array
init
public init()
功能:默认构造函数,默认的 capacity 是 32。
init
public init(capacity: Int64)
功能:使用传入的 capacity 初始化 ByteArrayStream。
参数:
- capacity:指定的初始容量
异常:
- IllegalArgumentException:当 capacity 小于 0 时,抛出异常
func seek
public func seek(sp: SeekPosition): Int64
功能:将光标跳转到指定位置,指定的位置不能位于流中数据头部之前,指定位置可以超过流中数据末尾。
参数:
- sp:指定光标跳转后的位置
返回值:返回流中数据头部到跳转后位置的偏移量(以字节为单位)
异常:
- IOException:指定的位置位于流中数据头部之前
prop length
public prop length: Int64
功能:返回当前流中的总数据量。
prop remainLength
public prop remainLength: Int64
功能:获取当前流中可读的数据量。
prop position
public prop position: Int64
功能:获取流当前光标位置。
func capacity
public func capacity(): Int64
功能:返回当前缓冲区总容量。
返回值:返回一个 Int64 类型的值
func isEmpty
public func isEmpty(): Bool
功能:返回当前 ByteArrayStream 中是否为空。
返回值:为空返回 true,否则返回 false
func clone
public func clone(): ByteArrayStream
功能:将当前 ByteArrayStream 中的数据拷贝一份,重新构造一个新的 ByteArrayStream。
返回值:拷贝的 ByteArrayStream
func clear
public func clear(): Unit
功能:清除掉当前 ByteArrayStream 中所有数据。
func bytes
public func bytes(): Array<Byte>
功能:返回当前 ByteArrayStream 中没有被读取的所有数据的切片。这个切片会在缓冲区进行读取,写入或重置等修改操作之后变的无效;同时,对切片的修改也会影响缓冲区的内容。
返回值:返回剩余数据的切片
func readToEnd
public func readToEnd(): Array<Byte>
功能:返回当前 ByteArrayStream 中没有被读取的所有数据。
返回值:返回剩余数据的拷贝
func copyTo
public func copyTo(output: OutputStream): Unit
功能:将当前 ByteArrayStream 中没有被读取的所有数据拷贝到 output 流中。
参数:
- output:将要拷贝到的流
func read
public func read(buffer: Array<Byte>): Int64
功能:从输入流中读取数据放到 buffer 中。如果没有数据可读,返回 0 。读取失败,则抛出异常。
参数:
- buffer:读取数据存放的缓冲区
返回值:读取成功,返回读取字节数
异常:
- IllegalArgumentException:当 buffer 为空时, 抛出异常
func write
public func write(buffer: Array<Byte>): Unit
功能:将 buffer 中的数据写入到输出流中,当数据全部成功写入则函数返回。
参数:
- buffer:待写入数据的缓冲区,若 buffer 为空则直接返回
异常:
- IllegalArgumentException:如果 buffer 写入失败或者只写入了部分数据,则抛出异常
func reserve
public func reserve(additional: Int64): Unit
功能:将缓冲区扩容 additional 大小,缓冲区剩余字节数量大于等于 additional 时不发生扩容,当缓冲区剩余字节数量小于 additional 时,取(additional + capacity)与(capacity的1.5倍向下取整)两个值中的最大值进行扩容。
参数:
- additional:将要扩容的大小
异常:
- IllegalArgumentException:当 additional 小于 0 时抛出异常
- OverflowException:当扩容后的缓冲区大小超过 Int64 的最大值时抛出异常
class BufferedInputStream
public class BufferedInputStream<T> <: InputStream where T <: InputStream {
public init(input: T)
public init(input: T, capacity: Int64)
}
此类用于为其他 InputStream 提供指定容量的缓冲区的功能。
init
public init(input: T)
功能:创建一个 BufferedInputStream 实例。
参数:
- input:绑定一个输入流
init
public init(input: T, capacity: Int64)
功能:创建一个 BufferedInputStream 实例。
参数:
- input:绑定一个输入流
- capacity:内部缓冲区容量
异常:
- IllegalArgumentException:当 capacity 小于等于 0 时,抛出异常
func read
public func read(buffer: Array<Byte>): Int64
功能:从绑定的输入流读出数据到 buffer 中。如果没有数据可读,返回 0 。读取失败,抛出异常。
参数:
- buffer:存放读取的数据的缓冲区
返回值:读取成功,返回读取字节数
异常:
- IllegalArgumentException:当 buffer 为空时, 抛出异常
func reset
public func reset(input: T): Unit
功能:绑定新的输入流,重置状态,但不重置 capacity。
参数:
- input:待绑定的输入流
extend BufferedInputStream <: Resource
extend BufferedInputStream<T> <: Resource where T <: Resource
此扩展主要用于实现 BufferedInputStream 的 Resource 接口。
func close
public func close(): Unit
功能:关闭当前流。调用此方法后不可再调用 BufferedInputStream 的其他接口,否则会造成不可期现象。
func isClosed
public func isClosed(): Bool
功能:判断当前流是否关闭。
返回值:如果当前流已经被关闭,返回 true,否则返回 false
extend BufferedInputStream <: Seekable
extend BufferedInputStream<T> <: Seekable where T <: Seekable
此扩展主要用于实现 BufferedInputStream 的 Seekable 接口。
func seek
public func seek(sp: SeekPosition): Int64
功能:将光标跳转到指定位置,指定的位置不能位于流中数据头部之前,指定位置可以超过流中数据末尾。调用该函数会先清空流的缓存区,再移动光标的位置。
参数:
- sp:指定光标跳转后的位置
返回值:返回流中数据头部到跳转后位置的偏移量(以字节为单位)
异常:
- IOException:指定的位置位于流中数据头部之前
prop length
public prop length: Int64
功能:返回当前流中的总数据量。
prop remainLength
public prop remainLength: Int64
功能:获取当前流中可读的数据量。
prop position
public prop position: Int64
功能:获取流当前光标位置。
class BufferedOutputStream
public class BufferedOutputStream<T> <: OutputStream where T <: OutputStream {
public init(output: T)
public init(output: T, capacity: Int64)
}
此类是用于为其他 OutputStream 提供指定容量的缓冲区的功能。
init
public init(output: T)
功能:创建一个 BufferedOutputStream 实例。
参数:
- output:绑定一个输出流
init
public init(output: T, capacity: Int64)
功能:创建一个 BufferedOutputStream 实例。
参数:
- output:绑定一个输出流
- capacity:内部缓冲区容量
异常:
- IllegalArgumentException:当 capacity 小于等于 0 时,抛出异常
func write
public func write(buffer: Array<Byte>): Unit
功能:将 buffer 中的数据写入到绑定的输出流中,当数据全部成功写入则函数返回,写入失败或者只写入了部分数据,则抛出异常。
参数:
- buffer:待写入数据的缓冲区,若 buffer 为空则直接返回
func flush
public func flush(): Unit
功能:刷新 BufferedOutputStream:将内部缓冲区的剩余数据写入绑定的输出流,并刷新绑定的输出流。
func reset
public func reset(output: T): Unit
功能:绑定新的输出流,重置状态,但不重置 capacity。
参数:
- output:待绑定的输出流
extend BufferedOutputStream <: Resource
extend BufferedOutputStream<T> <: Resource where T <: Resource
此扩展主要用于实现 BufferedOutputStream 的 Resource 接口。
func close
public func close(): Unit
功能:关闭当前流。调用此方法后不可再调用 BufferedOutputStream 的其他接口,否则会造成不可期现象。
func isClosed
public func isClosed(): Bool
功能:判断当前流是否关闭。
返回值:如果当前流已经被关闭,返回 true,否则返回 false
extend BufferedOutputStream <: Seekable
extend BufferedOutputStream<T> <: Seekable where T <: Seekable
此扩展主要用于实现 BufferedOutputStream 的 Seekable 接口。
func seek
public func seek(sp: SeekPosition): Int64
功能:将光标跳转到指定位置,指定的位置不能位于流中数据头部之前,指定位置可以超过流中数据末尾。调用该函数会先将缓存区内的数据写到绑定的输出流里,再移动光标的位置。
参数:
- sp:指定光标跳转后的位置
返回值:返回流中数据头部到跳转后位置的偏移量(以字节为单位)
异常:
- IOException:指定的位置位于流中数据头部之前
prop length
public prop length: Int64
功能:返回当前流中的总数据量。
prop remainLength
public prop remainLength: Int64
功能:获取当前流中可读的数据量。
prop position
public prop position: Int64
功能:获取流当前光标位置。
enum StringEncoding
public enum StringEncoding {
| UTF8
| UTF16
| UTF32
}
StringEncoding 枚举类型表示字符串的编码格式。
UTF8
UTF8
UTF16
UTF16
UTF32
UTF32
enum Endian
public enum Endian {
| Little
| Big
}
Endian 枚举类型表示字节序,只对 UTF16、UTF32 有效。
Little
Little
功能:构造一个 Endian 枚举实例,表示小端字节序。
Big
Big
功能:构造一个 Endian 枚举实例,表示大端字节序。
CURRENT_ENDIAN
public let CURRENT_ENDIAN: Endian = getCurrentEndian()
功能:获取运行时所在系统的字节序。
func getCurrentEndian
public func getCurrentEndian(): Endian
功能:获取运行时所在系统的字节序。
class StringReader
public class StringReader<T> where T <: InputStream {
public init(input: T, encoding!: StringEncoding = UTF8, endian!: Endian = CURRENT_ENDIAN)
}
提供从 InputStream 输入流中读出数据并转换成字符或字符串的功能
StringReader 内部默认有缓冲区,缓冲区容量 4096 个字节
StringReader 目前仅支持 UTF-8 编码,暂不支持 UTF-16、UTF-32
init
public init(input: T, encoding!: StringEncoding = UTF8, endian!: Endian = CURRENT_ENDIAN)
功能:创建一个 StringReader 实例。
参数:
- input:待读取数据的输入流
- encoding:指定 input 的编码格式,默认是 UTF-8 编码
- endian:指定 input 的字节序配置,默认使用运行时所在系统的 endian 配置
异常:
- IllegalArgumentException:当 encoding 传入 UTF16/UTF32 时抛出异常
func read
public func read(): ?Char
功能:按字符读,从流内读出单个字符流结束后再调用此函数,返回 Option
返回值:读取成功,返回 Option
异常:
- ContentFormatException:如果读取到不合法字符,则抛出异常
func readln
public func readln(): Option<String>
功能:按行读,从流内读出一行的字符串(尾部不含换行符)流结束后再调用此函数,返回 Option
返回值:读取成功,返回 Option
异常:
- ContentFormatException:如果读取到不合法字符,则抛出异常
func readToEnd
public func readToEnd(): String
功能:从流内读出所有剩余数据,以字符串形式返回。
返回值:返回读出的字符串
异常:
- ContentFormatException:如果读取到不合法字符,则抛出异常
func readUntil
public func readUntil(v: Char): Option<String>
功能:从流内读出到指定字符之前(包含指定字符)或者流结束位置之前的数据,以 Option
返回值:读取成功,返回 Option
异常:
- ContentFormatException:如果读取到不合法字符,则抛出异常
func readUntil
public func readUntil(predicate: (Char)->Bool): Option<String>
功能:从流内读出到使 predicate 返回 true 的字符位置之前(包含这个字符)或者流结束位置之前的数据,以 Option
返回值:读取成功,返回 Option
异常:
- ContentFormatException:如果读取到不合法字符,则抛出异常
extend StringReader <: Resource
extend StringReader<T> <: Resource where T <: Resource
此扩展主要用于实现 StringReader 的 Resource 接口。
func close
public func close(): Unit
功能:关闭当前流。调用此方法后不可再调用 StringReader 的其他接口,否则会造成不可期现象。
func isClosed
public func isClosed(): Bool
功能:判断当前流是否关闭。
返回值:如果当前流已经被关闭,返回 true,否则返回 false
extend StringReader <: Seekable
extend StringReader<T> <: Seekable where T <: Seekable
此扩展主要用于实现 StringReader 的 Seekable 接口。
func seek
public func seek(sp: SeekPosition): Int64
功能:将光标跳转到指定位置,指定的位置不能位于流中数据头部之前,指定位置可以超过流中数据末尾。
参数:
- sp:指定光标跳转后的位置
返回值:返回流中数据头部到跳转后位置的偏移量(以字节为单位)
异常:
- IOException:指定的位置位于流中数据头部之前
prop length
public prop length: Int64
功能:返回当前流中的总数据量。
prop remainLength
public prop remainLength: Int64
功能:获取当前流中可读的数据量。
prop position
public prop position: Int64
功能:获取流当前光标位置。
class StringWriter
public class StringWriter<T> where T <: OutputStream {
public init(output: T, encoding!: StringEncoding = UTF8, endian!: Endian = CURRENT_ENDIAN)
}
提供将 String 以及一些 ToString 类型转换成指定编码格式和字节序配置的字符串并写入到输出流的功能。
StringWriter 内部默认有缓冲区,缓冲区容量 4096 个字节。
StringWriter 目前仅支持 UTF-8 编码,暂不支持 UTF-16、UTF-32。
init
public init(output: T, encoding!: StringEncoding = UTF8, endian!: Endian = CURRENT_ENDIAN)
功能:创建一个 StringWriter 实例。
参数:
- output:待写入数据的输出流
- encoding:指定 output 编码格式,默认是 UTF-8 编码
- endian:指定 output 的字节序配置,默认使用运行时所在系统的 endian 配置
异常:
- IllegalArgumentException:当 encoding 传入 UTF16/UTF32 时抛出异常
func flush
public func flush(): Unit
功能:刷新内部缓冲区,将缓冲区数据写入 output 中,并刷新 output。
func write
public func write(v: String): Unit
功能:写入字符串。
参数:
- v:待写入的字符串
func write
public func write<T>(v: T): Unit where T <: ToString
功能:写入 ToString 类型。
参数:
- v:ToString 类型的实例
func write
public func write(v: Bool): Unit
功能:写入 Bool 类型。
参数:
- v:Bool 类型的实例
func write
public func write(v: Int8): Unit
功能:写入 Int8 类型。
参数:
- v:Int8 类型的实例
func write
public func write(v: Int16): Unit
功能:写入 Int16 类型。
参数:
- v:Int16 类型的实例
func write
public func write(v: Int32): Unit
功能:写入 Int32 类型。
参数:
- v:Int32 类型的实例
func write
public func write(v: Int64): Unit
功能:写入 Int64 类型。
参数:
- v:Int64 类型的实例
func write
public func write(v: UInt8): Unit
功能:写入 UInt8 类型。
参数:
- v:UInt8 类型的实例
func write
public func write(v: UInt16): Unit
功能:写入 UInt16 类型。
参数:
- v:UInt16 类型的实例
func write
public func write(v: UInt32): Unit
功能:写入 UInt32 类型。
参数:
- v:UInt32 类型的实例
func write
public func write(v: UInt64): Unit
功能:写入 UInt64 类型。
参数:
- v:UInt64 类型的实例
func write
public func write(v: Float16): Unit
功能:写入 Float16 类型。
参数:
- v:Float16 类型的实例
func write
public func write(v: Float32): Unit
功能:写入 Float32 类型。
参数:
- v:Float32 类型的实例
func write
public func write(v: Float64): Unit
功能:写入 Float64 类型。
参数:
- v:Float64 类型的实例
func write
public func write(v: Char): Unit
功能:写入 Char 类型。
参数:
- v:Char 类型的实例
func writeln
public func writeln(): Unit
功能:写入换行符。
func writeln
public func writeln(v: String): Unit
功能:写入字符串 + 换行符。
参数:
- v:待写入的字符串
func writeln
public func writeln<T>(v: T): Unit where T <: ToString
功能:写入 ToString 类型 + 换行符。
参数:
- v:ToString 类型的实例
func writeln
public func writeln(v: Bool): Unit
功能:写入 Bool 类型 + 换行符。
参数:
- v:Bool 类型的实例
func writeln
public func writeln(v: Int8): Unit
功能:写入 Int8 类型 + 换行符。
参数:
- v:Int8 类型的实例
func writeln
public func writeln(v: Int16): Unit
功能:写入 Int16 类型 + 换行符。
参数:
- v:Int16 类型的实例
func writeln
public func writeln(v: Int32): Unit
功能:写入 Int32 类型 + 换行符。
参数:
- v:Int32 类型的实例
func writeln
public func writeln(v: Int64): Unit
功能:写入 Int64 类型 + 换行符。
参数:
- v:Int64 类型的实例
func writeln
public func writeln(v: UInt8): Unit
功能:写入 UInt8 类型 + 换行符。
参数:
- v:UInt8 类型的实例
func writeln
public func writeln(v: UInt16): Unit
功能:写入 UInt16 类型 + 换行符。
参数:
- v:UInt16 类型的实例
func writeln
public func writeln(v: UInt32): Unit
功能:写入 UInt32 类型 + 换行符。
参数:
- v:UInt32 类型的实例
func writeln
public func writeln(v: UInt64): Unit
功能:写入 UInt64 类型 + 换行符。
参数:
- v:UInt64 类型的实例
func writeln
public func writeln(v: Float16): Unit
功能:写入 Float16 类型 + 换行符。
参数:
- v:Float16 类型的实例
func writeln
public func writeln(v: Float32): Unit
功能:写入 Float32 类型 + 换行符。
参数:
- v:Float32 类型的实例
func writeln
public func writeln(v: Float64): Unit
功能:写入 Float64 类型 + 换行符。
参数:
- v:Float64 类型的实例
func writeln
public func writeln(v: Char): Unit
功能:写入 Char 类型 + 换行符。
参数:
- v:Char 类型的实例
extend StringWriter <: Resource
extend StringWriter<T> <: Resource where T <: Resource
此扩展主要用于实现 StringWriter 的 Resource 接口。
func close
public func close(): Unit
功能:关闭当前流。调用此方法后不可再调用 StringWriter 的其他接口,否则会造成不可期现象。
func isClosed
public func isClosed(): Bool
功能:判断当前流是否关闭。
返回值:如果当前流已经被关闭,返回 true,否则返回 false
extend StringWriter <: Seekable
extend StringWriter<T> <: Seekable where T <: Seekable
此扩展主要用于实现 StringWriter 的 Seekable 接口。
func seek
public func seek(sp: SeekPosition): Int64
功能:将光标跳转到指定位置,指定的位置不能位于流中数据头部之前,指定位置可以超过流中数据末尾。
参数:
- sp:指定光标跳转后的位置
返回值:返回流中数据头部到跳转后位置的偏移量(以字节为单位)
异常:
- IOException:指定的位置位于流中数据头部之前
prop length
public prop length: Int64
功能:返回当前流中的总数据量。
prop remainLength
public prop remainLength: Int64
功能:获取当前流中可读的数据量。
prop position
public prop position: Int64
功能:获取流当前光标位置。
class ChainedInputStream
public class ChainedInputStream <: InputStream {
public init(input: Array<InputStream>)
}
此类提供了顺序从 InputStream 数组中读取数据的功能。
init
public init(input: Array<InputStream>)
功能:创建一个 ChainedInputStream 实例。
参数:
- input:绑定一个输入流数组
异常:
- IllegalArgumentException:当 input 为空时, 抛出异常
func read
public func read(buffer: Array<Byte>): Int64
功能:依次从绑定 InputStream 数组中读出数据到 buffer 中。若所有 InputStream 均已读完,则返回 0。
参数:
- buffer:存储读出数据的缓冲区
返回值:读取成功,返回读取字节数
异常:
- IllegalArgumentException:当 buffer 为空时, 抛出异常
class MultiOutputStream
public class MultiOutputStream <: OutputStream {
public init(output: Array<OutputStream>)
}
此类提供了将数据同时写入到 OutputStream 数组中每个输出流中的功能。
init
public init(output: Array<OutputStream>)
功能:创建一个 MultiOutputStream 实例。
参数:
- output:绑定一个输出流数组
异常:
- IllegalArgumentException:当 output 为空时,抛出异常
func write
public func write(buffer: Array<Byte>): Unit
功能:将 buffer 同时写入到绑定的 OutputStream 数组里的每个输出流中。
参数:
- buffer:存储待写入数据的缓冲区
func flush
public func flush(): Unit
功能:刷新绑定的输出流数组里的每个输出流。
func indexOf
public func indexOf(src: Array<Byte>, byte: Byte, start!: Int64 = 0): Option<Int64>
功能:查找字节 byte 在字节数组 src 中首次出现位置的下标。
参数:
- src:要查找的字节数组
- byte:待查找的字节
- start:从 src 数组 start 位置开始查找,默认为 0
返回值:若查找到,返回 Some(下标位置),否则返回 None
异常:
- IllegalArgumentException:当 start 小于 0 时, 抛出异常
func indexOf
public func indexOf(src: Array<Byte>, bytes: Array<Byte>, start!: Int64 = 0): Option<Int64>
功能:查找字节数组 bytes 在字节数组 src 中首次出现位置的下标。
参数:
- src:要查找的字节数组
- byte:待查找的字节数组,当 bytes 是空数组时,如果 start 大于 0,返回 None, 否则返回 Some(0)
- start:从 src 数组 start 位置开始查找,默认为 0,当 start 小于零正常返回,当 start 大于等于原数组长度时返回 Option
.None
返回值:若查找到,返回 Some(下标位置),否则返回 None
func trim
public func trim(src: Array<Byte>, trimBytes: Array<Byte>): Array<Byte>
功能:修剪 src 两侧的字节,如果 src 两侧的字节包含在 trimBytes 中就将其修剪掉,直到遇到第一个不包含在 trimBytes 中的字符。
参数:
- src:待修剪的数组
- byte:要修剪掉的字节的数组
返回值:修剪后的数组
示例
ByteArrayStream 示例
from std import io.*
main(): Unit {
let arr1 = b"test case"
let byteArrayStream = ByteArrayStream()
/* 将 arr1 中的数据写入到流中 */
byteArrayStream.write(arr1)
/* 读取 4 个字节的数据到 arr2 中 */
let arr2 = Array<Byte>(4, item: 0)
byteArrayStream.read(arr2)
println(String.fromUtf8(arr2))
/* 将流的索引指向起点 */
byteArrayStream.seek(Begin(0))
/* 读取流中全部数据 */
let arr3 = byteArrayStream.readToEnd()
println(String.fromUtf8(arr3))
}
运行结果如下:
test
test case
BufferedInputStream 示例
from std import io.*
main(): Unit {
let arr1 = b"0123456789"
let byteArrayStream = ByteArrayStream()
byteArrayStream.write(arr1)
let bufferedInputStream = BufferedInputStream(byteArrayStream)
let arr2 = Array<Byte>(20, item: 0)
/* 读取流中数据,返回读取到的数据的长度 */
let readLen = bufferedInputStream.read(arr2)
println(String.fromUtf8(arr2[..readLen]))
}
运行结果如下:
0123456789
BufferedOutputStream 示例
from std import io.*
main(): Unit {
let arr1 = b"01234"
let byteArrayStream = ByteArrayStream()
byteArrayStream.write(arr1)
let bufferedInputStream = BufferedOutputStream(byteArrayStream)
let arr2 = b"56789"
/* 向流中写入数据,此时数据在外部流的缓冲区中 */
bufferedInputStream.write(arr2)
/* 调用 flush 函数,真正将数据写入内部流中 */
bufferedInputStream.flush()
println(String.fromUtf8(byteArrayStream.readToEnd()))
}
运行结果如下:
0123456789
ChainedInputStream 示例
from std import io.*
from std import collection.ArrayList
main(): Unit {
const size = 2
/* 创建两个 ByteArrayStream 并写入数据 */
let streamArr = Array<InputStream>(size, {_ => ByteArrayStream()})
for (i in 0..size) {
match (streamArr[i]) {
case v: OutputStream =>
let str = "now ${i}"
v.write(str.toArray())
case _ => throw Exception()
}
}
/* 将两个 ByteArrayStream 绑定到 ChainedInputStream */
let chainedInputStream = ChainedInputStream(streamArr)
let res = ArrayList<Byte>()
let buffer = Array<Byte>(20, item: 0)
var readLen = chainedInputStream.read(buffer)
/* 循环读取 chainedInputStream 中数据 */
while (readLen != 0) {
res.appendAll(buffer[..readLen])
readLen = chainedInputStream.read(buffer)
}
println(String.fromUtf8(res.toArray()))
}
运行结果如下:
now 0now 1
MultiOutputStream 示例
from std import io.*
main(): Unit {
const size = 2
/* 将两个 ByteArrayStream 绑定到 MultiOutputStream */
let streamArr = Array<OutputStream>(size, {_ => ByteArrayStream()})
let multiOutputStream = MultiOutputStream(streamArr)
/* 往 MultiOutputStream 写入数据,会同时写入绑定的两个 ByteArrayStream */
multiOutputStream.write(b"test")
/* 读取 ByteArrayStream 中数据,验证结果 */
for (i in 0..size) {
match (streamArr[i]) {
case v: ByteArrayStream =>
println(String.fromUtf8(v.readToEnd()))
case _ => throw Exception()
}
}
}
运行结果如下:
test
test
StringReader 示例
from std import io.*
main(): Unit {
let arr1 = b"012\n346789"
let byteArrayStream = ByteArrayStream()
byteArrayStream.write(arr1)
let stringReader = StringReader(byteArrayStream)
/* 读取一个字节 */
let ch = stringReader.read()
println(ch ?? 'a')
/* 读取一行数据 */
let line = stringReader.readln()
println(line ?? "error")
/* 读取数据直到遇到字符6 */
let until = stringReader.readUntil('6')
println(until ?? "error")
/* 读取全部数据 */
let all = stringReader.readToEnd()
println(all)
}
运行结果如下:
0
12
346
789
StringWriter 示例
from std import io.*
main(): Unit {
let byteArrayStream = ByteArrayStream()
let stringWriter = StringWriter(byteArrayStream)
/* 写入字符串 */
stringWriter.write("number")
/* 写入字符串并自动转行 */
stringWriter.writeln(" is:")
/* 写入数字 */
stringWriter.write(100.0f32)
stringWriter.flush()
println(String.fromUtf8(byteArrayStream.readToEnd()))
}
运行结果如下:
number is:
100.000000