1、简介
- 在文件系统中,文件和目录都是使用完整文件路径来唯一标识的。我们可以使用 NSString 和 NSURL 两种对象来描述文件路径。官方建议使用 NSURL 。
- NSURL 是用来表示 URL 地址的类,通过 URL 我们可以定位一个远程 web 服务器上的资源位置,也可以定位硬盘上的一个本地文件的路径。
- 对于 web 资源,往往结合 NSURLSession、NSURLConnection、NSURLDownload 等使用,对于本地资源,一般结合 NSFileManager、NSFileHandle、NSBundle 使用。
- NSURLComponents 只支持 iOS7.0 及以上的 API 类,它可以实现对 URL 各个部分的读写。NSURLComponents 对 URL 各个部分的内容都有两种格式的属性来表示:
原生格式 |
URL-Encoded |
scheme |
- |
host |
percentEncodedHost |
port |
- |
path |
percentEncodedPath |
query |
percentEncodedQuery |
fragment |
percentEncodedFragment |
user |
percentEncodedUser |
password |
percentEncodedPassword |
2、NSURL 结构:
protocol://hostname[:port]/path/[;parameters][?query]#fragment // 带方括号[]的为可选项
protocol :协议
hostname :主机名
port :端口
path :路径
parameters :参数
query :查询
fragment :信息片段
http:// 超文本传输协议
https:// 超文本传输安全协议
ftp:// 文件传输协议
file:// 本地文件 URL
data:// 数据 URL
3、URL 的创建
// 由字符串创建
// 简单字符串直接创建
NSURL *url1 = [NSURL URLWithString:@"https://swiftinaction.com/example"];
NSString *complexString = @"https://swiftinaction.com/中文字符串/example";
NSString *convertString = [complexString stringByAddingPercentEncodingWithAllowedCharacters:
[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "]];
// 由复杂字符串/中文创建时,需要对字符串进行编码转换
NSURL *url2 = [NSURL URLWithString:convertString];
// 由基础 URL 和基于基础 URL 的一个相对路径字符串创建
NSURL *baseUrl = [NSURL URLWithString:@"https://swiftinaction.com"];
NSURL *fullUrl = [NSURL URLWithString:@"/example" relativeToURL:baseUrl];
// 生成绝对路径
NSURL *url3 = [fullUrl absoluteURL];
// 由文件路径创建
// 自动判断 URL 路径为文件,还是目录,为目录时自动在路径末尾加 “/”
NSURL *url4 = [NSURL fileURLWithPath:@"/Users/JHQ0228/Desktop/test"];
// 指定 URL 路径为一个目录,自动在路径末尾加 “/”
NSURL *url5 = [NSURL fileURLWithPath:@"/Users/JHQ0228/Desktop/test" isDirectory: YES];
4、URL 的获取
NSURL *url1 = [NSURL URLWithString:@"http://JHQ:password@swiftinaction.com:8080/sayHello/toChinese.png; date=20160223?name=JHQ#atMorning"];
// 获取 URL 的 绝对路径字符串
NSString *absoluteString = [url1 absoluteString];
// 获取 URL 的 协议类型
NSString *scheneString = [url1 scheme];
// 获取 URL 的 主机名
NSString *hostString = [url1 host];
// 获取 URL 的 端口
NSNumber *portString = [url1 port];
// 获取 URL 的 路径名
NSString *pathString = [url1 path];
// 获取 URL 的 参数
NSString *parametersString = [url1 parameterString];
// 获取 URL 的 查询语句
NSString *queryString = [url1 query];
// 获取 URL 的 信息片段语句
NSString *fragmentString = [url1 fragment];
// 获取 URL 的 路径组成部分
NSArray *pathComponents = [url1 pathComponents];
// 获取 URL 的 相对路径
NSString *relativePath = [url1 relativePath];
// 获取 URL 的 路径最后一个组成部分
NSString *lastPathComponent = [url1 lastPathComponent];
// 获取 URL 的 路径扩展名
NSString *pathExtension = [url1 pathExtension];
// 获取 URL 的 用户名
NSString *user = [url1 user];
// 获取 URL 的 密码
NSString *password = [url1 password];
5、URL 的判断
NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"testFile" withExtension:@"txt"];
// 检查文件的可达性
/*
只能用来判断文件系统内部资源的可达性,对于 web URl 等其他类型全返回 false
*/
BOOL bl1 = [fileUrl checkResourceIsReachableAndReturnError:nil];
// 判断是否为文件 URl
BOOL bl2 = [fileUrl isFileURL];
6、URL 的路径拼接
NSURL *url = [NSURL URLWithString:@"http://swiftinaction.com/sayHello"];
// 追加路径到当前路径末尾
// 只追加路径,不在路径末尾添加 “/”
NSURL *appendUrl1 = [url URLByAppendingPathComponent:@"toJhq"];
// isDirectory 为 true 时在路径末尾添加 “/”
NSURL *appendUrl2 = [url URLByAppendingPathComponent:@"toJhq" isDirectory: YES];
// 追加路径后缀到当前路径末尾
/*
当路径以 “/” 结尾时,后缀会添加到末尾的 “/” 之前
*/
NSURL *appendUrl3 = [url URLByAppendingPathExtension:@"png"];
// 删除路径末尾的最后一个路径
NSURL *deleteUrl1 = [appendUrl1 URLByDeletingLastPathComponent];
// 删除路径末尾的后缀
NSURL *deleteUrl2 = [appendUrl3 URLByDeletingPathExtension];
7、NSURLComponents
// NSURLComponents 的创建
NSURLComponents *componentsUrl = [NSURLComponents componentsWithString:@"http://swiftinaction.com/sayHello"];
// NSURLComponents 的设置
componentsUrl.scheme = @"https";
componentsUrl.host = @"swiftinaction.com.cn";
componentsUrl.port = @8080;
componentsUrl.path = @"/sayHello/toChinese/你好";
componentsUrl.query = @"name=JHQ";
componentsUrl.fragment = @"atMorning";
componentsUrl.user = @"JHQ";
componentsUrl.password = @"123456789";
// NSURLComponents 的转换
// 将 NSURLComponents 转为 NSURL
NSURL *nsUrl = [componentsUrl URL];
NSString *componentsUrlString1 = [componentsUrl path];
// 转换为内容数据的十六进制编码字符串
NSString *componentsUrlString2 = [componentsUrl percentEncodedPath];