如何在 Swift 中从文件(而不是整个文件)读取数据块

vol*_*vol 7 swift

假设我有一个 8 字节长的文件,仅包含 ASCII 字符:brownfox

我不想加载 2 字节的块并对 2[UInt8]字节大小的块进行操作,而不是加载整个文件并处理 if,因此操作如下:

  1. 从文件加载br(而不是整个文件)
  2. 对数据执行任何操作,例如反转rb
  3. 将输出保存到另一个文件
  4. 重复:ow nf ox

背后的原因:这样,如果我处理一个 1GB 文本的文件,我实际上不必有 1GB 的可用 RAM(或 2GB 用于输入和输出文件)。

这种文件处理方法对我来说对于加密和发送到云解决方案很重要。

我正在使用这个扩展:

extension Data {
    /**
     Consumes the specified input stream, creating a new Data object
     with its content.
     - Parameter reading: The input stream to read data from.
     - Note: Closes the specified stream.
     */
    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()

        input.close()
    }

    /**
     Consumes the specified input stream for up to `byteCount` bytes,
     creating a new Data object with its content.
     - Parameter reading: The input stream to read data from.
     - Parameter byteCount: The maximum number of bytes to read from `reading`.
     - Note: Does _not_ close the specified stream.
     */
    init(reading input: InputStream, for byteCount: Int) {
        self.init()
        input.open()

        let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: byteCount)
        let read = input.read(buffer, maxLength: byteCount)
        self.append(buffer, count: read)
        buffer.deallocate()
    }
}
Run Code Online (Sandbox Code Playgroud)

init(reading input: InputStream, for byteCount: Int)总是从第一个字节开始。例如,我如何读取第 16 个字节到第 20 个字节?

有关的文档InputStream.read(_:maxLength:)

从当前读取索引中,从流中获取第二个参数中指定的字节数,并将它们放入客户端提供的缓冲区(第一个参数)中。缓冲区的大小必须由第二个参数指定。返回实际放入缓冲区的字节数;如果流中没有任何内容,则返回 0。将索引重置到流中以进行下一次读取操作。

我该怎么做才能重置索引,并从上一个操作结束的地方获取下一个操作?

rma*_*ddy 7

使用FileHandle。您可以打开文件句柄进行读取。然后用于seek(toFileOffset:)设置您希望从何处读取。然后用readData(ofLength:)得到一些Data。完成后请务必关闭文件句柄。