1.需要理解的知识

通常程序在运行中或者程序结束之后,需要保存一些信息,而且需要持久化存储信息,比如登陆信息、视频播放记录、收藏记录等等,那么我们可以采用以下几种方式对数据进行持久化保存.        
            1.文件
            2.plist
            3.归档

1.1单例模式
        单例模式是一种常用的设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在,而且自行实例化并向整个系统提供这个实例。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

其实单例类似C语言中的全局变量的结构体
            在整个程序生命周期内,该对象只有一份实例存在内存中

单例的作用:
            1. 可以在多个对象之间共享数据;
            2. 如果创建一个对象,要消耗很大的性能,可以选择使用单例。

<1>非标准的单例设计
            单例的创建方法通常以default/shared开头
            + (MyPlane *)defaultPlane{
                static MyPlane * plane = nil;
                @synchronized(self){
                    if (!plane) {
                        plane = [[self alloc]init];
                    }
                }
                return plane;
        }

//或者
        + (MyPlane *)sharePlane{
            static MyPlane * plane = nil;
            @synchronized(self){
                if (!plane) {
                    plane = [[self alloc]init];
                    }
                }
                return plane;
        }
        
    单例不需要release 或者 autorelease ,因为单例的生命周期为整个程序。

1.2文件
        <1>文件管理类NSFileManager
                1.NSFileManager    是一个单例类
                    对文件进行管理,必须要获取文件管理器NSFileManager类的对象
                    NSFileManager * fm = [NSFileManager defaultManager];

2.对文件进行管理操作
                    a.遍历查看目录下的文件
                    b.创建文件/目录(文件夹)
                    c.拷贝文件/目录
                    d.移动文件/目录
                    e.删除文件/目录

<2>文件句柄类NSFileHandle
                1.对文件进行读写首先需要NSFileHandle打开文件
                2.NSFileHandle对文件进行读写都是NSData类型的二进制数据
                3.NSData与NSString之间的相互转换
2.需要记住的知识
    2.1 NSFileManager
         <1>创建文件管理器单例对象
         NSFileManager * fm = [NSFileManager defaultManager];
     <2>遍历目录下的内容
            //浅度遍历
          - (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
            //深度遍历
            - (NSArray *)subpathsOfDirectoryAtPath:(NSString *)path error:(NSError **)error
        <3>判断文件是否存在
        - (BOOL)fileExistsAtPath:(NSString *)path;

<4>创建文件
            //创建普通文件
             - (BOOL)createFileAtPath:(NSString *)path contents:    
                (NSData *)data attributes:(NSDictionary *)attr;
        //创建目录
            - (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:     (BOOL)createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error ;
   
    <5>拷贝文件/目录
        - (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error ;
    <6>移动文件/目录
        - (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error ;
    <7>删除文件/目录
        - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;
    <8>获取文件属性    
        - (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error;

2.2 NSFileHandle
    2.2.1方法:
        <1>打开文件方法
                //以只读方式打开
       + (id)fileHandleForReadingAtPath:(NSString *)path;
                //以只写方式打开
            + (id)fileHandleForWritingAtPath:(NSString *)path;
                //以读写方式打开
            + (id)fileHandleForUpdatingAtPath:(NSString *)path;
            <2>读指定长度的数据
            - (NSData *)readDataOfLength:(NSUInteger)length;
            <3>从当前偏移量读到文件尾
            - (NSData *)readDataToEndOfFile;
            <4>设置文件偏移量
            - (void)seekToFileOffset:(unsigned long long)offset;
            <5>将文件偏移量定位到文件尾
            - (unsigned long long)seekToEndOfFile;
            <6>写文件
            - (void)writeData:(NSData *)data;

2.3 NSData
    //如果把字符串转化为NSData
        NSString *str = @"welcome to beijing";       
        NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
        
        //NSData 转化为字符串        
        NSString *newStr = [[NSString alloc] initWithData:data
         encoding:NSUTF8StringEncoding];

3  Plist
        <1> 什么是plist文件, plist文件的作用
                        1.plist文件:property list  属性列表文件,文件的内容只能是 NSString NSNumber             NSDate NSData NSArray NSDictionary类的对象内容,  不能保存其他类型数据.

2.作用:对一些登陆注册信息或者程序的配置信息(小数据)进行持久化存储

<2> 如何创建plist文件, 如何编辑plist文件
                        Plist文件内容的格式是XML语法格式
                        1.Xcode创建
                            1.点击File—>New File 弹出一对话框
                            2.iOS程序选中iOS栏中的Resource/Mac程序选中OS X 栏中的resource
                            3.点击Resource中的Property List 创建plist文件
                            4.点击文件中的'+'可以添加数据

2.代码创建
                        如果要把 NSString NSNumber NSDate NSData NSArray NSDictionary             的对象写入文件一般就用plist文件  
                        我们需要这些数据保存到一个数组或者字典中,然后调用数组和字典的相关函数把数            组NSArray或者字典NSDictionary写入plist文件
                        //NSArray和NSDictionary写文件方法
                        - (BOOL)writeToFile:(NSString *)path atomically:    
            (BOOL)useAuxiliaryFile;

<3> 如何在程序中读取plist文件数据
                        Plist文件的根节点(数据的最外层)通常是数组或者字典
                        如果Plist文件的根节点是字典那么使用字典的类方法
                        + (id)dictionaryWithContentsOfFile:(NSString *)path;
            读写Plist文件
                        如果根节点是数组那么使用数组的类方法
                        + (id)arrayWithContentsOfFile:(NSString *)path;
            读取Plist文件。
            注:上述两个方法只能读取Plist文件,不能读取其他格式的文件。

4  归档
                <1>什么是归档和解档
                    1.归档(也称对象序列化)就是通过某种格式把对象保存到本地文件,以便以后
            读回该对象的内容

2.解档(也称归档/读档)就是把归档的对象文件读成原来的对象的过程。
                    
              <2>如何归档和解档
                    1.系统类的归档和解档

2.归档的对象包括这个对象中的属性,它们所属类的都必须要遵守NSCoding
            协议才能归档和解档

<3>.自定义类的归档和解档
                        
                        如果自定义的类对象要进行归档那么这个对象的属性所属的类也必须要遵守
            归档协议NSCoding
                        必须实现以下两个方法:
                                //归档的时候调用的方法
                    - (void)encodeWithCoder:(NSCoder *)aCoder;
                        //解归档的时候要调用的函数
                    - (id)initWithCoder:(NSCoder *)aDecoder;

#import <Foundation/Foundation.h>

@interface Person : NSObject <NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, retain) NSArray *parent;
@end #import "Person.h" @implementation Person
//归档时,自动调用的方法
- (void)encodeWithCoder:(NSCoder *)aCoder
{
// NSArchiver 继承于NSCoder
//将对象里面的每一项都进行归档
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
[aCoder encodeObject:self.parent forKey:@"parent"];
}
//构造方法--解档
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
self.parent = [aDecoder decodeObjectForKey:@"parent"];
}
return self;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"name: %@, age: %ld, parent: %@", _name,_age,_parent];
} #import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{ @autoreleasepool {
Person *xiaoming = [[Person alloc] init];
xiaoming.name = @"xiaoming";
xiaoming.age = 20;
xiaoming.parent = @[@"laoming",@"cuihua"]; //xioaming ---> 归档成文件
//能够使用归档方法---> 遵守NSCoding协议 BOOL ret = [NSKeyedArchiver archiveRootObject:xiaoming toFile:@"/Users/mac/Desktop/person.arc"];
if (ret) {
NSLog(@"归档成功");
}else {
NSLog(@"归档失败");
} Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/mac/Desktop/person.arc"]; NSLog(@"person = %@", person);
}
return 0;
}

OC第八节——目录操作和文件管理的更多相关文章

  1. 2019.5.13-5.17知识点:文件管理、目录操作、索引节点、软硬链接,vim文本编辑 知识点

    文件管理 ● cp 复制文件 cp /路径(原文件) /路径(复制文件)/文件重命名(可选)    -i:覆盖前询问    -r:递归复制目录及内部内容   -a:归档,相当于-dr --preser ...

  2. OC NSFileManager(文件路径操作)

    OC NSFileManager(文件路径操作) 初始化 NSFileManager * fm = [NSFileManager defaultManager]; 获取当前目录 [fm current ...

  3. OC中文件的操作

    OC中文件操作,在之前的文章中,已经接触到了文件的创建了,但是那不是很具体和详细,这篇文章我们就来仔细看一下OC中是如何操作文件的: 第一.首先来看一下本身NSString类给我们提供了哪些可以操作文 ...

  4. 【C#公共帮助类】FTPClientHelper帮助类,实现文件上传,目录操作,下载等动作

    关于本文档的说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利. 本人自从几年前走上编程之路,一直致力于收集 ...

  5. OC NSFileHandle(文件内容操作)

    OC NSFileHandle(文件内容操作) 初始化 [NSFileHandle fileHandleForUpdatingAtPath:@"data.txt"]; //file ...

  6. liunx学习(一):linux下目录操作大全

    Linux C函数之文件及目录函数(全):http://blog.sina.com.cn/s/blog_695e489c01013ldd.html linux目录操作发:http://www.cnbl ...

  7. Java基础知识系列——目录操作

    Java对目录操作的许多方法与上一篇文件操作的方法很多是一样的. java.io.File file = new File( "D:\1\2\3\4"); 1.递归创建目录 fil ...

  8. Python目录操作

    Python目录操作 os和os.path模块os.listdir(dirname):列出dirname下的目录和文件os.getcwd():获得当前工作目录os.curdir:返回但前目录('.') ...

  9. PHP 文件与目录操作函数总结

    >>>文件操作 打开 fopen();    打开文件 读取内容 fread();    从文件指针 handle 读取最多 length 个字节 readfile();    读入 ...

随机推荐

  1. 关于adb连接手机offline的问题解决

    win7-64位系统.对于windows系统,adb devices 显示offline一般可能有两个原因: 1 )端口被占用. 解决方式是:查找端口号,结束占用进程: adb nodaemon se ...

  2. UVA5135 Mining Your Own Business ( 无向图双连通分量)

    题目链接 题意:n条隧道由一些点连接而成,其中每条隧道链接两个连接点.任意两个连接点之间最多只有一条隧道.任务就是在这些连接点中,安装尽量少的太平井和逃生装置,使得不管哪个连接点倒塌,工人都能从其他太 ...

  3. php 简单分页类

    /**  file: page.class.php   完美分页类 Page  */ class Page {  private $total;          //数据表中总记录数  privat ...

  4. docker mysql

    创建mysql docker容器 github上有一个专门的docker-libary项目,里面有各种各样常用的docker镜像,可以做为学习的示例,今天研究下其中mysql镜像的用法,国内镜像dao ...

  5. 电脑中的Bois是什么

    电脑中的Bois是什么 BOIS= Basic Input/Output System,基本输入输出系统,全称是ROM-BOIS,是只读存储器基本输入/输出系统的简写,它实际是一组被固化到电脑中,为电 ...

  6. string length()

    #include <set> std::set<std::string> setName; int main() { std::string strName = "世 ...

  7. N-Gram

    N-Gram是大词汇连续语音识别中常用的一种语言模型,对中文而言,我们称之为汉语语言模型(CLM, Chinese Language Model).   中文名 汉语语言模型 外文名 N-Gram 定 ...

  8. Java排序算法——表插入排序

    //================================================= // File Name : ListInsertSort_demo //----------- ...

  9. JS实现元素拖动

    实现1 参考文献:http://www.cnblogs.com/cloudgamer/archive/2008/11/17/Drag.html 1.1 拖放效果 <!DOCTYPE html P ...

  10. python --- Python中的callable 函数

    python --- Python中的callable 函数 转自: http://archive.cnblogs.com/a/1798319/ Python中的callable 函数 callabl ...