// 字典写入文件 // 创建一个存储字典的文件路径 NSString *fileDicPath = [docPath stringByAppendingPathComponent:@"love.txt"]; NSDictionary *dic = @{@"职业":@"程序员", @"梦想":@"代码无BUG"}; // 字典写入时执行的方法 [dic writeToFile:fileDicPath atomically:YES]; NSLog(@"fileDicPath is %@", fileDicPath); // 从文件中读取数据字典的方法 NSDictionary *resultDic = [NSDictionary dictionaryWithContentsOfFile:fileDicPath]; NSLog(@"%@", resultDic[@"梦想"]);

归档与反归档

先是,复杂对象所属的类要服从<NSCoding>公约

@interface Person : NSObject <NSCoding>

@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *age;
@property (copy, nonatomic) NSString *gender;

- (instancetype)initWithName:(NSString *)name age:(NSString *)age gender:(NSString *)gender;

@end

然后完结在那之中的八个措施

// NSCoder是iOS中的编码解码类
// 归档时调用
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.age forKey:@"age"];
    [aCoder encodeObject:self.gender forKey:@"gender"];
}

// 解档时调用
- (id)initWithCoder:(NSCoder *)aDecoder
{
    NSString *name = [aDecoder decodeObjectForKey:@"name"];
    NSString *age = [aDecoder decodeObjectForKey:@"age"];
    NSString *gender = [aDecoder decodeObjectForKey:@"gender"];
    return [self initWithName:name age:age gender:gender];
}

拓宽归档大概反归档

// 归档
- (IBAction)archiver:(id)sender {
    // 创建两个人
    Person *bada = [[Person alloc] initWithName:@"bada" age:@"18" gender:@"男"];
    Person *qiuxiang = [[Person alloc] initWithName:@"qiuxiang" age:@"18" gender:@"女"];

    // 获取到Documents路径
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

    // iOS中的归档类是NSKeyeArchiver,作用是:将复杂对象转换为NSData对象
    // 创建一个可变数据对象
    NSMutableData *mData = [NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mData];
    // 归档时要给归档对象添加标记
    [archiver encodeObject:bada forKey:@"bada"];
    [archiver encodeObject:qiuxiang forKey:@"qiuxiang"];
    // 结束归档,不管还有多少未归档的对象,都不会执行归档操作
    [archiver finishEncoding];

    // 将数据写入文件
    // 创建文件路径
    NSString *filePath = [docPath stringByAppendingPathComponent:@"bada.qiuxiang"];
    [mData writeToFile:filePath atomically:YES];

    NSLog(@"归档");
}

// 反归档
- (IBAction)unarchiver:(id)sender {
    // 获取存放数据的路径
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *filePath = [docPath stringByAppendingPathComponent:@"bada.qiuxiang"];
    // 从路径中获取NSData对象
    NSData *data = [NSData dataWithContentsOfFile:filePath];

    // iOS中的解档类是NSKeyedUnarchiver,作用是:将NSData对象还原成原本的复杂对象
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

    // 解档
    Person *bada = [unarchiver decodeObjectForKey:@"bada"];
    NSLog(@"name is %@, age is %@, gender is %@ 解档成功", bada.name, bada.age, bada.gender);
}

复杂对象的读写—归档和反归档

复杂对象:在Foundation框架内不设有的数据类,如:自定义Person类不可能再程序内通过writeToFile:那几个方法写入到文件内

什么将复杂对象写入文件?

复杂对象不能够透过writeFile:方法实行数据漫长化,只可以通过将复杂对象转化为NSData(那一个手续正是归档),然后再通过writeTiFile:写入文件

如何从文件中读取复杂对象?

从文件中读取NSData数据,将NSdata转化为复杂性对象(那么些手续正是反归档)
注:
1.繁杂对象写入文件的进程(复杂对象->归档->NSData->writeToFile:)
2.从文件中读收取复杂对象进程(读取文件->NSData->反归档->复杂对象)

 

通过文件处理器创立文件以及猎取文件音信

三、文件处理器与公事对接器

  • 文件管理器(NSFileManager):此类首纵然对文本进行的操作(创建/从删除/改名等)以及文件音信的得到
  • 文件连接器(NSFileHandle):此类主固然对剧情张开读取和写入操作

Documents目录

保存应用程序运行时生成的需求长久化的多少,Itunes会自动备份该目录

留神:数组(可变与不可变)和字典(可变与不可变)申月素对象的类型,也非得是上述各类,不然不能直接写入文件

/** * 练习要求:从一个文件中指定的位置开始追加内容 提示: 1、在documents目录下创建一个test.txt文件,文件中的内容为"abcdefg" 2、从文件偏移量为3那个位置开始追加内容"1234" */ // 获取Documents文件夹路径 NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; // 创建文件路径 NSString *filePath = [docPath stringByAppendingPathComponent:@"test.txt"]; // 使用文件管理对象创建文件 NSFileManager *fileManager = [NSFileManager defaultManager]; [fileManager createFileAtPath:filePath contents:[@"abcdefg" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil]; // 创建文件对接对象 NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:filePath]; // 文件对接对象此时针对文件既可以读取又可以写入 // 将偏移量挪到3的位置 [handle seekToFileOffset:3]; // 写入数据 [handle writeData:[@"1234" dataUsingEncoding:NSUTF8StringEncoding]]; // 执行完操作之后不要忘记关闭文件 [handle closeFile];

二、轻易对象的读写(I/O)操作

iOS中提供4种等级次序能够直接实行文件存取
NSString、NSArray、NSDictionary、NSData


以上项目包含子类

字符串写入沙盒

// 在Documents下面创建一个文本路径,假设文本名称为bada.txt
NSString *txtPath = [docPath stringByAppendingPathComponent:@"bada.txt"];// 此时仅存在路径,文件并没有真实存在
NSString *string = @"中二洪荒巴达之力";
[string writeToFile:txtPath atomically:YES encoding:NSUTF8StringEncoding error:nil];// 字符串写入时执行的代码
NSLog(@"%@", txtPath);

从文件中读取字符串的艺术

NSString *resultString = [NSString stringWithContentsOfFile:txtPath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@", resultString);

数组写入文件

// 创建一个存储数组的文件路径
NSString *filePath = [docPath stringByAppendingPathComponent:@"girl.txt"];
NSArray *arr = @[@"妈", @"的", @"智", @"障"];
[arr writeToFile:filePath atomically:YES];
NSLog(@"%@", filePath);

从文件中读取数组的法子

NSArray *resultArr = [NSArray arrayWithContentsOfFile:filePath];
NSLog(@"%@", resultArr);

字典写入文件

NSString *dicPath = [docPath stringByAppendingString:@"dic.txt"];
NSDictionary *dic = @{@"你" : @"智障", @"我" : @"机智"};
[dic writeToFile:dicPath atomically:YES];
NSLog(@"%@", dicPath);

从文件中读取字典

NSDictionary *resultDic = [NSDictionary dictionaryWithContentsOfFile:dicPath];
NSLog(@"%@", resultDic);

NSData写入文件

NSString *dataPath = [docPath stringByAppendingPathComponent:@"icon"];
// 得到一个UIImage对象
UIImage *image = [UIImage imageNamed:@"icon.jpg"];
// 将UIImage对象转换成NSData对象
NSData *data = UIImageJPEGRepresentation(image, 1.0);
[data writeToFile:dataPath atomically:YES];
NSLog(@"%@", dataPath);

从文件中读取NSData文件

NSData *resultData = [NSData dataWithContentsOfFile:dataPath];
// 将得到的NSData数据转换为原有的图片对象
UIImage *resultImage = [UIImage imageWithData:resultData];
// 显示图片
UIImageView *imageView = [[UIImageView alloc ] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
imageView.image = resultImage;
[self.view addSubview:imageView];

上述的运转结果都足以从沙盒路径中的文件夹中观望

Library目录

积累程序的暗许设置和别的情况消息,Itunes会自动备份该目录
1.Library/Caches:寄存慢存文件,ITunes不会备份此目录,此目录下文件不会再应用程序退出删除。一般存放体量相当大,不是特地重大的能源。
2.Library/Preference:保存应用的有着偏幸设置,iOS的Setting(设置)应用会在该目录中找出应用的设置新闻,iTunes会自动备份该目录。注意:不该直接成立偏心设置文件,而是应当利用NSUserDefaults类来获得和设置应用程序的偏疼。

Plist文件平常用于存款和储蓄顾客设置,也能够用于存款和储蓄捆绑的音讯。

NSDictionary的写入与读取

沙盒机制

  • 每多少个应用程序都会持有四个应用程序沙盒
  • 应用程序沙盒正是贰个文件系统目录

iOS中的沙盒机制

  • 沙盒是一种平安系统
  • TA规定了应用程序只好在为该程序创设的文件夹(沙盒)内访谈文件,不得以访谈其余沙盒内的剧情(iOS8曾经有的盛放访谈)
  • 有着的非代码文件都保留在这些地点,举个例子图片、音乐、属性列表(plist)、sqlite数据库和文书文件等

沙盒机制的特色

  • 每一个应用程序的位移限制都限制在温馨的沙盒里面
  • 不能够自由高出自身的沙盒去访谈其余应用程序沙盒中的内容(iOS已经部分盛开访谈)
  • 应用程序向外哀告或收受多少都供给通过权限认证

前往沙盒路径方法

  • 入选要前往的门路,右键
  • 选中Services选项
  • 点击Reveal in Finder
![](https://upload-images.jianshu.io/upload_images/1520415-6476cd9dd6e71e4a.png)

前往沙盒路径.png

沙盒中的文件夹

  • Documents:保存应用运营时生成的内需悠久化的数码,iTunes会自动备份该目录
  • Library:存款和储蓄程序的暗中同意设置和任何意况音讯,iTunes会自动备份该目录。
  • Library/Caches:贮存慢存文件,iTunes不会备份此目录,次目录下文件不会在动用退出删除。
  • Library/Preferences:保存应用的具备偏幸设置,iOS的Settings(设置)应用会在该目录中检索应用的设置新闻,iTunes会自动备份该目录。注意:您不会直接创设偏心设置文件,二十应该利用NSUserDefaults类来获得和装置应用程序的溺爱
  • tmp:保存应用运营时所需的临时数据,使用完结后再将相应的文件从该目录删除。应用尚未运营时,系统也是有望会知道该目录下的文本,iTunes不会联手该目录。iphone重启时,该目录下的公文子禽被删去

获取Documents目录

 NSString *path = [[NSString NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

获取tmp目录

NSString *tmpPath  = NSTemporaryDirectory();

获取Library目录

NSString *libPath = [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];

获取Library/Caches目录

NSString *cachePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES) firstObject];

获取Library/Preferences目录

NSString *libPath = [[NSSeachForPathDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
NSString *prePath = [libPath stringByAppendingPathComponent:@"Preferences"];

应用程序包所在地方

NSString *path = [NSBundle mainBundle].resourcePth;

轻易对象的读写(I/O)操作

简易对象:字符串,数组,字典,data

字符串存款和储蓄

//获取存储的目录
    NSString *str = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //在沙盒文件夹下的Documents内创建.txt文件
    NSString *newPath = [str stringByAppendingPathComponent:@"text.txt"];
    //存入内容
    NSString *name = @"蓝欧科技, nihao";

    [name writeToFile:newPath atomically:YES encoding:NSUTF8StringEncoding error:nil];

字符串读取

NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *newPath = [path stringByAppendingString:@"/text.txt"];
NSString *string = [NSString stringWithContentsOfFile:newPath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@", string);

数组存款和储蓄

//获取路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //创建文件
    NSString *newPath = [path stringByAppendingPathComponent:@"array.plist"];
    //存入的数组
    NSArray *nameArr = @[@"zhangsan", @"lisi", @"wangwu"];
    [nameArr writeToFile:newPath atomically:YES];

数组读取

 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *newPath = [path stringByAppendingString:@"/array.plist"];
    //获取数组
    NSArray *array = [NSArray arrayWithContentsOfFile:newPath];
    NSLog(@"%@", array);

字典存款和储蓄

//获取路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //新建plist文件
    NSString *newPath = [path stringByAppendingPathComponent:@"dict.plist"];
    //要存储的字典
    NSArray *nameArr = @[@"zhangsan",@"lisi"];
    NSDictionary *dict = @{@"a" : @"1", @"b":@"2", @"c" : @"3" , @"name" : nameArr};
//    [dict setValue:nameArr forKey:@"name"];
    [dict writeToFile:newPath atomically:YES];

字典读取

//获取路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //获取plist路径
    NSString *newPath = [path stringByAppendingString:@"/dict.plist"];
    //获取字典
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:newPath];
    NSLog(@"%@", dict);

NSData类型存款和储蓄

    NSString *str = @"nihoa";
    //获取地址
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *dataPath = [path stringByAppendingPathComponent:@"data.plist"];
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    //写入文件
    [data writeToFile:dataPath atomically:YES];

NSData读取

  //获取路径
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *dataPath = [path stringByAppendingPathComponent:@"data.plist"];
    NSData *data = [NSData dataWithContentsOfFile:dataPath];
    NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", str);

图形存款和储蓄

//将图片转成NSData类型在存储
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //在沙盒问价下面创建一个文件
    NSString *newPath = [path stringByAppendingPathComponent:@"image.png"];
    //需要存储的图片
    NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"tu.jpg"], 1.0);
    //创建文件并存储
    [imageData writeToFile:newPath atomically:YES];

图片读取

//获取沙盒地址
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //获取图片data地址
    NSString *newPath = [path stringByAppendingPathComponent:@"image.png"];
    //获取data
    NSData *data = [NSData dataWithContentsOfFile:newPath];
    //获取图片
    UIImage *image = [UIImage imageWithData:data];
    //添加imageView
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 200, 150, 150)];
    imageView.image = image;
    [self.view addSubview:imageView];

小结起来就是:容易对象的写就是把在沙盒目录下新建贰个文件,将轻易对象写入进文件就行,读正是找到对象文件,根据路线创立对象就好

NSString *str = [NSString stringWithContentsOfFile:strPath
encoding:NSUTF8StringEncoding error:nil];

  • 文件管理器重借使对文本举行操作(成立、删除、改名等)以及文件消息的得到
  • 文本连接器重假如对文本内容开展读取与写入操作

四、复杂对象的读写(I/O)操作

复杂对象:在Foundation框架内不真实的数据类,如自定义的Person类不恐怕在前后相继内通过writeToFile:这几个方法写入到文件内

  • 什么将复杂对象写入文件
  • 归档:只好通过将复杂对象转换为NSData,然后写入文件。
  • 怎么从文件中读取复杂对象
  • 反归档(又称解档):将NSData转变为复杂性对象

①.复杂指标写入文件的进程:复杂对象->归档->NSData->writeToFile
②.从文件中读收取复杂对象进度:读取文件->NSData->反归档->复杂对象

沙盒

沙盒:每种iOS应用程序都会为和煦创设贰个文件系统目录(文件夹),
这一个独自、密封、安全的空间,叫做沙盒。
注:1.每种应用程序都会有四个应用程序沙盒
2.应用程序沙盒正是文件系统目录
沙盒机制:一种安全系统(安全部制)
沙盒机制特点:1.各类应用程序的位移限制都限制在温馨的沙盒里
2.不可能自由赶过自身的沙盒去探访别的应用程序沙盒中的内容(iOS8业已局地盛放访谈)
3.应用程序向外恳求或接受多少都急需通过权限认证

沙盒目录下有七个文件夹Documents Library(上面有Caches和Preference目录)
tmp

      2、应用程序沙盒正是一个文件系统目录。

  • -encodeWithCoder:(NSCoder *)aCoder; 序列化
  • -initWithCoder:(NSCoder *)aDecoder; 反种类化

文件对接器的应用

/**
     练习要求:从一个文件中指定的位置开始追加内容
     提示:
     1、在documents目录下创建一个test.txt文件,文件中的内容为"abcdefg"
     2、从文件偏移量为3那个位置开始追加内容"1234"
 */

- (void)change
{
    // 1.获取Documents路径
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    // 2.创建文件路径
    NSString *filePath = [docPath stringByAppendingPathComponent:@"text.txt"];
    // 3.使用文件管理对象创建文件
    NSFileManager *fileManager = [NSFileManager defaultManager];
    [fileManager createFileAtPath:filePath contents:[@"abcdefg" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
    // 4.创建文件对接对象
    NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:filePath];// 文件对象此时针对文件,可读可写
    // 5.将偏移量移动到3的位置
    [handle seekToFileOffset:3];
    // 6.写入数据
    [handle writeData:[@"1234" dataUsingEncoding:NSUTF8StringEncoding]];
    // 7.执行完操作后,关闭文件
    [handle closeFile];

    NSLog(@"%@", filePath);
}

PS:这么些标题有一点坑爹,说是追加,其实是把defg替换来1234.

哪些进展归档和反归档

1.首先,复杂对象所属的类要服从<NSCoding>契约

//Person.h
@interface Person : NSObject <NSCoding>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *gender;
@property (nonatomic, assign) NSInteger age;
@end

2.其次,实现左券中的多少个法子

  • -(void)encodeWithCoder:(NSCoder *)aCoder;
  • -(instancetype)initWithCoder:(NSCoder *)aDecoder

//Person.m
@implementation Person
//当对象进行归档操作的时候,会自动调用这个方法
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.gender forKey:@"gender"];
    [aCoder encodeInteger:self.age forKey:@"age"];
}
//当对象进行反归档的时候会调用
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeIntegerForKey:@"age"];
        self.gender = [aDecoder decodeObjectForKey:@"gender"];
    }
    return self;
}
@end

归档 —-NSKeyedArchiver

  Person *person = [[Person alloc] init];
    person.name = @"小明";
    person.age = 23;
    person.gender = @"男";

    //进行归档操作
    //1.创建一个NSmutableData,用来存储归档后的数据
    NSMutableData *mData = [[NSMutableData alloc] init];
    //2.创建归档器
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:mData];
    //进行归档
    [archiver encodeObject:person forKey:@"person"];
    //归档结束
    [archiver finishEncoding];
    //存到沙盒的文件夹中
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *newPath = [path stringByAppendingPathComponent:@"guidang.plist"];
    //存储data
    [mData writeToFile:newPath atomically:YES];

反归档 —-NSKeyedUnarchiver

   //获取路径
    NSString * newPath = [[self documentPath] stringByAppendingPathComponent:@"guidang.plist"];
    //取出数据
    NSData *data = [NSData dataWithContentsOfFile:newPath];
    //创建反归档器
    NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    Person *person = [unArchiver decodeObjectForKey:@"person"];
    //反归档结束
    [unArchiver finishDecoding];
    NSLog(@"name : %@ age : %ld gender : %@", person.name, person.age, person.gender);

NSString *dataPath = [documentPath
stringByAppendingPathComponent@”data”];

NSData的写入与读取

一、沙盒机制

经过文件管理器来操作对象

创制对象

NSString *string = @"hello nihao";
    //根据字符串创建data
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];

始建文件管理器

    NSFileManager *fileManager = [[NSFileManager alloc] init];

仓库储存对象

//向目标文件写入信息
    BOOL save = [fileManager createFileAtPath:[[self documentPath] stringByAppendingPathComponent:@"studenttt.plist"] contents:data attributes:nil];
    if (save) {
        NSLog(@"写入成功");
    }else{
        NSLog(@"写入错误");
    }
//注:[self documentPath]是获取Documents路径
//获取Documents路径
- (NSString *)documentPath {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
}

读取对象

NSData *mData = [fileManager contentsAtPath:[[self documentPath] stringByAppendingPathComponent:@"studenttt.plist"]];
NSString *mStr = [[NSString alloc] initWithData:mData encoding:NSUTF8StringEncoding];

移步文件

    //移动文件
//atPath:文件存在当前目录
//toPath:目标目录
    BOOL result = [fileManager moveItemAtPath:[[self documentPath] stringByAppendingPathComponent:@"studenttt.plist"] toPath:[[self libraryPath] stringByAppendingPathComponent:@"studenttt.plist"] error:nil];
    if (result) {
        NSLog(@"移动成功");
    }else{
        NSLog(@"移动错误");
    }
//注:[self libraryPath] 获取library文件目录
//获取library路径
- (NSString *)libraryPath {
    return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
}

复制文件

  BOOL result = [fileManager copyItemAtPath:[[self documentPath] stringByAppendingPathComponent:@"studenttt.plist"] toPath:[[self libraryPath] stringByAppendingPathComponent:@"studenttt.plist"] error:nil];
    if (result) {
        NSLog(@"复制成功");
    }else{
        NSLog(@"复制错误");
    }

比较不一致门路下的文件内容是不是一样

  BOOL result1 = [fileManager contentsEqualAtPath:[[self documentPath] stringByAppendingPathComponent:@"studenttt.plist"] andPath:[[self libraryPath] stringByAppendingPathComponent:@"studenttt.plist"]];
    if (result1) {
        NSLog(@"一致");
    }else{
        NSLog(@"不同");
    }

文本是或不是留存

  BOOL result = [fileManager fileExistsAtPath:[[self libraryPath] stringByAppendingPathComponent:@"studenttt.plist"]];
    if (result) {
        NSLog(@"存在");
    }else{
        NSLog(@"不存在");
    }

移除文件

    BOOL result = [fileManager removeItemAtPath:[[self libraryPath] stringByAppendingPathComponent:@"studenttt.plist"] error:nil];
    if(result){
        NSLog(@"移除成功");
    }else{
        NSLog(@"移除错误");
    }

始建文件夹

    BOOL result = [fileManager createDirectoryAtPath:[[self documentPath] stringByAppendingPathComponent:@"nimeide"] withIntermediateDirectories:YES attributes:nil error:nil];
    if (result) {
        NSLog(@"创建成功");
    }else{
        NSLog(@"创建错误");
    }

9、跳到钦定文件的偏移量 – (void)seekToFileOffset:(unsigned long
long)offset;

复杂对象指的是在Foundation框架内不设有的数据类,如自定以的Person类,像这种自定义的类是不能在前后相继内部通过writeToFile:那几个措施写入到文件内既然复杂对象不能运用在那之中方法开展数量悠久化,那么只好通过将复杂对象转换到NSData,然后在通过下边包车型大巴艺术写入文件,而这种转移的步调就被称作归档,从文件中读取NSData数据,将NSData转变为复杂性对象,那个手续就是反归档

文件管理器的应用

创办文件夹

- (IBAction)createDirectory:(UIButton *)sender
{
    // 1.找到Caches的路径
    NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
    // 2.获取创建的文件夹的路径
    NSString *directoryPath = [cachePath stringByAppendingPathComponent:@"downloadImages"];
    // 3.创建文件夹需要一个文件管理对象(单例)
    NSFileManager *fileManager = [NSFileManager defaultManager];
    // 4.创建文件夹
    [fileManager createDirectoryAtPath:directoryPath withIntermediateDirectories:YES attributes:nil error:nil];

    NSLog(@"%@", directoryPath);
}

创制文件以及获得文件新闻

- (IBAction)createFile:(UIButton *)sender
{
    // 1.得到Documents的路径
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    // 2.创建一个文件路径
    NSString *filePath = [docPath stringByAppendingPathComponent:@"qiuxiang.txt"];
    // 3.创建文件首先需要一个文件管理对象
    NSFileManager *fileManager = [NSFileManager defaultManager];
    // 4.创建文件
    [fileManager createFileAtPath:filePath contents:[@"badaas;ldkjf;alskdjf;akjdsf;lakjsdflakjsd;flkajsdlfkjasdlfkjasldfkja;lsdfkjasldkjf;asldkfj;asfjas;ldkfjasldkfjasldkfja;lsdkfjasl;dkjfs;ladkfja;sdkfjalsdkfjalsdfkja;sdfkja;dfkja;slfkdjsalkfja;slfkja;slkdfj" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];

    NSLog(@"%@", filePath);

    // 获取默认文件或者某个文件夹的大小
    NSDictionary *dic = [fileManager attributesOfItemAtPath:filePath error:nil];
    NSLog(@"%@", dic);
    NSNumber *number = [dic objectForKey:NSFileSize];
    NSLog(@"%@", number);
}

文件移动

/**
    在Documents文件夹下,创建一个文件夹(path),在该文件夹下创建一个文件(test.txt),将一个图片对象存入到该文件中,然后在Caches文件夹下创建一个文件夹名为"testDirectroy",将test.txt文件移动到这个文件夹下.
 */


// 创建文件夹
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *dirPath = [docPath stringByAppendingPathComponent:@"path"];
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];

// 创建文件
NSString *filePath = [dirPath stringByAppendingPathComponent:@"test.txt"];
[fileManager createFileAtPath:filePath contents:nil attributes:nil];

// 将图片对象存入到该文件中
UIImage *image = [UIImage imageNamed:@"icon.jpg"];
NSData *data = UIImageJPEGRepresentation(image, 1.0);
[data writeToFile:filePath atomically:YES];
NSLog(@"%@", filePath);

// 移动文件
NSString *desPath = [docPath stringByAppendingPathComponent:@"test.txt"];
[fileManager moveItemAtPath:filePath toPath:desPath error:nil];

tmp目录

保留应用运转时所急需的一时数据,使用完成后在将相应的文件从该目录删除。应用尚未运营时,系统也可能有十分的大希望会免去该目录下的文本,iTunes不会联合该目录。诺基亚重启时,该目录下的文件被删除。

获得沙盒路线

NSString *path = NSHomeDirectory();

获得沙盒下文件目录的路线
有三种获得格局:
1.拼接字符串:

NSString *Documents = [path stringByAppendingString:@"/Documents"];

2.拼接路线

NSString *Documents2 = [path stringByAppendingPathComponent:@"Documents"];

3.系统提供的收获沙盒下目录路径的法子

NSString *Documents3 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO) firstObject];
//NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO) 方法返回值为只有一个元素的数组,所以去第一个元素

对此别的多个公文路线的获得情势都一律,系统提供的秘技有些区别

NSString *library3 = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
//对于Library文件获取路径方法,只是参数有些不一样
//获取library下的caches
    NSString *cachesStr = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];

获得tmp文件夹路线(系统提供的艺术)

NSString *tmpStr = NSTemporaryDirectory();

得到程序包路径

    NSString *appPath = [NSBundle mainBundle].resourcePath;

获取程序包内种的三个图纸能源(apple.png)路径

    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];

1、成立文件管理器对象 NSFileManager = [NSFileManager defaultManager];

 // 得到Documents路径 NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; // 创建一个文件路径 NSString *filePath = [docPath stringByAppendingPathComponent:@"objc.txt"]; // 创建文件首先需要一个文件管理对象 NSFileManager *fileManager = [NSFileManager defaultManager]; // 创建文件 [fileManager createFileAtPath:filePath contents:[@"Objective-C" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil]; NSLog(@"%@",filePath); // 获取某个文件或者某个文件夹的大小 NSDictionary *dic = [fileManager attributesOfItemAtPath:filePath error:nil]; NSLog(@"%@", dic); NSNumber *number = [dic objectForKey:NSFileSize]; NSInteger size = number.intValue; NSLog(@"%@", number);

1、每个应用程序的位移限制都限制在和睦的沙盒里

 // 获取到Caches文件夹路径 NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; // 获取创建文件夹的路径 NSString *dirPath = [cachePath stringByAppendingPathComponent:@"testDirectroy"]; // 创建文件管理对象 NSFileManager *fileManager = [NSFileManager defaultManager]; // 创建文件夹 [fileManager createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil]; NSLog(@"%@", dirPath);

UIImage *image = [UIImage imageWithData:data];

Documents:保存应用程序运转时生成的需求长久化数据,iTunes会自动备份该目录苹果公司建议将顺序中创制的活在前后相继浏览到的文书数量保存在该目录下,iTunes备份和回复的时候会席卷此目录

Library:存款和储蓄程序的默许设置和其余景况新闻,iTunes会自动备份该文件目录

  1. Library/Caches:贮存慢存文件,iTunes不会备份此目录,此目录下文件不会在使用退出时去除,常常寄放体积相当的大,但实际不是很重点的财富
  2. Library/Preferences:保存应用的具有偏心设置,iOS的Setting应用会在该目录中搜寻应用的装置新闻,iTunes会自动备份该目录。——PS:要是您想对偏爱设置开展对应的操作,应该使用NSUserDefaults类来收获和装置应用程序的偏心,实际不是一贯开立偏心设置文件

tmp:保存应用程序运转时所需的有时数据,使用达成后再将相应的文书从该目录删除,应用尚未运转时,系统也可以有不小恐怕会免去该目录下的公文,iTunes不会联手该目录,你的魅族重启时,该目录下的文件会被删除

  • (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)desPath
    error:(NSError *)error;
 // 字符串写入沙盒 // 在Documents下面创建一个文本路径,假设文本名称为objc.txt NSString *txtPath = [docPath stringByAppendingPathComponent:@"objc.txt"]; // 此时仅存在路径,文件并没有真实存在 NSString *string = @"Objective-C"; // 字符串写入时执行的方法 [string writeToFile:txtPath atomically:YES encoding:NSUTF8StringEncoding error:nil]; NSLog(@"txtPath is %@", txtPath); // 字符串读取的方法 NSString *resultStr = [NSString stringWithContentsOfFile:txtPath encoding:NSUTF8StringEncoding error:nil]; NSLog(@"resultStr is %@", resultStr);

 

  • PS:三番五次点击叁次鼠标左键,选中光标所在地点的行,双击选中光标所在地点的单词

三、复杂对象的读写(I/O)操作

沙盒文件系统目录获取某些模拟器下有些应用程序沙盒的所在地方

3、展开三个文件准备更新 + (id)fileHandleForUpdatingAtPath:(NSString
*)path;

一句话来讲对象iOS中提供五类别型能够一向开展文件存取:

NSData *foo_data = UIImagePNGRepresentation(image);

得到沙盒内文件的路径

 

沙盒的定义:沙盒是每三个iOS应用程序都会自行创造的一个文件系统目录,何况沙盒还可能有着独立、封闭、安全的特点。

牢记:1、复杂对象写入文件的长河(复杂对象->归档->NSData->writeToFile)

  • 包括上述类型的子类

NSString *foo_str = @”this is a test”;

  1. iOS中的沙盒不止是四个文件目录,TA其实更是一种安全系统
  2. TA规定了应用程序只可以在为该应用程序创设的文本夹内访谈文件,不能访谈别的沙盒内的剧情(iOS已经局地开花访谈)
  3. 具备的非代码文件都保留在沙盒中,图片、音频、录像、属性列表、sqlite数据库以及文本文件等。

注:1、每一个应用程序都会具有二个应用程序沙盒。

// 对person对象进行归档时,此方法执行。// 对person中想要进行归档的所有属性,进行序列化操作。-encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeInteger:self.age forKey:@"age"];}// 对person对象进行反归档时,该方法执行。// 创建一个新的person对象,所有属性都是通过反序列化得到的。-initWithCoder:(NSCoder *)aDecoder { self = [super init]; if  { self.name = [aDecoder decodeObjectForKey:@"name"]; self.age = [aDecoder decodeIntegerForKey:@"age"]; } return self;}// 准备一个NSMutableData, 用于保存归档后的对象NSMutableData *data = [NSMutableData data];// 创建归档工具NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingMutableData:data];// 归档[archiver encodeObject:p] forKey:@"p1"];// 结束[archiver finishEncoding];// 拼音写入沙盒路径NSString *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];NSString *filePath = [caches stringByAppendingPathComPonent:@"person"];// 写入沙盒[data writeToFile:filePath atomically:YES];// 反归档// 从filePath文件路径读取NSData *data = [NSData dataWithContentsOfFile:filePath];// 反归档工具NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];// 反归档成对象Person *p2 = [unArchiver decodeObjectForKey:@"p1"];// 反归档结束[unArchiver finshDeoding];

二、文件管理器与公事对接器

  1. 其次,完结公约中的多个措施:

 

文件管理器与公事连接器之间的界别

//通过将writeToFile:atomically:encoding:error:方法发送给字符串对象实现字符串存款和储蓄到文件内的效应

应用程序的沙盒目录应用程序的沙盒目录下有所多少个很特其余文件夹分别是Documents、Library(具备Caches和Preferences目录)、tmp。

什么开展归档与反归档

 // 创建文件夹 NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *pathPath = [docPath stringByAppendingPathComponent:@"path"]; // 创建文件 NSString *path = [pathPath stringByAppendingPathComponent:@"test.txt"]; NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString *dirPath = [cachePath stringByAppendingPathComponent:@"testDirectroy"]; NSString *desPath = [dirPath stringByAppendingPathComponent:@"test.txt"]; // 创建文件管理器对象,进行文件移动操作 NSFileManager *fileManager = [NSFileManager defaultManager]; // 移动文件 [fileManager moveItemAtPath:path toPath:desPath error:nil]; // 移动文件的核心代码

[foo_str writeToFile:strPath atomically:YES
encoding:NSUTF8StringEncoding error:nil];

  1. 首先,遵守NSCoding协议

4、从设备或通道重返可用的多少 – (NSData *)availableData;

  • PS1:上边的文书路线就是三个应用程序的沙盒所在地点,也正是沙盒的根目录
  • PS2:第三个粗体展现的路子是设备的门路,第一个粗体显示的不二诀窍表示那么些应用程序沙盒的不二等秘书诀