iOS --- 关于SandBox机制及文件读写的几种方式

iOS中的SandBox(沙盒)机制是一种安全体系,它规定了APP只能在为该APP创建的文件夹内读取文件,不可以访问其他地方的内容。所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等。即:

  1. 每个应用程序都在自己的沙盒内
  2. 不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容
  3. 应用程序向外请求或接收数据都需要经过权限认证

SandBox

默认情况下,每个APP的SandBox中有三个文件夹: Documents, Library和tmp, 该APP只能在这三个目录下进行文件的读写操作.
获取SandBox的路径:

let home: String = NSHomeDirectory()
  1. Documents: Apple建议将APP中建立的或浏览到的文件数据保存在此, iTunes会将其备份.
  2. Library: 存储APP的默认设置或其他状态信息, iTunes会将其备份.
  3. Library/Preferences: APP的偏好设置文件, 可使用NSUserDefaults来获取和设置.
  4. Library/Cached: 存放缓存文件, 该目录中文件不会在APP退出时删除. 而iTunes不会备份该目录.
  5. tmp: 创建临时文件的地方.

获取各个路径的方式如下:

// 使用NSSearchPathForDirectoriesInDomains来获取SandBox中目录的全路径
let paths: Array = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) as Array!
print("paths : \(paths)")
let documentsPath: String = paths[0] as String!
print("documents : \(documentsPath)")

let library: String = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true)[0]
print("library : \(library)")

let preferencs: String = NSSearchPathForDirectoriesInDomains(.PreferencePanesDirectory, .UserDomainMask, true)[0]
print("preferencs : \(preferencs)")

let caches: String = NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true)[0]
print("caches : \(caches)")

NSBundle

NSBundle包含了APP打包的所有文件, 如其中Info.plist文件包含了APP的基本信息。

// 获取Info.plist文件
let infoPath: String = NSBundle.mainBundle().pathForResource("Info", ofType: "plist") as String!
// 读取Dictionary格式的内容
infos = NSMutableDictionary(contentsOfFile: infoPath) as NSMutableDictionary!
// 获取CFBundleName信息
let bundleName: String = infos["CFBundleName"] as! String
print(bundleName)

对NSBundle中文件写入内容的方式与其他文件一样。见下文。
一般加载xib文件也是通过NSBundle来获取:

var nibs: [AnyObject] = NSBundle.mainBundle().loadNibNamed("testNib", owner: nil, options: nil)
var testNib: UIView = nibs.last as! UIView

文件读写

文件读写是非常基本的一种操作,iOS中常用contentsOfFile,writeToFile等类似的方法实现。
首先获取文件路径:

let docPath: String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0]
let filePath: String = docPath.stringByAppendingString("/filename")

在SandBox的Documents目录下找到filename文件,如没有则新建一个。

读文件

读取String:

var content = String(contentsOfFile: filePath, encoding: NSUTF8StringEncoding)
var content = String(data: NSData(contentsOfFile: filePath)!, encoding: NSUTF8StringEncoding)!

读取NSArray, NSDictionary, NSData:

var array = NSArray(contentsOfFile: filePath)
var dict = NSDictionary(contentsOfFile: filePath)
var data = NSData(contentsOfFile: filePath)

读取图片:

let imagePath: String = NSBundle.mainBundle().pathForResource("Image", ofType: "jpg") as String!
var image: UIImage = UIImage(contentsOfFile: imagePath)!
// 通过NSData来读取
var data: NSData = NSData(contentsOfFile: imagePath)!
image = UIImage(data: data)!

读取网络图片:

var url: NSURL = NSURL(string: "http://imgphoto.gmw.cn/attachement/jpg/site2/20151010/eca86bd9dc471782b9ff28.jpg")!
data = NSData(contentsOfURL: url)!
image = UIImage(data: data)! 

写文件

写入String:

try "testing content again".writeToFile(filePath, atomically: true, encoding: NSUTF8StringEncoding)
// 通过NSData方式写入String
var data = NSMutableData()
data.appendData("testing content".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!)
data.writeToFile(filePath, atomically: true)

写入NSArray, NSDictionary, NSData:

array.writeToFile(filePath, atomically: true)
dict.writeToFile(filePath, atomically: true)
data.writeToFile(filePath, atomically: true)

存储图片

存储图片通常使用NSData的格式向文件中写入。

let docPath: String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0]
imagePath = docPath.stringByAppendingString("/testImage.jpg")
data.writeToFile(imagePath, atomically: true)
image = UIImage(contentsOfFile: imagePath)!

data = NSData(data: UIImagePNGRepresentation(image)!)
// UIImageJPEGRepresentation(image, 1.0) // JPEGPNG格式压缩更多

var imagePath2: String = docPath.stringByAppendingString("/testImage2.png")
data.writeToFile(imagePath2, atomically: true)
image = UIImage(contentsOfFile: imagePath2)!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值