• OC学习15——文件I/O体系


      OC提供了丰富的I/O相关API,如果只是管理文件和目录,程序可以使用NSFileManager进行管理,包括创建、删除、移动和复制文件等;如果程序需要读取文件内容,则可通过NSFileHandle进行处理;如果需要读取网络资源,则可通过NSURL进行处理;如果程序只是读取项目内部资源,则可借助MSBundle进行处理。

    1、Foundation提供了NSData和NSMutableData,他们代表OC的数据缓冲区。NSData的作用有两个:将数据读入NSData;输出NSData的数据。

     1 #import <Foundation/Foundation.h>
     2 
     3 int main(int argc , char * argv[])
     4 {
     5     @autoreleasepool{
     6         // 使用NSData读取指定URL对应的数据
     7         NSData* data = [NSData dataWithContentsOfURL:
     8             [NSURL URLWithString:@"http://www.crazyit.org/ethos.php"]];
     9         NSLog(@"%ld" , [data length]);
    10         // 定义一个长度为100的数组
    11         char buffer[100];
    12         // 将NSData指定范围的数据读入数组
    13         [data getBytes:buffer range: NSMakeRange(103, 100)];
    14         // 输出数组的内容
    15         NSLog(@"%s" , buffer);
    16         // 直接将NSData的数据用UTF-8的格式转换字符串
    17         NSString* content = [[NSString alloc] initWithData:data 
    18             encoding:NSUTF8StringEncoding];
    19         NSLog(@"----------输出网页内容---------");
    20         NSLog(@"%@" , content);
    21     }
    22 }
    NSData示例

    2、使用NSFileManager管理文件和目录

    • 相对路径:不以斜线开头的路径都是相对路径。相对路径都是以当前路径下为基础路径,随着当前路径的不同,同一个相对路径实际代表的文件可能发生变化,在终端窗口输入pwd可以看到当前路径。
    • 绝对路径:以斜线(代表根目录)开头的路径都是绝对路径。绝对路径是唯一的,它代表的文件或目录总是固定的。

      此外,Mac OS X中还包括几个特殊的路径:

    • ~:代表当前用户的home目录,eg:当前用户是"keli",则~代表的/Users/keli
    • .:代表当前目录
    • ..:代表当前目录的上一级目录

      NSFileManager可以访问文件的属性和内容,具体相关方法查询 NSFileManager文档

     1 #import <Foundation/Foundation.h>
     2 
     3 int main(int argc , char * argv[])
     4 {
     5     @autoreleasepool{
     6         NSFileManager* fm = [NSFileManager defaultManager];
     7         // 将会输出代表真的1
     8         NSLog(@"NSFileManagerTest.m是否存在:%d", 
     9             [fm fileExistsAtPath:@"NSFileManagerTest.m"]);
    10         BOOL isDir;
    11         NSLog(@"NSFileManagerTest.m是否存在:%d", 
    12             [fm fileExistsAtPath:@"NSFileManagerTest.m"
    13             isDirectory: &isDir]);
    14         // 将会输出代表假的0
    15         NSLog(@"NSFileManagerTest.m是否为目录:%d", isDir);
    16         // 将会输出代表真的1
    17         NSLog(@"NSFileManagerTest.m是否为可读文件:%d", 
    18             [fm isReadableFileAtPath:@"NSFileManagerTest.m"]);
    19         // 将会输出代表真的1
    20         NSLog(@"NSFileManagerTest.m是否为可写文件:%d", 
    21             [fm isWritableFileAtPath:@"NSFileManagerTest.m"]);
    22         // 将会输出代表假的0
    23         NSLog(@"NSFileManagerTest.m是否为可执行文件:%d", 
    24             [fm isExecutableFileAtPath:@"NSFileManagerTest.m"]);
    25         // 将会输出代表真的1
    26         NSLog(@"NSFileManagerTest.m是否为可删除文件:%d", 
    27             [fm isDeletableFileAtPath:@"NSFileManagerTest.m"]);    
    28         // 获取NSFileManagerTest.m文件所在的路径组件
    29         NSArray* array = [fm componentsToDisplayForPath:
    30             @"NSFileManagerTest.m"];
    31         NSLog(@"--NSFileManagerTest.m所在路径的完整路径组件为:--");
    32         for(NSObject* ele in array)
    33         {
    34             NSLog(@"%@ , " , ele);
    35         }
    36         // 获取文件的相关属性
    37         NSDictionary* attr = [fm attributesOfItemAtPath:@"NSFileManagerTest.m"
    38             error:nil];
    39         // 获取文件属性的详情
    40         NSLog(@"NSFileManagerTest.m的创建时间为:%@",
    41             [attr fileCreationDate]);
    42         NSLog(@"NSFileManagerTest.m的属主账户为:%@",
    43             [attr fileOwnerAccountName]);
    44         NSLog(@"NSFileManagerTest.m的文件大小为:%lld",
    45             [attr fileSize]);
    46         // 直接获取文件内容
    47         NSData* data = [fm contentsAtPath:@"NSFileManagerTest.m"];
    48         // 直接将NSData的数据用UTF-8的格式转换字符串
    49         NSString* content = [[NSString alloc] initWithData:data 
    50             encoding:NSUTF8StringEncoding];
    51         NSLog(@"----------输出文件内容---------");
    52         NSLog(@"%@" , content);
    53     }
    54 }
    NSFileManager示例1

      NSFileManager对文件或目录进行创建、删除、移动和复制:

     1 #import <Foundation/Foundation.h>
     2 
     3 int main(int argc , char * argv[])
     4 {
     5     @autoreleasepool{
     6         NSFileManager* fm = [NSFileManager defaultManager];
     7         // 创建目录
     8         [fm createDirectoryAtPath:@"xyz/abc"
     9             // 该参数指定如果父目录不存在,创建父目录
    10             withIntermediateDirectories:YES
    11             attributes:nil 
    12             error:nil];
    13         NSString* content = @"《疯狂iOS讲义》是我正在学习的图书!";
    14         // 创建一份文件
    15         [fm createFileAtPath:@"myInfo.txt"
    16             contents:[content dataUsingEncoding:NSUTF8StringEncoding]
    17             attributes:nil];
    18         // 复制一份新文件
    19         [fm copyItemAtPath:@"myInfo.txt"
    20             toPath:@"copyInfo.txt"
    21             error:nil];
    22     }
    23 }
    NSFileManager示例2

      查看目录包含的内容:

     1 #import <Foundation/Foundation.h>
     2 
     3 int main(int argc , char * argv[])
     4 {
     5     @autoreleasepool{
     6         NSFileManager* fm = [NSFileManager defaultManager];
     7         // 获取指定目录下所有文件和文件夹
     8         NSArray * array = [fm contentsOfDirectoryAtPath:@"."
     9             error:nil];
    10         for(NSString* item in array)
    11         {
    12             NSLog(@"%@" , item);
    13         }
    14         // 获取指定目录下所有文件和文件夹对应的枚举器
    15         NSDirectoryEnumerator* dirEnum =
    16             [fm enumeratorAtPath:@"."];
    17         NSString *file;
    18         // 枚举dirEnum中包含的每个文件
    19         while ((file = [dirEnum nextObject])) 
    20         {
    21             // 如果该文件的文件名以.m结尾
    22             if ([[file pathExtension] isEqualToString: @"m"]) {
    23                 // 直接获取文件内容
    24                 NSData* data = [fm contentsAtPath:file];
    25                 // 直接将NSData的数据用UTF-8的格式转换字符串
    26                 NSString* content = [[NSString alloc] initWithData:data 
    27                     encoding:NSUTF8StringEncoding];
    28                 NSLog(@"----------输出文件内容---------");
    29                 NSLog(@"%@" , content);
    30             }
    31         }
    32         // 获取当前目录下的所有子目录
    33 //        NSArray* subArr = [fm subpathsOfDirectoryAtPath:@"." 
    34 //            error:nil];
    35         NSArray* subArr = [fm subpathsAtPath:@"."];
    36         for(NSString* item in subArr)
    37         {
    38             NSLog(@"%@" , item);
    39         }
    40     }
    41 }
    NSFileManager示例3

    4、使用NSPathUtilities.h管理路径,NSPathUtilities.h包含了对NSString类的扩展,从而为NSString类新增了一些专门用于操作路径的方法,这些方法的主要作用就是更方便第操作路径

     1 #import <Foundation/Foundation.h>
     2 
     3 int main(int argc , char * argv[])
     4 {
     5     @autoreleasepool{
     6         NSLog(@"当前用户名为:%@" , NSUserName());
     7         NSLog(@"当前用户的完整用户名为:%@" , NSFullUserName());
     8         NSLog(@"当前用户的home目录为:%@" , NSHomeDirectory());
     9         NSLog(@"root用户的home目录为:%@" , 
    10             NSHomeDirectoryForUser(@"root"));
    11         NSLog(@"系统临时目录为:%@" , 
    12             NSTemporaryDirectory());
    13         NSString* path = @"~root";
    14         // 将~root解析成root用户的home目录
    15         NSLog(@"解析~root的结果:%@" ,
    16             [path stringByExpandingTildeInPath]);
    17         NSString* path2 = @"/Users/yeeku/publish";
    18         // 将会输出~/publish
    19         NSLog(@"替换成~的形式:%@" ,
    20             [path2 stringByAbbreviatingWithTildeInPath]);
    21         NSArray* array = [path2 pathComponents];
    22         // 遍历该路径中包含的各路径组件
    23         for(NSString* item in array)
    24         {
    25             NSLog(@"%@" , item);
    26         }
    27         // 在path2路径后追加一个路径
    28         NSString* path3 = [path2 stringByAppendingPathComponent:@"abc.m"];
    29         NSLog(@"path3为:%@" , path3); 
    30         // 获取路径的最后部分
    31         NSString* last = [path3 lastPathComponent];
    32         NSLog(@"path3的最后一个路径组件为:%@" , last);
    33         // 获取路径的最后部分的扩展名
    34         NSLog(@"path3的最后一个路径的扩展名为:%@" , 
    35             [path3 pathExtension]);        
    36     }
    37 }
    NSPathUtilities示例

    5、使用NSProcessInfo获取进程信息,包括获取运行该程序的参数、进程标识符等,还可以用于获取该进程所在系统的主机名、操作系统名、操作系统版本等信息。

     1 #import <Foundation/Foundation.h>
     2 
     3 int main(int argc , char * argv[])
     4 {
     5     @autoreleasepool{
     6         // 获取当前进程对应的ProcessInfo对象
     7         NSProcessInfo* proInfo = [NSProcessInfo processInfo];
     8         // 获取运行该程序所指定的参数
     9         NSArray* arr = [proInfo arguments];    
    10         NSLog(@"运行程序的参数为:%@" , arr);
    11         NSLog(@"进程标识符为:%d" ,
    12             [proInfo processIdentifier]);
    13         NSLog(@"进程的进程名为:%@" ,
    14             [proInfo processName]);
    15         NSLog(@"进程所在系统的主机名为:%@" 
    16             , [proInfo hostName]);
    17         NSLog(@"进程所在系统的操作系统为:%ld" 
    18             , [proInfo operatingSystem]);
    19         NSLog(@"进程所在系统的操作系统名为:%@" 
    20             , [proInfo operatingSystemName]);
    21         NSLog(@"进程所在系统的操作系统版本字符串为:%@"
    22             , [proInfo operatingSystemVersionString]);
    23         NSLog(@"进程所在系统的物理内存为:%lld"
    24             , [proInfo physicalMemory]);
    25         NSLog(@"进程所在系统的处理器数量为:%ld" 
    26             , [proInfo processorCount]);
    27         NSLog(@"进程所在系统的激活的处理器数量为:%ld" 
    28             , [proInfo activeProcessorCount]);
    29         NSLog(@"进程所在系统的运行时间为:%f"
    30             , [proInfo systemUptime]);
    31     }
    32 }
    NSProcessInfo示例

    6、可以通过NSFileHandle读取文件内容,使用NSFileHandle的基本步骤如下:

    • 创建一个NSFileHandle,该NSFileHandle将会打开指定文件
    • 对打开的文件进行IO操作
    • 关闭文件
     1 #import <Foundation/Foundation.h>
     2 
     3 int main(int argc , char * argv[])
     4 {
     5     @autoreleasepool{
     6         // 打开一份文件准备读取
     7         NSFileHandle* fh = [NSFileHandle
     8             fileHandleForReadingAtPath:@"NSFileHandleTest.m"];
     9         NSData* data;        
    10         // 读取NSFileHandle中的256个字节
    11         while( [(data = [fh readDataOfLength:512]) length] > 0 )
    12         {
    13             NSLog(@"%ld" , [data length]);
    14             // 直接将NSData的数据用UTF-8的格式转换字符串
    15             NSString* content = [[NSString alloc] initWithData:data 
    16                 encoding:NSUTF8StringEncoding];
    17             NSLog(@"----------输出读取的512个字节的内容---------");
    18             NSLog(@"%@" , content);
    19         }
    20 
    21         // 关闭文件
    22         [fh closeFile];        
    23         // 打开一份文件准备写入
    24         NSFileHandle* fh2 = [NSFileHandle
    25             fileHandleForWritingAtPath:@"abc.txt"];
    26         if(!fh2)
    27         {
    28             // 创建一个NSFileManager对象
    29             NSFileManager* fm = [NSFileManager defaultManager];
    30             // 创建一份空的文件
    31             [fm createFileAtPath:@"abc.txt"
    32                 contents:nil
    33                 attributes:nil];
    34             fh2 = [NSFileHandle
    35                 fileHandleForWritingAtPath:@"abc.txt"];
    36         }
    37         NSString* myBook = @"疯狂iOS讲义";
    38         // 将指定内容写入底层文件
    39         [fh2 writeData:[myBook 
    40             dataUsingEncoding:NSUTF8StringEncoding]];
    41         // 关闭文件
    42         [fh2 closeFile];
    43     }
    44 }
    NSFileHandle示例
  • 相关阅读:
    java性能优化之HashMap,LinkedHashMap,TreeMap读取大量数据效率的比较
    jdk8 stream实现sql单表select a,b,sum(),avg(),max() from group by a,b order by a,b limit M offset N及其性能
    postgresql cstore_fdw性能测试
    Oracle JDBC prefetch: how to avoid running out of RAM
    mysql-创建用户报错ERROR 1396 (HY000): Operation CREATE USER failed for 'root'@'localhost'
    kafka外部访问设置
    mysql 排序长度限制之max_length_for_sort_data以及mysql两种排序算法
    mybatis三个执行器的差别
    Dubbo的集群容错与负载均衡策略及自定义(一致性哈希路由的缺点及自定义)
    mysql中包含长字段索引的优化
  • 原文地址:https://www.cnblogs.com/mukekeheart/p/7390388.html
Copyright © 2020-2023  润新知