以1024字节为块读取二进制数据的大文件

问题描述 投票:1回答:1

我正在尝试以1024字节的块读取MP4文件。我编写的代码几乎可以正常工作。我正在执行以下操作:

let audioFilePath = Bundle.main.path(forResource: "video", ofType: "mp4")!
var chunks = [[UInt8]]()

  if let stream: InputStream = InputStream(fileAtPath: audioFilePath) {
    var buf: [UInt8] = [UInt8](repeating: 0, count: 1024)
    stream.open()
    while stream.hasBytesAvailable {
      stream.read(&buf, maxLength: 1024)
      chunks.append(buf)
    }
    stream.close()
  }

print(chunks.count)

上面代码的问题是,我正在读取大小为15.948.514字节的MP4文件。这意味着它应该精确地在15.574个块中完成(最后一个块可能少于1024个,但这不是问题),但是代码将打印出15.576个块,并且所有块的大小均为1024。上面的代码有什么问题? ?

swift file-io binaryfiles
1个回答
1
投票
如果必须尝试读取以确定字节的可用性,

hasBytesAvailable也可以返回hasBytesAvailable。这就是您遇到的情况:最终读取返回的“文件结尾”为零。

true对于TCP套接字之类的输入流很有用,以避免阻塞hasBytesAvailable,但从文件中读取并不是真正需要的。在任何情况下,您都必须检查read()的返回值,该值可以为零(文件末尾)或read()(读取错误)或读入缓冲区的实际字节数(可以小于以下值)。要求的字节)。

也请注意,即使缓冲区仅部分填充了输入流中的字节,也总是将具有1024个字节的块附加到-1数组中。

chunks
© www.soinside.com 2019 - 2024. All rights reserved.