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)是指将对象的状态信息 ...
随机推荐
- iOS获取所有机型
1.手机系统版本:9.1 NSString* phoneVersion = [[UIDevice currentDevice] systemVersion]; 2.手机类型:iPhone 6 NSSt ...
- 社群公会GangSDK:程序员入行AI领域需要哪些技能?
作为一名Android开发工程师,身边总有些同行很焦虑,看着人工智能越来越火,总是担心Android要不行了,所以,我们需要转行么?Android还能走多久?其实,无论是对于Android还是iOS开 ...
- Python 日志处理(一) 按Nginx log_format 分割日志记录
要求:不使用正则 根据nginx 默认的日志记录格式,分割日志记录. log_format main '$remote_addr - $remote_user [$time_local] " ...
- Cubieboard2安装Fedora20
几天前入手一块Cubieboard2,又买了张16G的TF卡,装个linux折腾折腾.以前都是在虚拟机上用linux,个人比较喜欢Fedora,因为总能用上最新版的软件,像支持C++11的GCC.Cl ...
- [最短路]P1828 香甜的黄油 Sweet Butter
题目描述 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油.当然,他将付出额外的费 ...
- 无法将类型为“System.DBNull”的对象强制转换为类型“System.String”
在ERP中做业务类单据,有时候会遇到这样的报错. 无法将类型为"System.DBNull"的对象强制转换为类型"System.String" 去数据库中检 ...
- 使用Angular Router导航基础
名称 简介 Routes 路由配置,保存着那个URL对应着哪个组件,以及在哪个RouterOulet中展示组件. RouterOutlet 在HTML中标记路由内容呈现位置的占位符指令. Router ...
- MongoDB一:入门(安装与配置)
一.简介 MongoDB 是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. mongoDB MongoDB 是一个介于关系数据库和非关系数据库 ...
- ssh免密验证,shell批量设置
ssh免密验证,shell批量设置 #ssh免密验证,shell自动设置 echo '#!/bin/sh . /etc/init.d/functions [[ -f /usr/bin/expect ] ...
- 16. 使用Exhibitor管理ZooKeeper
Exhibitor是管理ZooKeeper服务实例的主管服务.由Netflix开发和开放源码,对于ZooKeeper的实例监控.备份/恢复.清理和可视化非常有用. Note Netflix Exhib ...