在Objective-C中处理大型文本文件的合适方法是什么?假设我需要单独阅读每一行,并希望将每一行视为一个字符串.最有效的方法是什么?

一种解决方案是使用NSString方法:

+ (id)stringWithContentsOfFile:(NSString *)path 
      encoding:(NSStringEncoding)enc 
      error:(NSError **)error 

然后用换行符拆分行,然后迭代数组中的元素.然而,这似乎相当低效.难道没有简单的方法将文件视为一个流,在每一行上枚举,而不是一次全部读取吗?有点像Java的Java.伊奥.BufferedReader.

推荐答案

这是个好问题.我认为@Diederik有一个很好的答案,尽管不幸的是可可没有一个机制来精确地描述你想要做什么.

NSInputStream允许您读取N字节的块(非常类似于java.io.BufferedReader),但您必须自己将其转换为NSString,然后扫描换行符(或任何其他分隔符),并保存所有剩余字符以供下次读取,或者如果尚未读取换行符,则读取更多字符.(NSFileHandle可以读取NSData,然后可以将其转换为NSString,但基本上是相同的过程.)

苹果有一个Stream Programming Guide可以帮助你填写细节,如果你要处理uint8_t*个缓冲区,this SO question也可能会有帮助.

如果你要经常阅读这样的字符串(尤其是在程序的不同部分),最好将这种行为封装在一个可以为你处理细节的类中,甚至可以将NSInputStream子类化(它是designed to be subclassed)并添加方法,让你能够准确地阅读你想要的内容.

作为记录,我认为这将是一个很好的功能添加,我将提交一个增强请求,以使这成为可能.:-)


Edit:证明这个请求已经存在.有一个雷达可以追溯到2006年(rdar://4742914苹果内部人士).

Objective-c相关问答推荐

UITableViewCell:如何防止蓝色 Select ​​背景不带 isSelected 属性?

iOS - 如何预加载键盘?

OCUnit 的单元测试示例

让 NSRunLoop 等待设置标志的最佳方法?

#if 和 #ifdef Objective-C 预处理器宏有什么区别?

indexOfObject 对比indexOfObjectIdenticalTo

声明变量id和NSObject *有什么区别?

调用了dismissViewControllerAnimated,但没有解除ViewController

右对齐的 UITextField 空格键在 iOS 7 中不前进光标

指向方法返回类型的Expected a type错误

避免NSArray 在被枚举时发生Mutations

判断用户是否在连续的 UISlider 上完成滑动?

Xcode 在 iOS 8 中的 Main() 中引发异常,并带有所有异常断点

从 NSMutableString 中删除最后一个字符

主队列上的 performSelectorOnMainThread: 和 dispatch_async() 有什么区别?

如何减小使用 UIImagePickerController 创建的视频的文件大小?

Objective-c 协议前向声明

可以在 NSLocalizedString 中使用变量和/或参数吗?

如何在 Cocoa 中获取当前日期

判断核心数据中是否存在对象的最快方法?