一个简单的 Swift 流读取协议,名为 StreamReader
,具有两个具体的实现:GenericStreamReader
和 DataReader
。
GenericStreamReader
可以从任何 GenericReadStream
读取数据,而 FileDescriptor
(来自 SystemPackage)、FileHandle
和 IntputStream
类已被设置为符合该协议。
let data = ...
let reader = DataReader(data: data)
let readData = try reader.readDataToEnd()
assert(readData == data)
let inputStream = ...
let reader = InputStreamReader(stream: inputStream, bufferSize: 1024, bufferSizeIncrement: 512)
/* Read the stream until a newline (whether macOS or Classic MacOS) is found, and returns the data without the newline. */
let (line, separator) = try reader.readData(upTo: [Data("\n".utf8), Data("\r".utf8)], matchingMode: .anyMatchWins, failIfNotFound: false, includeDelimiter: false)
_ = try reader.readData(size: separator.count) /* We must read the line separator before next read, probably :) */
注意:在上面的示例中,如果文件具有 Windows 换行符,这将在每行之后添加一个空的新行(Windows 的分隔符为 \r\n
)。
流读取器还具有一个专用的方法来读取流中的一行
/* Does not return the line separator, _but_ set stream position after the line separator. */
let lineData = try reader.readLine(allowUnixNewLines: true, allowLegacyMacOSNewLines: true, allowWindowsNewLines: true).line