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. mac 安装protobuf,并编译

    因公司接口协议是PB文件,需要将 PB 编译成JAVA文件,且MAC 电脑,故整理并分享MAC安装 google 下的protobuf 文件   MAC 安装protobuf 流程 1.下载 http ...

  2. 手写particles

    var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); var Grewer = { in ...

  3. Unity20172.0 Android平台打包

    Android SDK及Jdk百度网盘下载链接:https://pan.baidu.com/s/1dFbEmdz 密码:pt7b Unity20172.0 Android平台打包 简介说明: 第一步: ...

  4. selenium定位tr及td,并获取其文本及属性

    #获取所有的trtrlist=brower.find_elements_by_tag_name("tr")for tr in trlist: #获取tr中的所有td tdlist= ...

  5. spring中的自定义标签

    为了给系统提供可配置化支持,一般会用原生态的方式去解析定义好的XML文件,然后转化为配置对象.这种方式对于简单.单一的配置文件,或者是XML配置格式固定的配置文件,比较容易处理.但是对于一些配置非常复 ...

  6. JSP4(内置对象)

    一.超级链接传值问题传值: <a href="href1.jsp?id=1&name=pkd&age=40">This is my JSP page. ...

  7. Ipad弹出UIAlertControllerStyleActionSheet时发生崩溃

    pad弹出UIAlertControllerStyleActionSheet时,在iphone上运行正常,但在ipad上崩溃,解决代码如下: UIAlertController *alertVc = ...

  8. 51Nod--1008

    1008 N的阶乘 mod P 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 输入N和P(P为质数),求N! Mod P = ? (Mod 就是求模 % ...

  9. maven项目部署对Oracle jar包的处理

    1.正常情况下,我们是访问不到ojdbc.jar的,需要建立一个本地仓. 2.先找到自己的Oracle中ojdbc.jar将其放入到   C:\Users\Administrator  这个目录下,然 ...

  10. N卡全部历史驱动

    记录一下寻找驱动方法 打开链接 http://www.geforce.cn/drivers/beta-legacy 默认搜索出来是10个,之后打开控制台输入如下内容回车显示全部(100,可以修改数字来 ...