将 InputStream 读入 Data 对象
Reading an InputStream into a Data object
在Swift3.x中,我们通常使用Data
处理二进制数据;您可以从中生成大多数其他重要类型,并且上面有一些有用的函数。
但是如何从 InputStream
创建 Data
?有什么好的方法吗?
我找不到好的方法。我们可以围绕不安全的东西创建一个漂亮的包装器:
extension Data {
init(reading input: InputStream) throws {
self.init()
input.open()
defer {
input.close()
}
let bufferSize = 1024
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
defer {
buffer.deallocate()
}
while input.hasBytesAvailable {
let read = input.read(buffer, maxLength: bufferSize)
if read < 0 {
//Stream error occured
throw input.streamError!
} else if read == 0 {
//EOF
break
}
self.append(buffer, count: read)
}
}
}
这是针对 Swift 5. 查找带有测试的完整代码(以及只读取部分流的变体)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()
}
}
在Swift3.x中,我们通常使用Data
处理二进制数据;您可以从中生成大多数其他重要类型,并且上面有一些有用的函数。
但是如何从 InputStream
创建 Data
?有什么好的方法吗?
我找不到好的方法。我们可以围绕不安全的东西创建一个漂亮的包装器:
extension Data {
init(reading input: InputStream) throws {
self.init()
input.open()
defer {
input.close()
}
let bufferSize = 1024
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufferSize)
defer {
buffer.deallocate()
}
while input.hasBytesAvailable {
let read = input.read(buffer, maxLength: bufferSize)
if read < 0 {
//Stream error occured
throw input.streamError!
} else if read == 0 {
//EOF
break
}
self.append(buffer, count: read)
}
}
}
这是针对 Swift 5. 查找带有测试的完整代码(以及只读取部分流的变体)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()
}
}