【IOS 开发学习总结-OC-33】★★objective-c之文件 I/O概述+NSData/NSMutableData

来源:互联网 发布:淘宝小二删除中差评 编辑:程序博客网 时间:2024/05/17 05:52

I/O是指 objective-c 的输入与输出。通过I/O,应用程序可以把程序运行状态 保存到磁盘文件或网络中——这样可保证这程序从这些文件或网络上恢复程序的运行状态。
objective-c 提供了丰富的 I/O 相关的 API:
1. NSFileManager:如果,只需要管理文件和目录,程序可使用NSFileManager 进行管理,包括创建,删除,移动,复制文件等;
2. NSFileHandle: 如果程序需要读取文件内容,则可通过NSFileHandle进行处理;;
3. NSURL:如果要读取网络资源,则可以通过 NSURL 进行处理;
4. NSBundle:如果只是读取项目内部的资源,则可 借助 NSBundle 进行处理。

使用NSData 与NSMutableData

foundation提供了NSData 与NSMutableData,它们代表 objective-c 的数据缓冲区
NSData和NSMutableData存储的是二进制数据,在文件操作,网络,以及核心图形图像中使用较广泛。NSData创建后不可以再修改,NSMutableData可以再次修改。

NSData的作用

  1. 对数据读取 NSData;
  2. 输出 NSData 的数据。

NSData 的创建与使用

NSData 的创建

同样有2种方法:类方法(以 data 开头),实例方法(以 init 开头)。
这些方法有:
1. data: 创建一个不含任何数据的,空的 NSData 对象。
2. dataWithBytes: length:/initWithBytes: length: 复制C数组所包含的数据来初始化 NSData 的数据。
3. initWithBytesNoCopy:<#(nonnull void *)#> length:<#(NSUInteger)#>dataWithBytesNoCopy:<#(nonnull void *)#> length:<#(NSUInteger)#>:直接利用C 数组包含的数据来初始化 NSData 对象,当该对象被执行malloc 方法销毁自己时,程序会释放该 C 数组。
4. dataWithBytesNoCopy:<#(nonnull void *)#> length:<#(NSUInteger)#> freeWhenDone:<#(BOOL)#>initWithBytesNoCopy:<#(nonnull void *)#> length:<#(NSUInteger)#> freeWhenDone:<#(BOOL)#> :直接利用C 数组包含的数据来初始化 NSData 对象,只有当最后一个参数为 YES,且当该对象被执行malloc 方法销毁自己时,程序会释放该 C 数组。
5. initWithContentsOfFile::dataWithContentsOfFile::直接读取文件内容,并利用文本内容来初始化 NSData.
6. dataWithData:<#(nonnull NSData *)#initWithData:<#(nonnull NSData *)#>:直接用另一个 NSData 所 包含的数据来初始化新创建的 NSData。

NSData 的使用

得到NSData对象后,可以调用以下方法来访问NSData所包含的数据。
1. bytes: 返回该 NSData 所包含的数据;
2. getBytes:<#(nonnull void *)#> length:<#(NSUInteger)#>获取 NSData 指定长度的数据;
3. getBytes:<#(nonnull void *)#> range:<#(NSRange)#>:获取 NSData 指定范围的数据;
4. subdataWithRange:<#(NSRange)#>:获取 NSData 所包含的指定范围的数据组成的 NSData 对象。
5. writeToFile:<#(nonnull NSString *)#> atomically:<#(BOOL)#>:将 NSData 数据写入文件。
6. writeToURL:<#(nonnull NSURL *)#> atomically:<#(BOOL)#>:将NSData 数据写入指定 url对应的资源。

示例代码:

#import <Foundation/Foundation.h>int main(int argc , char * argv[]){    @autoreleasepool{        // 使用NSData读取指定URL对应的数据        NSData* data = [NSData dataWithContentsOfURL:            [NSURL URLWithString:@"http://www.sogou.com"]];        NSLog(@"%ld" , [data length]);        // 定义一个长度为100的数组        char buffer[100];        // 将NSData指定范围的数据读入数组        [data getBytes:buffer range: NSMakeRange(103, 100)];        // 输出数组的内容        NSLog(@"%s" , buffer);        // 直接将NSData的数据用UTF-8的格式转换字符串        NSString* content = [[NSString alloc] initWithData:data             encoding:NSUTF8StringEncoding];        NSLog(@"----------输出网页内容---------");        NSLog(@"%@" , content);    }}

运行结果:

2015-10-06 16:06:22.612 1005[792:7991] 7412015-10-06 16:06:22.613 1005[792:7991] t>eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(ˇ2015-10-06 16:06:22.613 1005[792:7991] ----------输出网页内容---------2015-10-06 16:06:22.614 1005[792:7991] <!DOCTYPE html><html><head><title>搜狗搜索引擎 - 上网从搜狗开始</title></head><body><script>eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(h(){j t=9 c();t.d(t.5()-6*k*l*1*1*8);4.a="i[g]=0;b=.2.3;e=/;f="+t.7();t=9 c();t.d(t.5()+6*1*8);4.a="m=0;b=.2.3;e=/;f="+t.7();n.o.p("q://r.2.3/s.u")})();',31,31,'|60|sogou|com|document|getTime|10|toGMTString|1000|new|cookie|domain|Date|setTime|path|expires|360|function|qh|var|365|24|ATPASS|top|location|replace|http|www|index||htm'.split('|'),0,{}))</script></body></html>

注意

新版本中的 Xcode7中,编译运行时会出现这样的提示:
App transport security has blocked a exceptions can be configured via your app's info.plist file.
这是因为在iOS9 中,苹果将原http协议改成了https协议,使用 TLS1.2 SSL加密请求数据。
解决方法在其他博文中有讲解。请移步:《【ios编程报错处理-1】错误提示:App transport security has blocked a exceptions can be configured via your app’s 》

在 总结学习的过程中,发现luobo140716的专栏中关于NSData 的总结是很好的补充,在此也分享给小伙伴们参考学习。

luobo140716的博文:NSData全部API学习。

0 0
原创粉丝点击