OC学习15——文件I/O体系
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体系的更多相关文章
- OC学习篇之---文件的操作
今天我们来介绍OC中文件操作,在之前的文章中,已经接触到了文件的创建了,但是那不是很具体和详细,这篇文章我们就来仔细看一下OC中是如何操作文件的: 第一.首先来看一下本身NSString类给我们提供了 ...
- IOS开发-OC学习-常用功能代码片段整理
IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...
- OC学习9——反射机制
1.OC提供了3种编程方式与运行环境进行交互: 直接通过OC的源代码:这是最常见的方式,开发人员只是编写OC源代码,而运行环境负责在后台工作. 通过NSObject类中定义的方法进行动态编程:因为绝大 ...
- Java学习-016-CSV 文件读取实例源代码
上文(CSV文件写入)讲述了日常自动化测试过程中将测试数据写入 CSV 文件的源码,此文主要讲述如何从 CSV 文件获取测试过程中所需的参数化数据.敬请各位小主参阅,若有不足之处,敬请大神指正,不胜感 ...
- Java学习-015-CSV 文件写入实例源代码
在日常的自动化测试脚本编写的过程中,有时要将获取的测试结果或者测试数据存放在数据文件中,以用作后续的参数化测试.常用的文件文件类型无非 txt.csv.xls.properties.xml 这五种文件 ...
- OC学习总结之面向对象和类
OC学习总结之面向对象和类 Objective-c是c语言的母集合,它的原意就是在原始的c语言的主体上加入面向对象的特性.1.面向对象和面向过程 面向对象和面向过程是编程的两种思考方式.面向对象 ...
- OC学习16——对象归档
转载自 OC学习篇之---归档和解挡 OC中的归档就是将对象写入到一个文件中,Java中的ObjectInputStream和ObjectOutputStream来进行操作的.当然在操作的这些对象都 ...
- OC学习11——循环引用与@class
转载自 OC学习篇之---@class关键字的作用以及#include和#import的区别 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#in ...
- OC学习6——面相对象的三大特性
我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征.OC学习篇之---类的三大特性(封装,继承,多态) 1.封装(Encapsulation)是指将对象的状态信息 ...
随机推荐
- iis7 部署网站 403错误
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i 403 - 禁止访问: 访问被拒绝. 您无权使用所提供的凭据查看此 ...
- Less的嵌套规则
Less的嵌套规则 在使用标准CSS时,要为多层嵌套的元素定义样式,要么使用后代选择器从外到内的嵌套定义,要么给这个元素加上类名或 id 来定义.这样的写法虽然很好理解,但维护起来很不方便,因为无法清 ...
- 设置SO_RECVBUF和SO_SENDBUF套接字选项
控制套接字的行为(如修改缓冲区的大小). int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen) ...
- jQuery中使用$.each()遍历后台响应的json字符串问题
今天在做练习项目的时候,使用$.each()方法遍历后台传过来的json字符串时,chrome浏览器中发现如下问题 Cannot use 'in' operator to search for 'l ...
- 认识 var、let、const
我们通过声明.初始化.值的可变性.作用域.变量提升以及在工作中如何使用等多个方面来详细了解var.let.const等关键字功能与特点. 声明 var,let:可以先声明,后赋值(初始化),默认值是 ...
- eclipse工作空间的基本配置
今天我们来学习一个小技巧,就是如何配置eclipse,对你没看错,就是配置eclipse,为什么要学这个呢?这个不是很简单吗?没错,是简单,但越是简单的东西有的时候人们总是会忽略一些什么,从未造成损失 ...
- POJ3211--分类01背包
Washing Clothes Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 9700 Accepted: 3110 Desc ...
- CCF-201604-1-折点计数
问题描述 试题编号: 201604-1 试题名称: 折点计数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个整数表示一个商店连续n天的销售量.如果某天之前销售量在增长 ...
- jquery 循环数组输出显示在html页面
jquery 没有双向数据绑定,但是很多需求确实需要我们从后台接收到数组或者对象循环显示在前台页面上,这时我们可以用字符串拼接,元素添加的方法去实现 js部分如下: $(function(){ var ...
- 迭代加深搜索POJ 3134 Power Calculus
题意:输入正整数n(1<=n<=1000),问最少需要几次乘除法可以从x得到x的n次方,计算过程中x的指数要求是正的. 题解:这道题,他的结果是由1经过n次加减得到的,所以最先想到的就是暴 ...