1、首先是往文件里写入数据
WriteFile.h
#import
#import
@class NoteDb;
@interface WriteFile : NSObject{
//文件地址
NSString *parentDirectoryPath;
//输出流,写数据
NSOutputStream *asyncOutputStream;
//写数据的内容
NSData *outputData;
//位置及长度
NSRange outputRange;
//数据的来源
NoteDb *aNoteDb;
}
@property (nonatomic,retain) NSData *outputData;
@property (nonatomic,retain) NoteDb *aNoteDb;
//写数据
-(void)write;
@end
#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
ReadFile.h
#import
@class NoteDb;
@interface ReadFile : NSObject{
//路径
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
#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