OC提供了丰富的I/O相关API,如果只是管理文件和目录,程序可以使用NSFileManager进行管理,包括创建、删除、移动和复制文件等;如果程序需要读取文件内容,则可通过NSFileHandle进行处理;如果需要读取网络资源,则可通过NSURL进行处理;如果程序只是读取项目内部资源,则可借助MSBundle进行处理。

1、Foundation提供了NSData和NSMutableData,他们代表OC的数据缓冲区。NSData的作用有两个:将数据读入NSData;输出NSData的数据。

 #import <Foundation/Foundation.h>

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

NSData示例

2、使用NSFileManager管理文件和目录

  • 相对路径:不以斜线开头的路径都是相对路径。相对路径都是以当前路径下为基础路径,随着当前路径的不同,同一个相对路径实际代表的文件可能发生变化,在终端窗口输入pwd可以看到当前路径。
  • 绝对路径:以斜线(代表根目录)开头的路径都是绝对路径。绝对路径是唯一的,它代表的文件或目录总是固定的。

  此外,Mac OS X中还包括几个特殊的路径:

  • ~:代表当前用户的home目录,eg:当前用户是"keli",则~代表的/Users/keli
  • .:代表当前目录
  • ..:代表当前目录的上一级目录

  NSFileManager可以访问文件的属性和内容,具体相关方法查询 NSFileManager文档

 #import <Foundation/Foundation.h>

 int main(int argc , char * argv[])
{
@autoreleasepool{
NSFileManager* fm = [NSFileManager defaultManager];
// 将会输出代表真的1
NSLog(@"NSFileManagerTest.m是否存在:%d",
[fm fileExistsAtPath:@"NSFileManagerTest.m"]);
BOOL isDir;
NSLog(@"NSFileManagerTest.m是否存在:%d",
[fm fileExistsAtPath:@"NSFileManagerTest.m"
isDirectory: &isDir]);
// 将会输出代表假的0
NSLog(@"NSFileManagerTest.m是否为目录:%d", isDir);
// 将会输出代表真的1
NSLog(@"NSFileManagerTest.m是否为可读文件:%d",
[fm isReadableFileAtPath:@"NSFileManagerTest.m"]);
// 将会输出代表真的1
NSLog(@"NSFileManagerTest.m是否为可写文件:%d",
[fm isWritableFileAtPath:@"NSFileManagerTest.m"]);
// 将会输出代表假的0
NSLog(@"NSFileManagerTest.m是否为可执行文件:%d",
[fm isExecutableFileAtPath:@"NSFileManagerTest.m"]);
// 将会输出代表真的1
NSLog(@"NSFileManagerTest.m是否为可删除文件:%d",
[fm isDeletableFileAtPath:@"NSFileManagerTest.m"]);
// 获取NSFileManagerTest.m文件所在的路径组件
NSArray* array = [fm componentsToDisplayForPath:
@"NSFileManagerTest.m"];
NSLog(@"--NSFileManagerTest.m所在路径的完整路径组件为:--");
for(NSObject* ele in array)
{
NSLog(@"%@ , " , ele);
}
// 获取文件的相关属性
NSDictionary* attr = [fm attributesOfItemAtPath:@"NSFileManagerTest.m"
error:nil];
// 获取文件属性的详情
NSLog(@"NSFileManagerTest.m的创建时间为:%@",
[attr fileCreationDate]);
NSLog(@"NSFileManagerTest.m的属主账户为:%@",
[attr fileOwnerAccountName]);
NSLog(@"NSFileManagerTest.m的文件大小为:%lld",
[attr fileSize]);
// 直接获取文件内容
NSData* data = [fm contentsAtPath:@"NSFileManagerTest.m"];
// 直接将NSData的数据用UTF-8的格式转换字符串
NSString* content = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"----------输出文件内容---------");
NSLog(@"%@" , content);
}
}

NSFileManager示例1

  NSFileManager对文件或目录进行创建、删除、移动和复制:

 #import <Foundation/Foundation.h>

 int main(int argc , char * argv[])
{
@autoreleasepool{
NSFileManager* fm = [NSFileManager defaultManager];
// 创建目录
[fm createDirectoryAtPath:@"xyz/abc"
// 该参数指定如果父目录不存在,创建父目录
withIntermediateDirectories:YES
attributes:nil
error:nil];
NSString* content = @"《疯狂iOS讲义》是我正在学习的图书!";
// 创建一份文件
[fm createFileAtPath:@"myInfo.txt"
contents:[content dataUsingEncoding:NSUTF8StringEncoding]
attributes:nil];
// 复制一份新文件
[fm copyItemAtPath:@"myInfo.txt"
toPath:@"copyInfo.txt"
error:nil];
}
}

NSFileManager示例2

  查看目录包含的内容:

 #import <Foundation/Foundation.h>

 int main(int argc , char * argv[])
{
@autoreleasepool{
NSFileManager* fm = [NSFileManager defaultManager];
// 获取指定目录下所有文件和文件夹
NSArray * array = [fm contentsOfDirectoryAtPath:@"."
error:nil];
for(NSString* item in array)
{
NSLog(@"%@" , item);
}
// 获取指定目录下所有文件和文件夹对应的枚举器
NSDirectoryEnumerator* dirEnum =
[fm enumeratorAtPath:@"."];
NSString *file;
// 枚举dirEnum中包含的每个文件
while ((file = [dirEnum nextObject]))
{
// 如果该文件的文件名以.m结尾
if ([[file pathExtension] isEqualToString: @"m"]) {
// 直接获取文件内容
NSData* data = [fm contentsAtPath:file];
// 直接将NSData的数据用UTF-8的格式转换字符串
NSString* content = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"----------输出文件内容---------");
NSLog(@"%@" , content);
}
}
// 获取当前目录下的所有子目录
// NSArray* subArr = [fm subpathsOfDirectoryAtPath:@"."
// error:nil];
NSArray* subArr = [fm subpathsAtPath:@"."];
for(NSString* item in subArr)
{
NSLog(@"%@" , item);
}
}
}

NSFileManager示例3

4、使用NSPathUtilities.h管理路径,NSPathUtilities.h包含了对NSString类的扩展,从而为NSString类新增了一些专门用于操作路径的方法,这些方法的主要作用就是更方便第操作路径

 #import <Foundation/Foundation.h>

 int main(int argc , char * argv[])
{
@autoreleasepool{
NSLog(@"当前用户名为:%@" , NSUserName());
NSLog(@"当前用户的完整用户名为:%@" , NSFullUserName());
NSLog(@"当前用户的home目录为:%@" , NSHomeDirectory());
NSLog(@"root用户的home目录为:%@" ,
NSHomeDirectoryForUser(@"root"));
NSLog(@"系统临时目录为:%@" ,
NSTemporaryDirectory());
NSString* path = @"~root";
// 将~root解析成root用户的home目录
NSLog(@"解析~root的结果:%@" ,
[path stringByExpandingTildeInPath]);
NSString* path2 = @"/Users/yeeku/publish";
// 将会输出~/publish
NSLog(@"替换成~的形式:%@" ,
[path2 stringByAbbreviatingWithTildeInPath]);
NSArray* array = [path2 pathComponents];
// 遍历该路径中包含的各路径组件
for(NSString* item in array)
{
NSLog(@"%@" , item);
}
// 在path2路径后追加一个路径
NSString* path3 = [path2 stringByAppendingPathComponent:@"abc.m"];
NSLog(@"path3为:%@" , path3);
// 获取路径的最后部分
NSString* last = [path3 lastPathComponent];
NSLog(@"path3的最后一个路径组件为:%@" , last);
// 获取路径的最后部分的扩展名
NSLog(@"path3的最后一个路径的扩展名为:%@" ,
[path3 pathExtension]);
}
}

NSPathUtilities示例

5、使用NSProcessInfo获取进程信息,包括获取运行该程序的参数、进程标识符等,还可以用于获取该进程所在系统的主机名、操作系统名、操作系统版本等信息。

 #import <Foundation/Foundation.h>

 int main(int argc , char * argv[])
{
@autoreleasepool{
// 获取当前进程对应的ProcessInfo对象
NSProcessInfo* proInfo = [NSProcessInfo processInfo];
// 获取运行该程序所指定的参数
NSArray* arr = [proInfo arguments];
NSLog(@"运行程序的参数为:%@" , arr);
NSLog(@"进程标识符为:%d" ,
[proInfo processIdentifier]);
NSLog(@"进程的进程名为:%@" ,
[proInfo processName]);
NSLog(@"进程所在系统的主机名为:%@"
, [proInfo hostName]);
NSLog(@"进程所在系统的操作系统为:%ld"
, [proInfo operatingSystem]);
NSLog(@"进程所在系统的操作系统名为:%@"
, [proInfo operatingSystemName]);
NSLog(@"进程所在系统的操作系统版本字符串为:%@"
, [proInfo operatingSystemVersionString]);
NSLog(@"进程所在系统的物理内存为:%lld"
, [proInfo physicalMemory]);
NSLog(@"进程所在系统的处理器数量为:%ld"
, [proInfo processorCount]);
NSLog(@"进程所在系统的激活的处理器数量为:%ld"
, [proInfo activeProcessorCount]);
NSLog(@"进程所在系统的运行时间为:%f"
, [proInfo systemUptime]);
}
}

NSProcessInfo示例

6、可以通过NSFileHandle读取文件内容,使用NSFileHandle的基本步骤如下:

  • 创建一个NSFileHandle,该NSFileHandle将会打开指定文件
  • 对打开的文件进行IO操作
  • 关闭文件
 #import <Foundation/Foundation.h>

 int main(int argc , char * argv[])
{
@autoreleasepool{
// 打开一份文件准备读取
NSFileHandle* fh = [NSFileHandle
fileHandleForReadingAtPath:@"NSFileHandleTest.m"];
NSData* data;
// 读取NSFileHandle中的256个字节
while( [(data = [fh readDataOfLength:]) length] > )
{
NSLog(@"%ld" , [data length]);
// 直接将NSData的数据用UTF-8的格式转换字符串
NSString* content = [[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(@"----------输出读取的512个字节的内容---------");
NSLog(@"%@" , content);
} // 关闭文件
[fh closeFile];
// 打开一份文件准备写入
NSFileHandle* fh2 = [NSFileHandle
fileHandleForWritingAtPath:@"abc.txt"];
if(!fh2)
{
// 创建一个NSFileManager对象
NSFileManager* fm = [NSFileManager defaultManager];
// 创建一份空的文件
[fm createFileAtPath:@"abc.txt"
contents:nil
attributes:nil];
fh2 = [NSFileHandle
fileHandleForWritingAtPath:@"abc.txt"];
}
NSString* myBook = @"疯狂iOS讲义";
// 将指定内容写入底层文件
[fh2 writeData:[myBook
dataUsingEncoding:NSUTF8StringEncoding]];
// 关闭文件
[fh2 closeFile];
}
}

NSFileHandle示例

OC学习15——文件I/O体系的更多相关文章

  1. OC学习篇之---文件的操作

    今天我们来介绍OC中文件操作,在之前的文章中,已经接触到了文件的创建了,但是那不是很具体和详细,这篇文章我们就来仔细看一下OC中是如何操作文件的: 第一.首先来看一下本身NSString类给我们提供了 ...

  2. IOS开发-OC学习-常用功能代码片段整理

    IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...

  3. OC学习9——反射机制

    1.OC提供了3种编程方式与运行环境进行交互: 直接通过OC的源代码:这是最常见的方式,开发人员只是编写OC源代码,而运行环境负责在后台工作. 通过NSObject类中定义的方法进行动态编程:因为绝大 ...

  4. Java学习-016-CSV 文件读取实例源代码

    上文(CSV文件写入)讲述了日常自动化测试过程中将测试数据写入 CSV 文件的源码,此文主要讲述如何从 CSV 文件获取测试过程中所需的参数化数据.敬请各位小主参阅,若有不足之处,敬请大神指正,不胜感 ...

  5. Java学习-015-CSV 文件写入实例源代码

    在日常的自动化测试脚本编写的过程中,有时要将获取的测试结果或者测试数据存放在数据文件中,以用作后续的参数化测试.常用的文件文件类型无非 txt.csv.xls.properties.xml 这五种文件 ...

  6. OC学习总结之面向对象和类

    OC学习总结之面向对象和类   Objective-c是c语言的母集合,它的原意就是在原始的c语言的主体上加入面向对象的特性.1.面向对象和面向过程  面向对象和面向过程是编程的两种思考方式.面向对象 ...

  7. OC学习16——对象归档

    转载自  OC学习篇之---归档和解挡 OC中的归档就是将对象写入到一个文件中,Java中的ObjectInputStream和ObjectOutputStream来进行操作的.当然在操作的这些对象都 ...

  8. OC学习11——循环引用与@class

    转载自 OC学习篇之---@class关键字的作用以及#include和#import的区别 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#in ...

  9. OC学习6——面相对象的三大特性

    我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征.OC学习篇之---类的三大特性(封装,继承,多态) 1.封装(Encapsulation)是指将对象的状态信息 ...

随机推荐

  1. vim编辑器介绍及其常用命令

    vim简单的介绍 Vim 编辑器是一个模式编辑器 . 这意味着在不同状态下编辑器有不同的行为模式 . 两个基本的模式是 Normal 模式和 Insert 模式 ,还有可视模式. 在 Normal 模 ...

  2. AIO5系统中-打印样式常见问题处理

    1.为什么我的报表没有数据显示? 答:请看一下报表是否有绑定数据源,有添加查询,如果这些都做了,请看下主项数据的数据源有没有绑定,这些都绑定了,就会有数据的显示. 2.为什么我做的报表分组很乱? 答: ...

  3. 对于Hibernate的底层浅谈

    哇,我发现忙起来真的是没有时间来写,最近在学框架,感觉特别有兴趣,对于框架的感激就是又恨又爱的感觉,hibernate,没有研究太深,模拟的写了一点底层的实现,其实就是发射吧,我没有追踪源码去看,就是 ...

  4. Nvidia TX2 Robot 环境配置记录

    p.p1 { margin: 0.0px 0.0px 2.0px 0.0px; font: 14.0px "Helvetica Neue"; color: #454545 } p. ...

  5. Ztree改版 - 将图标字体化 - fontAwesome

    引言 ps:小白可以一看,大神勿打~ 用过 ztree 的盆友们都知道,ztree 功能强大,就功能上来说,追求着“无处不按钮”的体验,但好用不好看.可能有朋友说:“我这棵树只有我自己看,够用就行” ...

  6. Libevent(2.1.8)中的事件结构和管理

    Libevent(2.1.8)中的事件结构体 这里的libevent版本为 2.1.8 . libevent中事件的结构体struct event,定义在event_struct.h 中, 这里我们简 ...

  7. SEO中TDK写法的意思以及注意事项

    在SEO中,所谓的TDK其实就是title.description.keywords这三个标签,这三个标签在网站的优化过程中,至关重要所以今天童童来和大家分享下,如何去写好TDK标签! 1.title ...

  8. mshta 反弹shell

    kali系统准备: 复制以下ruby代码到/usr/share/metasploit-framework/modules/exploits/windows/smb/msh_shell.rb目录(要注意 ...

  9. Web 动画帧率(FPS)计算

    我们知道,动画其实是由一帧一帧的图像构成的.有 Web 动画那么就会存在该动画在播放运行时的帧率.而帧率在不同设备不同情况下又是不一样的. 有的时候,一些复杂或者重要动画,我们需要实时监控它们的帧率, ...

  10. 腾讯qq等级计算公式面试题

    就三道题大概是: 1. 推算出等级相应的天数 这个还比較简单,公式是:(b=2a+3)   a是等级, b是相应的天数 2. 推算出等级总共的天数 先看下规律 等级a 相应天数b 总天数s 1 5 5 ...