将InputStream读入Data对象

问题描述 投票:4回答:2

在Swift 3.x中,我们通常使用Data处理二进制数据;从中你可以生成大多数其他重要类型,并且它上面有很多有用的功能。

但是如何从Data创建InputStream?有一个很好的方式吗?

swift stream inputstream binary-data
2个回答
11
投票

我找不到一个好方法。我们可以围绕不安全的东西创建一个很好的包装器:

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


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()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.