NSFileHandle的用法(用于读写文件)
利用NSFilehandle类提供的方法,允许更有效地使用文件。
一般而言,处理文件时都要经历以下三个步骤:
1.打开文件,并获取一个NSFileHandle对象,以便在后面的I/O操作中引用该文件
2.对打开的文件执行I/O操作(读取、写入、更新)
3.关闭文件
下面总结了一些常用的NSFileHandle的方法,在这个表中,fh是一个NSFileHandle对象,data是一个NSData对象,path是一个NSString 对象,offset是一个Unsigned long long变量。

上表中并为列出获取NSFileHandle以用于标准输入、标准输出、标准错误和空设置的方法。他们的格式为fileHandleWithDevice,其中Device可以是StandardInput、StandardOutput、StandardError或者NullDevice。
应该注意到,NSFileHandle类并没有提供创建文件的功能。必须使用NSFileManager方法来创建文件。因此,方法fileHandleForWritingAtPath:和hfileHandleUpdatingAtPath:都假定文件已经存在,否则返回nil。对于这两个方法,文件的偏移量都设为文件的开始,所以都是在文件的开始位置开始写入(或更新模式的读取)。另外,如果在UNIX系统下编程应该注意,打开用于读取的文件,不要截断文件;如果想要这么做,不得不自己完成这项操作。
下面的代码用于打开已经创建好的文件testfile文件,读取它的内容,并将其复制到名为testout的文件中。
#import <Foundation/Foundation.h> int main(int argc, const char * argv[])
{ @autoreleasepool { NSFileHandle *inFile, *outFile;
NSData *buffer;
//[[NSFileManager defaultManager] createFileAtPath:@"test.txt" contents:@"sdfjdsfdf" attributes:nil]; //打开testfile.txt文件用于读取操作
inFile = [NSFileHandle fileHandleForReadingAtPath:@"testfile.txt"]; if(inFile == nil)
{
NSLog(@"Open of testfile.txt for reading failed!");
return ;
} //创建一个文件用于写数据(第一次是必要的)
[[NSFileManager defaultManager] createFileAtPath:@"testout.txt" contents:nil attributes:nil] ; //打开testout.txt文件用于写入操作
outFile = [NSFileHandle fileHandleForWritingAtPath:@"testout.txt"]; if(outFile == nil)
{
NSLog(@"Open of testout.txt for writing failed!");
return ;
}
代码分析:
方法readDataToEndOfFile:每次从文件中读取最多UINT_MAX个字节的数据,这个量定义在头文件<limits.h>中,并且在许多系统中值等于FFFFFFFF(16进制)。这个值对于你h编写的任何应用程序而言,已经足够大了。还可以中断这项操作,以执行少量读取和写入。利用方法readDataOfLength:甚至可以设置循环,一次在文件之间传输一缓冲区的字节。缓冲区的大小可能是8192(8Kb)字节,也可以是131072(128Kb)字节。经常使用的是2的乘方,这是因为底层操作系统通常是以块为单位执行I/O操作的,而块的大小一般为2的乘方个字节。可能要在系统上试用不同的值,以查看那个值最合适。
如果读取方法到大文件的末尾,并且没有读到任何数据那么这个方法将返回一个空的NSData对象(也就是说,缓冲区中没有字节)。可以对这个缓冲区应用length方法,并测试长度是否等于0,以查看该文件中是否还剩有数据可以读取。
如果打开一个要更新的文件,则文件的偏移量要被设置为文件的开始。通过在文件中定位(seeking),可以更改偏移量,然后执行该文件的读写操作。因此,要定位到文件 (文件的句柄为databaseHandle)的第10个字节,可以编写如下的消息表达式:
[databaseHandle seekToFileOffset:];
通过获得当前的文件偏移量,然后加上或者减去这个值,就得到相对文件位置。因此,要跳过文件中当前位置之后的128个字节,编写如下代码:
[databaseHandle seekToFileOffset:[databaseHandle offsetInFile] + ];
要在文件中向回移动5个整数所占的子结束,编写如下代码:
[databaseHandle seekToFileOffset:[databaseHandle offsetInFile] - * sizeof(int)];
假如你想从文件的某个固定位置开始往下读取文件到末尾,可以编写如下代码:
NSFileHandle *filepath = [NSFileHandle fileHandleForReadingAtPath:@"\text.text"];
[filepath seekToEndOfFile];
[filepath seekToFileOffset:[filepath offsetInFile] - * sizeof(char)]; //这里假设从倒数第一百个字节开始读取文件
NSData *data = [filepath readDataToEndOfFile];
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSFileHandle的用法(用于读写文件)的更多相关文章
- FileIputeStream用于读写文件,并且用字节的方式表示出来
package com.Java; import java.io.FileInputStream; import java.io.FileNotFoundException; import java. ...
- 笨方法学python之读写文件、open函数的用法
一.python读写文件相关知识点 close:关闭文件 read:读取文件的内容//你可以把结果赋给一个变量 readline:只读取文件中的一行 truncate 美 /trʌŋ'ket/ :清空 ...
- python读写文件中read()、readline()和readlines()的用法
python中有三种读取文件的函数: read() readline() readlines() 然而它们的区别是什么呢,在平时用到时总会遇到,今天总结一下. 0. 前期工作 首先新建一个文件read ...
- 二十一、utl_file(用于读写OS文件)
1.概述 作用:用于读写OS文件.使用该包访问OS文件时,必须要为OS目录建立相应的DIRECTORY对象..当用户要访问特定目录下的文件时,必须要具有读写DIRECTORY对象的权限.在使用UTL_ ...
- 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库
57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...
- Android 读写文件
Android 读写文件 Android使用一个非常类似与其他平台上的基于磁盘的文件系统. 这节课讲述如何利用File APIs在Android文件系统中读写文件. File 对象非常适合于流式顺序数 ...
- Java编程的逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- LINUX文件格式化读写(文件指针,缓冲)
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- 字符编码codecs模块(读写文件)
python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理.有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码, ...
随机推荐
- Leetcode9_回文数
哈哈哈哈哈哈哈太开心了,今天的代码耗时和内存消耗比官方少了一半哈哈 (因为官方用C#写的,我用C++,手动狗头) 题目 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样 ...
- 实现JS脏话筛选替换的几种途径
一.逐个替换用replace 缺点:筛选的脏话集太少 var oSize = $(this).siblings('.flex-text-wrap').find('.comment-input').va ...
- php的header方法
http://www.cnblogs.com/fengzheng126/archive/2012/04/21/2461475.html
- 前端-html-长期维护
############### 前端学什么? ################ # 前端三大部分 # HTML,页面内容,学习标签 # CSS,页面样式,学习选择器和属性 # JS,页面 ...
- ESTScan|EORF|Augustus|nr|PSM|
生物信息学方法的目的有二:1.常规找鉴定已知蛋白2.鉴定新蛋白 控制数据库大小可以通过增多酶切使得大数据库灵敏性增高数据量变小: 分步搜索是对于经典方法使用后找不到的新蛋白进行补充挖掘,预测蛋白与高可 ...
- The Mean of the Sample Mean|Standard Deviation of the Sample Mean|SE
7.2 The Mean and Standard Deviation of the Sample Mean Recall that the mean of a variable is denote ...
- uname|mv|tar -xzvf|
$ ls CAFE-4.2.1.tar.gz mcl-latest.tar.gz mysql-5.4.3-beta-linux-i686-glibc23.tar.gz.1 orthomclSoftwa ...
- 五、RabbitMQ Java Client基本使用详解
Java Client的5.x版本系列需要JDK 8,用于编译和运行.在Android上,仅支持Android 7.0或更高版本.4.x版本系列支持7.0之前的JDK 6和Android版本. 加入R ...
- C语言占位符(待完善)
%c 读入一个字符 %s 读入一个字符串,遇到空格制表符或者换行符时结束. %d 读入一个十进制整数 %x或者%X 读入一个十六进制整数(读出时,%x:小写,%X:大写) %o 读入一个八进制 ...
- php 正则获取html任意标签
<?php $temp = ' <div class="num">1</div> <div class="num">2 ...