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

一、读写方法对比:(主要针对本地读取本地文件)

方式\操作
非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 [email protected]"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;
}

推荐阅读:

http://www.itstrike.cn/Question/0bdc7287-c70a-416b-a013-3914493a599c.html

时间: 2024-10-19 12:48:14

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

JSP下载txt 和 Excel两种文件

JSP下载txt 和 Excel两种文件 jsp 下载txt文件和excel文件 jsp 下载txt文件和excel文件 最近做了个用jsp下载的页面 将代码贴出来 权作记录吧 1 下载txt文件 这个花了我不少时间 原因是用ie下载txt文件时是在页面中直接打开了文件.虽然查了一些资料,也看了别人的解决方案,可还是解决不了问题,最后发现是一个字母惹的祸:少写一个字母 嘿嘿 够马虎!!! 代码如下: OutputStream o=response.getOutputStream();   byt

有关文件读取写入 和两种文件打开模式的理解

文件有两种打开模式:文本模式和二进制模式 当c语言程序对文件操作时,先以某种模式打开文件,建立一个缓存去(读写模式下两个):缓存区中有文件的控制信息,然后用I/O函数操作文件. 对于fread和fwrite函数,不管文件是以什么模式打开的,fread和fwrite只会原样复制原始数据,而其他函数可能会对原始函数进行转化. 之后我们再用应用程序打开文件,取决于应用程序对文件的解释. 先写到这,等以后更加深一步了解了再补充.

Java多线程13:读写锁和两种同步方式的对比

读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有 完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务),但是效率非常低.所以在JDK中提供了一种读写锁 ReentrantReadWriteLock,使用它可以加快运行效率. 读写锁表示两个锁,一个是读操作相关的锁,称为共享锁:另一个是写操作相关的锁,称为排他锁.我把这两个操作理解为三句话: 1.读和读之间不互斥,因为读操作不会有线程安全问题 2.

《自拍教程》两种文件类型

计算机只认识0,1,所以计算机的世界, 所有的文件数据都应该是0,1组成的. 但是为了方便人类能阅读及理解, 逐步有了ASCII,UTF-8, GBK, GB2312等编码格式. 以上如果测试同学听晕乎,记住以下两种计算机文件的类型即可. 纯文本文件 人类可以识别的文字文本文件, 其文件以纯文本形式存储数据(数字和字母包括ASCII码和其他各国语言文字). 纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据, 以Windows操作系统为例,包括: table.datafram

常用的分布式锁和redis和zk两种分布式锁的对比

常用的分布式锁 一..基于数据库实现分布式锁 1. 悲观锁 利用select … where … for update 排他锁 注意: 其他附加功能与实现一基本一致,这里需要注意的是“where name=lock ”,name字段必须要走索引,否则会锁表.有些情况下,比如表不大,mysql优化器会不走这个索引,导致锁表问题. 2. 乐观锁 所谓乐观锁与前边最大区别在于基于CAS思想,是不具有互斥性,不会产生锁等待而消耗资源,操作过程中认为不存在并发冲突,只有update version失败后才

Android解析XML文档的两种方式的简单对比

Android之所以会用到解析XML文档,不仅与JAVA对XML的解析比较简单,而且还因为XML是Android在网络间传递信息的主要存储方式.下面我简单谈谈Android对XML文档解析的两种方式:dom和sax.dom解析方式是,解析方法将一个XML文件看成是一棵树.由数据结构的知识我们知道对树的处理比较简单,就是对树的节点进行增,删,改,查,这也是dom的一个最大优点.但是,dom方式在解析的时候是一次性就将整个XML文档读进内存,这坏处不用我说了吧,我宝贵的内存是禁不起这么折腾的. sa

Spring Boot + Vue 前后端分离,两种文件上传方式总结

在Vue.js 中,如果网络请求使用 axios ,并且使用了 ElementUI 库,那么一般来说,文件上传有两种不同的实现方案: 通过 Ajax 实现文件上传 通过 ElementUI 里边的 Upload 组件实现文件上传 两种方案,各有优缺点,我们分别来看. 准备工作 首先我们需要一点点准备工作,就是在后端提供一个文件上传接口,这是一个普通的 Spring Boot 项目,如下: SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/

基于python的selenium两种文件上传操作

方法一.input标签上传     如果是input标签,可以直接输入路径,那么可以直接调用send_keys输入路径,这里不做过多赘述,前文有相关操作方法. 方法二.非input标签上传 这种上传方式需要借助第三方工具,主要有以下三种情况: 1.AutoIt  去调用它生成的au3或者exe格式的文件 2.SendKeys第三方库(目前只支持到2.7版本) 网址:https://pypi.python.org/pypi/SendKeys 3.Python的pywin32库,通过识别对话框句柄来

两个文件内容差异对比,

比较两个单行文件的方法就我知道的而言有4种 用diff 用grep 用comm 用uniq [[email protected] ~]# echo "`seq 5`" >file1;cat file1 1 2 3 4 5 [[email protected] ~]# echo "`seq 2 7`" >file2;cat file2 2 3 4 5 6 7 1.用diff -c file1多的是"-"file2多的是"+&q