将InputStream读入数据对象
问题描述:
在Swift 3.x中,我们通常使用Data
来处理二进制数据;从它你可以产生大多数其他重要的类型,并有它的有用的功能。如何从InputStream
创建Data
?有没有一种好方法?将InputStream读入数据对象
答
我找不到一个好方法。我们可以围绕着不安全的东西创建一个漂亮的十岁上下的包装:
extension Data {
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(capacity: bufferSize)
input.close()
}
}
找到完整的代码与测试here。
答
上面的代码,它可以是无限循环。 当我将httpbodyInpustream转换为数据时,它会发生。 所以我添加一个条件。
extension Data {
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)
if (read == 0) {
break // added
}
self.append(buffer, count: read)
}
buffer.deallocate(capacity: bufferSize)
input.close()
}
}
声音就像那个流被打破; 'hasBytesAvailable'应该返回'false',不是吗?不知道'hasBytesAvailable == true'的语义是什么,但'read == 0'是什么;听起来像是一个错误的场景给我。 – Raphael
@Raphael InputStream.read(_ buffer:UnsafeMutablePointer,maxLength len:Int) - >如果发生错误,则返回值为'-1',如果没有更多值要读取则返回'0',if>还有剩余的字节需要读取。 –
Andreas