2017-03-02 68 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