zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Object-c:两种文件读写的对比

文件 对比 object 读写 两种
2023-09-27 14:23:59 时间

 

一、读写方法对比:(主要针对本地读取本地文件)
方式\操作
非URL方式

stringWithContentsOfFile

writeToFile

URL方式

stringWithContentsOfURL

writeToURL

实际开发中,大部分都采用URL方式。
对于写入操作,情况都是:如果文件存在,则覆盖原文件中的内容;如果文件不存在,则创建一个新文件
 
二、非URL方式
1.比较陌生的是文件写入的方法中,会有个atomically参数。
   atomically(原子性):设置YES时,没有写完,则会全部撤销(比较安全的做法)。
                                         设置NO时,没有写完,不会撤销。
2.NSError对象,可以通过localizedDescription方法获取报错信息。
 
 
例子:
//
//  main.m
//  字符串练习2:读写文件
//
//  Created by Apple on 15/12/7.
//  Copyright © 2015年 Apple. All rights reserved.
//
#import <Foundation/Foundation.h>
void readFile(NSString *path);
void writeToFile(NSString *path, NSString *str);

int main(int argc, const char * argv[]) {
    //读取文件中的内容
    //NSString *path1 = @"/Users/apple/Desktop/KeenApps/Object-C/Object-c-Test/字符串练习2:读写文件/1.txt";
    NSString *path1 = @"/Users/apple/Desktop/1.txt";
    NSLog(@"读取文件:");
    readFile(path1);

    //写入文件内容
    NSString *path2 = @"/Users/apple/Desktop/KeenApps/Object-C/Object-c-Test/字符串练习2:读写文件/2.txt";
    NSLog(@"写入文件");
    NSString *str = @"这是一个测试";
    writeToFile(path2,str);

    NSLog(@"读取文件:");
    readFile(path2);

    return 0;
}

 

//读取文件
void readFile(NSString *path){
    NSError *error = nil;
    NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
    if (error != nil) {
        NSLog([error localizedDescription]);//将错误信息输出来
    }
    else{
        NSLog(@"%@",str);
    }
}
//写入文件
void writeToFile(NSString *path, NSString *str){
    NSError *error = nil;
    //atomically : YES时,没有写完,则会全部撤销;NO时候,没有写完,不会撤销
    //注意:这种写入方式,如果文件补存在,则创建;如果文件存在,则覆盖原文件的内容
    BOOL flag = [str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];//一般error都设置为nil,保证写入成功
    if (flag) {
        NSLog(@"写入成功");
    }
    else{
        NSLog(@"写入失败");
    }
}
 
三、URL方式
URL方式,根据URL对象的创建方式,又分为两种:
一.通过URLWithString方法创建URL对象
1)路径:协议 + ip + 文件路径
访问本地资源:file:// + ip + /文件路径
访问网络资源:http:// + ip + /文件路径
注意:(1)读取本地资源的时候,ip地址可以省略,即:file:///文件路径(ip地址后面/不能省略,代表着根路径)
        (2)路径中如果包含中文的时候,需要使用stringByAddingPercentEscapesUsingEncoding方法或stringByAddingPercentEncodingWithAllowedCharacters方法进行路径进行编码,不然,会提示:The file couldn’t be opened because the specified URL type isn’t supported.(URL类型不支持)
 
例如:
NSString *path = @"file://192.168.1.103/Users/apple/Desktop/读写文件练习2/1.txt”;
//NSString *path = @"file:///Users/apple/Desktop/读写文件练习2/1.txt”;
//path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];//比较老的方法,现在被下面的方法取代
path = [path stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

NSURL *url = [NSURL URLWithString:path];

NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

if (error == nil) {
    NSLog(@"%@",str);
}
else{
        NSLog(@"%@",[error localizedDescription]);
} 
 
二.通过fileURLWithPath方法创建URL对象,访问本地资源

使用这个方法时,需要注意:

     1)系统会帮我们自动加入file://,我们不需要再添加。再添加,路径就不对了。

     2)即使URL中包含中文,都可以访问。系统会自动对包含的中文进行处理。所以一般开发中,访问本地资源,都使用这个方法。

 
例子:
NSString *path = @"/Users/apple/Desktop/读写文件练习2/1.txt”;
 
NSURL *url = [NSURL fileURLWithPath:path];

NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

if (error == nil) {
    NSLog(@"%@",str);
}
else{
    NSLog(@"%@",[error localizedDescription]);
}
 
三、综合例子:
//
//  main.m
//  读写文件练习2
//
//  Created by Apple on 15/12/7.
//  Copyright © 2015年 Apple. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    //一.文件读取
    //路径使用URL
    //1.加载本地文件。注意:file://,不是file:///
    NSString *path = @"file://192.168.1.103/Users/apple/Desktop/KeenApps/Object-C/Object-c-Test/读写文件练习2/1.txt";

    //如果加载的是本地资源,那么URL上的主机地址可以不要
    //注意:ip地址后面的斜杠不能省略!(其代表着跟路径)
    //path = @"file:///Users/apple/Desktop/KeenApps/Object-C/Object-c-Test/读写文件练习2/1.txt";

    //如果路径中包含中文,先进行编码
    //不编码的后果是:The file couldn’t be opened because the specified URL type isn’t supported.(URL类型不支持)
    //path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];//比较老的方法,现在被下面的方法取代
    //path = [path stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

    //2.加载网络资源
    //path = @"http://www.baidu.com";

    //NSURL *url = [NSURL URLWithString:path];

    //3.使用fileURLWithPath创建URL对象,加载本地资源。
    /*
     使用这个方法时,需要注意:
     1)系统会帮我们自动加入file://,我们不需要再添加。再添加,路径就不对了。
     2)即使URL中包含中文,都可以访问。系统会自动对包含的中文进行处理。所以一般开发中,访问本地资源,都使用这个方法。
     */
    path = @"/Users/apple/Desktop/KeenApps/Object-C/Object-c-Test/读写文件练习2/1.txt";
    NSURL *url = [NSURL fileURLWithPath:path];

    NSError *error = nil;
    
    NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
    if (error == nil) {
        NSLog(@"%@",str);
    }
    else{
        NSLog(@"%@",[error localizedDescription]);
    }


    //二.文件写入
    //路径使用URL
    NSError *error2 = nil;
    NSString *str2 = @"this is a test2";

    /*
    //第一种方式
    NSString *path2 =@"file:///Users/apple/Desktop/KeenApps/Object-C/Object-c-Test/读写文件练习2/2.txt";
    path2 = [path2 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"path2 = %@",path2);
    NSURL *url2 = [NSURL URLWithString:path2];
    */

    //第二种方式
    NSString *path2 = @"/Users/apple/Desktop/KeenApps/Object-C/Object-c-Test/读写文件练习2/2.txt";
    NSURL *url2 = [NSURL fileURLWithPath:path2];

    //注意:如果文件存在,则覆盖原文件的内容;如果文件不存在,则新建
    [str2 writeToURL:url2 atomically:YES encoding:NSUTF8StringEncoding error:&error2];
    if (error2 != nil) {
        NSLog(@"%@", [error2 localizedDescription]);
    }
    else{
        NSLog(@"文件写入成功!");
    }

    return 0;
}

 

 
推荐阅读: