在Swift 3.x中,我们通常使用Data
处理二进制数据;从中你可以生成大多数其他重要类型,并且它上面有很多有用的功能。
但如何从Data
创建InputStream
?有一个很好的方式吗?
答案 0 :(得分:10)
我找不到一个好方法。我们可以围绕不安全的东西创建一个很好的包装器:
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()
input.close()
}
}
这适用于Swift 5.查找带有test的完整代码(以及只读取部分流的变体)here。
答案 1 :(得分:0)
在代码之上,它可以是无限循环。 当我将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()
}
}