面试题答案
一键面试实现思路
- 分块读取和写入:由于数据集非常大,一次性加载到内存可能导致内存不足。因此,将数据分块处理,每次读取一部分数据并写入文件。
- 使用
FileHandle
:FileHandle
提供了更底层的文件操作,相比于write(to:atomically:encoding:)
方法,它可以更灵活地控制写入过程,并且在处理大数据时更高效。 - 错误处理:在写入文件的过程中,可能会遇到各种错误,如文件权限问题、磁盘空间不足等。需要使用
do-catch
块来捕获并处理这些错误。
核心代码示例
func writeLargeDataSet(_ dataSet: [String], to filePath: String) {
let bufferSize = 1024 * 1024 // 1MB 缓冲区大小
let fileManager = FileManager.default
do {
try fileManager.createFile(atPath: filePath, contents: nil)
guard let fileHandle = FileHandle(forWritingAtPath: filePath) else {
throw NSError(domain: "FileHandleError", code: -1, userInfo: nil)
}
defer {
fileHandle.closeFile()
}
var offset = 0
while offset < dataSet.count {
let endIndex = min(offset + bufferSize, dataSet.count)
let subDataSet = dataSet[offset..<endIndex]
let dataToWrite = subDataSet.joined(separator: "\n").data(using: .utf8)
guard let data = dataToWrite else {
throw NSError(domain: "DataEncodingError", code: -1, userInfo: nil)
}
fileHandle.write(data)
offset = endIndex
}
} catch {
print("写入文件时出错: \(error)")
}
}
错误处理
- 文件创建错误:使用
try fileManager.createFile(atPath:contents:nil)
创建文件时,如果文件创建失败,会抛出错误,在catch
块中捕获并处理。 - 文件句柄获取错误:
FileHandle(forWritingAtPath:)
如果无法获取文件句柄,返回nil
,这里手动抛出一个错误并在catch
块中处理。 - 数据编码错误:将字符串数组转换为
Data
时,如果编码失败,data(using: .utf8)
返回nil
,手动抛出错误并在catch
块中处理。
在实际应用中,可以根据具体的错误类型进行更详细的处理,例如记录日志、提示用户等。