【转】iphone 输入/输出流异步读写数据
1、首先是往文件里写入数据
WriteFile.h
- #import <Foundation/Foundation.h>
- #import <UIKit/UIKit.h>
- @class NoteDb;
- @interface WriteFile : NSObject<NSStreamDelegate>{
- //文件地址
- NSString *parentDirectoryPath;
- //输出流,写数据
- NSOutputStream *asyncOutputStream;
- //写数据的内容
- NSData *outputData;
- //位置及长度
- NSRange outputRange;
- //数据的来源
- NoteDb *aNoteDb;
- }
- @property (nonatomic,retain) NSData *outputData;
- @property (nonatomic,retain) NoteDb *aNoteDb;
- //写数据
- -(void)write;
- @end
实现文件WriteFile.m
- #import "WriteFile.h"
- #import "NoteDb.h"
- @implementation WriteFile
- @synthesize outputData,aNoteDb;
- -(id)init{
- self=[super init];
- if (!self) {
- [self release];
- return nil;
- }
- outputData=[[NSData alloc]init];
- aNoteDb=[[NoteDb alloc]init];
- return self;
- }
- -(void)write{
- //NSLog(@"%@",self.aNoteDb);
- //沙盒路径
- NSArray *paths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *documentsDirectory = [paths objectAtIndex:0];
- //文件名字是note.txt
- NSString *path = [documentsDirectory stringByAppendingPathComponent:@"note.txt"];
- [asyncOutputStream release];
- parentDirectoryPath = path;
- //数据源
- NSData *tmpdata = [NSKeyedArchiver archivedDataWithRootObject:self.aNoteDb.noteList];
- //self.outputData=[[NSData alloc]initWithData:tmpdata];
- self.outputData=tmpdata;
- //位置从哪开始
- outputRange.location=0;
- //创建文件
- [[NSFileManager defaultManager] createFileAtPath:parentDirectoryPath
- contents:nil attributes:nil];
- //初始化输出流
- asyncOutputStream = [[NSOutputStream alloc] initToFileAtPath: parentDirectoryPath append: NO];
- //回调方法,
- [asyncOutputStream setDelegate: self];
- //异步处理,
- [asyncOutputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
- //打开异步输出流
- [asyncOutputStream open];
- }
- -(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent{
- // NSLog(@"as");
- NSOutputStream *outputStream = (NSOutputStream*) theStream;
- BOOL shouldClose = NO;
- switch (streamEvent)
- {
- case NSStreamEventHasSpaceAvailable://读事件
- {
- //缓冲区
- uint8_t outputBuf [1];
- //长度
- outputRange.length = 1;
- //把数据放到缓冲区中
- [outputData getBytes:&outputBuf range:outputRange];
- //把缓冲区中的东西放到输出流
- [outputStream write: outputBuf maxLength: 1];
- //判断data数据是否读完
- if (++outputRange.location == [outputData length])
- {
- shouldClose = YES;
- }
- break;
- }
- case NSStreamEventErrorOccurred:
- {
- //出错的时候
- NSError *error = [theStream streamError];
- if (error != NULL)
- {
- UIAlertView *errorAlert = [[UIAlertView alloc]
- initWithTitle: [error localizedDescription]
- message: [error localizedFailureReason]
- delegate:nil
- cancelButtonTitle:@"OK"
- otherButtonTitles:nil];
- [errorAlert show];
- [errorAlert release];
- }
- shouldClose = YES;
- break;
- }
- case NSStreamEventEndEncountered:
- shouldClose = YES;
- }
- if (shouldClose)
- {
- //当出错或者写完数据,把线程移除
- [outputStream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
- //最后关掉输出流
- [theStream close];
- }
- }
- -(void)dealloc{
- [outputData release];
- [aNoteDb release];
- [super dealloc];
- }
- @end
2、其次是从文件里读出数据
ReadFile.h
- #import <Foundation/Foundation.h>
- @class NoteDb;
- @interface ReadFile : NSObject<NSStreamDelegate>{
- //路径
- NSString *parentDirectoryPath;
- //异步输出流
- NSInputStream *asyncInputStream;
- //读出来的数据
- NSMutableData *resultData;
- //返回去的数据
- NoteDb *aNoteDb;
- }
- @property(nonatomic,retain)NoteDb *aNoteDb;
- @property (nonatomic, retain) NSMutableData *resultData;
- //开始读数据
- -(void)read;
- //读出来的数据追加到resultData上
- - (void)appendData:(NSData*)_data;
- //
- - (void)dataAtNoteDB;
- //返回去的数据
- - (NoteDb*)getNoteDb;
- @end
实现文件ReadFile.m
- #import "ReadFile.h"
- #import "NoteDb.h"
- #import "NoteList.h"
- #import "WriteFile.h"
- @implementation ReadFile
- @synthesize aNoteDb,resultData;
- -(id)init{
- self=[super init];
- //aNoteDb=[[NoteDb alloc]init];
- resultData=[[NSMutableData alloc]init];
- return self;
- }
- -(void)read{
- //沙盒路径
- NSArray *paths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *documentsDirectory = [paths objectAtIndex:0];
- //文件名
- NSString *path = [documentsDirectory stringByAppendingPathComponent:@"note.txt"];
- /*
- if(![[NSFileManager defaultManager]fileExistsAtPath:path]){
- //如果不存在,就新建
- WriteFile *file=[[WriteFile alloc]init];
- [file write];
- [file release];
- }else{
- NSLog(@"有note.txt文件");
- }
- */
- [asyncInputStream release];
- parentDirectoryPath = path;
- //异步输入流初始化,并把赋于地址
- asyncInputStream =
- [[NSInputStream alloc] initWithFileAtPath: parentDirectoryPath];
- //设置代理(回调方法、委托)
- [asyncInputStream setDelegate: self];
- //设置线程,添加线程,创建线程:Runloop顾名思义就是一个不停的循环,不断的去check输入
- [asyncInputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
- forMode:NSDefaultRunLoopMode];
- //打开线程
- [asyncInputStream open];
- }
- //追加数据
- - (void)appendData:(NSData*)_data{
- [resultData appendData:_data];
- }
- //回调方法,不停的执行
- -(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent{
- BOOL shouldClose = NO;
- NSInputStream *inputStream = (NSInputStream*) theStream;
- //NSLog(@"as");
- switch (streamEvent)
- {
- case NSStreamEventHasBytesAvailable:
- {
- //读数据
- //读取的字节长度
- NSInteger maxLength = 128;
- //缓冲区
- uint8_t readBuffer [maxLength];
- //从输出流中读取数据,读到缓冲区中
- NSInteger bytesRead = [inputStream read: readBuffer
- maxLength:maxLength];
- //如果长度大于0就追加数据
- if (bytesRead > 0)
- {
- //把缓冲区中的数据读成data数据
- NSData *bufferData = [[NSData alloc]
- initWithBytesNoCopy:readBuffer
- length:bytesRead
- freeWhenDone:NO];
- //追加数据
- [self appendData:bufferData];
- //release掉data
- [bufferData release];
- }
- break;
- }
- case NSStreamEventErrorOccurred:
- {
- //读的时候出错了
- NSError *error = [theStream streamError];
- if (error != NULL)
- {
- UIAlertView *errorAlert = [[UIAlertView alloc]
- initWithTitle: [error localizedDescription]
- message: [error localizedFailureReason]
- delegate:nil
- cancelButtonTitle:@"OK"
- otherButtonTitles:nil];
- [errorAlert show];
- [errorAlert release];
- }
- shouldClose = YES;
- break;
- }
- case NSStreamEventEndEncountered:
- {
- shouldClose = YES;
- //数据读完就返回数据
- [self dataAtNoteDB];
- [theStream close];
- }break;
- }
- if (shouldClose)
- {
- //当文件读完或者是读到出错时,把线程移除
- [inputStream removeFromRunLoop: [NSRunLoop currentRunLoop]
- forMode:NSDefaultRunLoopMode];
- //并关闭流
- [theStream close];
- }
- }
- -(void) dataAtNoteDB{
- aNoteDb=nil;
- aNoteDb=[[NoteDb alloc]init];
- aNoteDb.noteList = [NSKeyedUnarchiver unarchiveObjectWithData:resultData];
- //NSLog(@"%@",aNoteDb);
- /*
- for (id tmp in aNoteDb.noteList.noteArray)
- {
- NSLog(@"tmp = %@",tmp);
- }
- */
- }
- - (NoteDb*)getNoteDb{
- return self.aNoteDb;
- }
- -(void)dealloc{
- [aNoteDb release];
- [resultData release];
- [super dealloc];
- }
- @end
【转】iphone 输入/输出流异步读写数据的更多相关文章
- C++学习笔记10_输入输出流.文件读写
//从键盘输入到程序,叫标准input:从程序输出到显示器,叫标准output:一并叫标准I/O //文件的输入和输出,叫文件I/O cout<<"hellow word&quo ...
- Java基础知识强化之IO流笔记57:数据输入输出流(操作基本数据类型)
1. 数据输入输出流(操作基本数据类型) (1)数据输入流:DataInputStream DataInputStream(InputStream in) (2)数据输出流:DataOutputStr ...
- 序列流、对象操作流、打印流、标准输入输出流、随机访问流、数据输入输出流、Properties(二十二)
1.序列流 * 1.什么是序列流 * 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推.* 2.使用方式 * 整合两个 ...
- 4、BufferedIn(out)putStream--->字节输入/输出流的缓冲区类(高效类:高效率读写)
前言 字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流 ...
- C++ 输入输出流 文本文件 二进制文件读写
文本文件/ASCII文件(能直接显示内容,费存储空间):文件中每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件或称字符文件. 二进制文件(不能显示内容,节 ...
- DataInputStream 数据类型数据输入输出流
package IOliu; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileI ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- Java中IO流,输入输出流概述与总结
总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...
- JAVA输入输出流
概述: 各种流类型(类和抽象类)都位于位于java.io包中,各种流都分别继承一下四种抽象流中的一种: 类型 字节流 字符流 输入流 InputStream Reader 输出流 OutputStre ...
随机推荐
- Rechnernetz
1.Der Aufbau des Internets 1.1 Randabschnitt Er besteht aus Rechner,der mit Internet verbunden ist.D ...
- OpenTLD在VS2012和opencv246编译通过
最近看到了TLD的跟踪视频,觉得很有意思,刚好最近在看行人检测所以就打算下载源码玩一玩,因为源码是Linux版本的(原作者写的是C++和MATLAB的混合编程)C++源码可以在我的博客TLD(一种目标 ...
- shell获取时间的相关命令
Linux shell获取时间和时间间隔(ms级别) 说明:在进行一些性能测试的时候,有时候我们希望能计算一个程序运行的时间,有时候可能会自己写一个shell脚本方便进行一些性能测试的控制(比如希望能 ...
- [转]C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
本文转自:http://www.cnblogs.com/landeanfen/p/5501487.html 阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T c ...
- 有关OLAP的一些概念
MR引擎: MapReduce:是一种离线计算框架,将一个算法抽象成Map和Reduce两个阶段进行处理,每个阶段都是用键值对(key/value)作为输入和输出,非常适合数据密集型计算.Map/Re ...
- 奇葩!把类型转成object
事情是这样的,客户做代码审核,要求把参数类型转换成方法传入需要的类型.额,有点绕,简单来说就是 Create(UIElement e)这个方法要在调用的时候穿进去的参数转换成UIElement,哦对了 ...
- Mybatis初始
1.Mybatis 的作用 完成基本的sql语句 和 存储过程 高级的对象关系映射(ORM) 框架 封装了几乎所有的 JDBC 代码 参数的手工设置 结果集的遍历 2.Mybatis 框架的主体构成 ...
- Rest架构下的增删改查
首先还是要连接一下什么是Rest, REST是英文representational state transfer(表象性状态转变)或者表述性状态转移;Rest是web服务的一种架构风格;使用HTTP, ...
- 阿里java面试题,你能答对多少?
答对以下这些面试题,可以淘汰掉 80 % 的求职竞争者. 1.hashcode相等两个类一定相等吗?equals呢?相反呢? 2.介绍一下集合框架? 3.hashmap hastable 底层实现什么 ...
- code.google.com certificate error: certificate is for www.google.com
有时候我们会碰到下面错误:code.google.com certificate error: certificate is for www.google.com,类似如下: D:\>go ge ...