2017-03-02 65 views
3

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

回答

6

我找不到一個好方法。我們可以圍繞着不安全的東西創建一個漂亮的十歲上下的包裝:

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

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() 
    } 
} 
+0

聲音就像那個流被打破; 'hasBytesAvailable'應該返回'false',不是嗎?不知道'hasBytesAvailable == true'的語義是什麼,但'read == 0'是什麼;聽起來像是一個錯誤的場景給我。 – Raphael

+0

@Raphael InputStream.read(_ buffer:UnsafeMutablePointer ,maxLength len:Int) - >如果發生錯誤,則返回值爲'-1',如果沒有更多值要讀取則返回'0',if>還有剩餘的字節需要讀取。 – Andreas