将 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()
    }
}