【问题标题】:Subclassing NSInputStream to upload a particular portion of data from a local filepath子类化 NSInputStream 以从本地文件路径上传特定部分的数据
【发布时间】:2013-05-03 12:34:12
【问题描述】:

我在一个文件中有 100 MB 的数据。这 100 mb 的数据将被虚拟分割。即,我需要创建一个指向不同 5MB 块的 NSInputStream。 这可以通过使用 NSData 创建流来实现。

但我想知道我是否可以有一个指向文件中数据范围的 NSInputStream ?

【问题讨论】:

  • 为什么不改用NSFileHandle
  • 基本上我不想创建几个 5MB 大小的 NSData 实例。它会占用大量内存。
  • 你应该在某个串行队列中一次创建 5MB 的一部分
  • 你不应该这样做。创建一个NSFileHandle 并通过执行seekToFileOffset: 在任何偏移处读取适当的字节。
  • 这里将从我的 iOS 应用程序上传一个很长的文件。我同时上传同一文件的不同部分。也可以有几个文件上传。如果我使用文件句柄创建数据,则此上传将需要大约 30MB,这是我不想要的。这就是为什么我想使用 NSInputStream。但是使用 NSInputStream 我无法偏移读取缓冲区。或者唯一的解决方案是将每个 5MB 数据写入一个文件并从该文件创建一个 InputStream ??

标签: ios objective-c nsstream nsinputstream cfreadstream


【解决方案1】:

如果您想通过将NSInputStream 实例传递给NSURLRequest.HTTPBodyStream 来上传文件,您确实必须创建NSInputStream 的子类并且只流式传输您要上传的字节。此处不能使用NSFileHandle

创建与NSURLRequest 一起使用的NSInputStream 的子类非常棘手,但幸运的是,这里有一个great blog post 说明如何实现它。

Here you can find a ready to use subclass of NSInputStream for this purpose.

您可以将ChunkInputStream 与另一个NSInputStream 一起读取文件并传递开始位置和要读取的字节数。

Swift 示例:

let fileInputStream = NSInputStream(fileAtPath: "/tmp/readme")
let inputStream = ChunkInputStream(inputStream: fileInputStream)
inputStream.startPosition = 2097152
inputStream.readMax = 1048576

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 2014-09-22
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多