【发布时间】:2019-09-16 22:59:11
【问题描述】:
假设我有一个仅包含 ASCII 字符的 8 字节长的文件:brownfox。
我不想加载整个文件并处理 if,我不想加载 2 字节的块 [UInt8] 并对 2 字节大小的块进行操作,因此操作如下:
- 从文件加载
br(不是整个文件) - 对数据执行任何操作,例如反向到
rb - 将输出保存到另一个文件
- 重复:
ownfox
这背后的原因: 这样,如果我处理 1GB 的文本文件,我实际上不必有 1GB 的可用 RAM(或 2GB 用于输入和输出文件)。
这种文件处理方法对于加密和发送到云解决方案对我来说很重要。
我正在使用这个扩展:
extension Data {
/**
Consumes the specified input stream, creating a new Data object
with its content.
- Parameter reading: The input stream to read data from.
- Note: Closes the specified stream.
*/
init(reading input: InputStream) {
self.init()
input.open()
let bufferSize = 1024
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
while input.hasBytesAvailable {
let read = input.read(buffer, maxLength: bufferSize)
self.append(buffer, count: read)
}
buffer.deallocate()
input.close()
}
/**
Consumes the specified input stream for up to `byteCount` bytes,
creating a new Data object with its content.
- Parameter reading: The input stream to read data from.
- Parameter byteCount: The maximum number of bytes to read from `reading`.
- Note: Does _not_ close the specified stream.
*/
init(reading input: InputStream, for byteCount: Int) {
self.init()
input.open()
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: byteCount)
let read = input.read(buffer, maxLength: byteCount)
self.append(buffer, count: read)
buffer.deallocate()
}
}
但是init(reading input: InputStream, for byteCount: Int) 总是从第一个字节开始。例如,如何从第 16 个字节读取到第 20 个字节?
InputStream.read(_:maxLength:) 上的文档
从当前读取索引,最多占用指定的字节数 在流的第二个参数中并将它们放在 客户端提供的缓冲区(第一个参数)。缓冲区必须是 大小由第二个参数指定。返回实际数量 放置在缓冲区中的字节;如果流中没有任何东西, 返回 0。将索引重置到流中以进行下一次读取操作。
我该怎么做才能不重置索引,并从上一个结束的地方获取下一个操作?
【问题讨论】:
标签: swift