3
在Swift 3.x中,我們通常使用Data
來處理二進制數據;從它你可以產生大多數其他重要的類型,並有它的有用的功能。如何從InputStream
創建Data
?有沒有一種好方法?將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