【问题标题】:The easiest way to write NSData to a file将 NSData 写入文件的最简单方法
【发布时间】:2010-10-15 07:30:38
【问题描述】:
NSData *data;
data = [self fillInSomeStrangeBytes];

我现在的问题是如何以最简单的方式将data 写入文件。

(我已经有一个 NSURL file://localhost/Users/Coding/Library/Application%20Support/App/file.strangebytes

【问题讨论】:

    标签: file cocoa file-io save


    【解决方案1】:

    NSData 有一个名为writeToURL:atomically: 的方法,它完全可以满足您的需求。查看the documentation for NSData 了解如何使用它。

    【讨论】:

    • NSData 对象的来源对于此方法是否重要? In this question 我正在保存从 URL 下载到 NSData 对象中的 .sqlite 数据库,但它似乎没有正确保存它。该文件已写入,但是当我尝试访问它(通过我的应用程序或使用 3rd 方查看器)时,它告诉我它不是有效的 SQLite 数据库。 writeToURL:atomically: 是否仅适用于保存 NSStrings 或类似的东西?
    • NSData 是任何类型的二进制数据的包装器。原始来源应该无关紧要。看看你的问题,我建议使用NSURLConnection(或像AFNetworking 这样的库)而不是initWithContentsOfURL:。对于小型下载,NSData 可以,但它不提供对下载的任何控制。当出现问题时,很难诊断问题。
    【解决方案2】:

    writeToURL:atomically:writeToFile:atomically: 如果您有文件名而不是 URL。

    【讨论】:

    • +1 用于 NSURL。当你指向一个文件时,NSURL pwns NSString。 Apple 始终建议使用 NSURL 作为文件路径而不是 NSString。 :)
    • 我认为 writeToURL 和 writeToFile 之间没有区别。根据文档:“由于目前仅支持 file:// URL,因此此方法与 writeToFile:atomically: 没有区别,除了第一个参数的类型”
    • NSData 对象的来源对于此方法是否重要? In this question 我正在保存一个从 URL 下载到 NSData 对象中的 .sqlite 数据库,但它似乎没有正确保存它。该文件已写入,但是当我尝试访问它(通过我的应用程序或使用 3rd 方查看器)时,它告诉我它不是有效的 SQLite 数据库。 writeToURL:atomically: 是否仅适用于保存 NSStrings 或类似的东西?
    【解决方案3】:

    请注意,将NSData 写入文件是一个可能阻塞主线程的 IO 操作。特别是在数据对象很大的情况下。

    因此建议在后台线程上执行此操作,最简单的方法是使用 GCD,如下所示:

    // Use GCD's background queue
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        // Generate the file path
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"yourfilename.dat"];
    
         // Save it into file system
        [data writeToFile:dataPath atomically:YES];
    });
    

    【讨论】:

    【解决方案4】:

    您还有writeToFile:options:error:writeToURL:options:error: 可以报告错误代码,以防NSData 的保存因任何原因失败。例如:

    NSError *error;
    
    NSURL *folder = [[NSFileManager defaultManager] URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:true error:&error];
    if (!folder) {
        NSLog(@"%s: %@", __FUNCTION__, error);        // handle error however you would like
        return;
    }
    
    NSURL *fileURL = [folder URLByAppendingPathComponent:filename];
    BOOL success = [data writeToURL:fileURL options:NSDataWritingAtomic error:&error];
    if (!success) {
        NSLog(@"%s: %@", __FUNCTION__, error);        // handle error however you would like
        return;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2016-01-22
      • 1970-01-01
      相关资源
      最近更新 更多