Swift line-by-line file reader with FileHandle
Swift
import Foundation
func forEachLine(at url: URL, _ body: (String) throws -> Void) throws {
let handle = try FileHandle(forReadingFrom: url)
defer { try? handle.close() }
var buffer = Data()
while let chunk = try handle.read(upToCount: 8192), !chunk.isEmpty {
buffer.append(chunk)
while let newline = buffer.firstIndex(of: 0x0A) {
let line = String(decoding: buffer[..<newline], as: UTF8.self)
try body(line)
buffer.removeSubrange(buffer.startIndex..<(newline + 1))
}
}
if !buffer.isEmpty {
try body(String(decoding: buffer, as: UTF8.self))
}
}