流读取器

一个简单的 Swift 流读取协议,名为 StreamReader,具有两个具体的实现:GenericStreamReaderDataReader

GenericStreamReader 可以从任何 GenericReadStream 读取数据,而 FileDescriptor(来自 SystemPackage)、FileHandleIntputStream 类已被设置为符合该协议。

使用示例

读取流到末尾

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

待办事项

使读取异步? 这会改变很多东西,但项目的核心应该保持不变。

或者也许只是线程安全,我不知道。