【转】iphone 输入/输出流异步读写数据

原文:iphone 输入/输出流异步读写数据

分类: iphone2012-05-30 14:50 2484人阅读 评论(1) 收藏 举报

iphoneattributesinterfacepathstreamfile

1、首先是往文件里写入数据

WriteFile.h

[cpp] view plaincopy

  1. #import <Foundation/Foundation.h>
  2. #import <UIKit/UIKit.h>
  3. @class NoteDb;
  4. @interface WriteFile : NSObject<NSStreamDelegate>{
  5. //文件地址
  6. NSString *parentDirectoryPath;
  7. //输出流,写数据
  8. NSOutputStream *asyncOutputStream;
  9. //写数据的内容
  10. NSData *outputData;
  11. //位置及长度
  12. NSRange outputRange;
  13. //数据的来源
  14. NoteDb *aNoteDb;
  15. }
  16. @property (nonatomic,retain) NSData *outputData;
  17. @property (nonatomic,retain) NoteDb *aNoteDb;
  18. //写数据
  19. -(void)write;
  20. @end

实现文件WriteFile.m

[cpp] view plaincopy

  1. #import "WriteFile.h"
  2. #import "NoteDb.h"
  3. @implementation WriteFile
  4. @synthesize outputData,aNoteDb;
  5. -(id)init{
  6. self=[super init];
  7. if (!self) {
  8. [self release];
  9. return nil;
  10. }
  11. outputData=[[NSData alloc]init];
  12. aNoteDb=[[NoteDb alloc]init];
  13. return self;
  14. }
  15. -(void)write{
  16. //NSLog(@"%@",self.aNoteDb);
  17. //沙盒路径
  18. NSArray *paths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  19. NSString *documentsDirectory = [paths objectAtIndex:0];
  20. //文件名字是note.txt
  21. NSString *path = [documentsDirectory stringByAppendingPathComponent:@"note.txt"];
  22. [asyncOutputStream release];
  23. parentDirectoryPath = path;
  24. //数据源
  25. NSData *tmpdata = [NSKeyedArchiver archivedDataWithRootObject:self.aNoteDb.noteList];
  26. //self.outputData=[[NSData alloc]initWithData:tmpdata];
  27. self.outputData=tmpdata;
  28. //位置从哪开始
  29. outputRange.location=0;
  30. //创建文件
  31. [[NSFileManager defaultManager] createFileAtPath:parentDirectoryPath
  32. contents:nil attributes:nil];
  33. //初始化输出流
  34. asyncOutputStream = [[NSOutputStream alloc] initToFileAtPath: parentDirectoryPath append: NO];
  35. //回调方法,
  36. [asyncOutputStream setDelegate: self];
  37. //异步处理,
  38. [asyncOutputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]  forMode:NSDefaultRunLoopMode];
  39. //打开异步输出流
  40. [asyncOutputStream open];
  41. }
  42. -(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent{
  43. // NSLog(@"as");
  44. NSOutputStream *outputStream = (NSOutputStream*) theStream;
  45. BOOL shouldClose = NO;
  46. switch (streamEvent)
  47. {
  48. case NSStreamEventHasSpaceAvailable://读事件
  49. {
  50. //缓冲区
  51. uint8_t outputBuf [1];
  52. //长度
  53. outputRange.length = 1;
  54. //把数据放到缓冲区中
  55. [outputData getBytes:&outputBuf range:outputRange];
  56. //把缓冲区中的东西放到输出流
  57. [outputStream write: outputBuf maxLength: 1];
  58. //判断data数据是否读完
  59. if (++outputRange.location == [outputData length])
  60. {
  61. shouldClose = YES;
  62. }
  63. break;
  64. }
  65. case NSStreamEventErrorOccurred:
  66. {
  67. //出错的时候
  68. NSError *error = [theStream streamError];
  69. if (error != NULL)
  70. {
  71. UIAlertView *errorAlert = [[UIAlertView alloc]
  72. initWithTitle: [error localizedDescription]
  73. message: [error localizedFailureReason]
  74. delegate:nil
  75. cancelButtonTitle:@"OK"
  76. otherButtonTitles:nil];
  77. [errorAlert show];
  78. [errorAlert release];
  79. }
  80. shouldClose = YES;
  81. break;
  82. }
  83. case NSStreamEventEndEncountered:
  84. shouldClose = YES;
  85. }
  86. if (shouldClose)
  87. {
  88. //当出错或者写完数据,把线程移除
  89. [outputStream removeFromRunLoop: [NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
  90. //最后关掉输出流
  91. [theStream close];
  92. }
  93. }
  94. -(void)dealloc{
  95. [outputData release];
  96. [aNoteDb release];
  97. [super dealloc];
  98. }
  99. @end

2、其次是从文件里读出数据

ReadFile.h

[cpp] view plaincopy

  1. #import <Foundation/Foundation.h>
  2. @class NoteDb;
  3. @interface ReadFile : NSObject<NSStreamDelegate>{
  4. //路径
  5. NSString *parentDirectoryPath;
  6. //异步输出流
  7. NSInputStream *asyncInputStream;
  8. //读出来的数据
  9. NSMutableData *resultData;
  10. //返回去的数据
  11. NoteDb *aNoteDb;
  12. }
  13. @property(nonatomic,retain)NoteDb *aNoteDb;
  14. @property (nonatomic, retain) NSMutableData *resultData;
  15. //开始读数据
  16. -(void)read;
  17. //读出来的数据追加到resultData上
  18. - (void)appendData:(NSData*)_data;
  19. //
  20. - (void)dataAtNoteDB;
  21. //返回去的数据
  22. - (NoteDb*)getNoteDb;
  23. @end

实现文件ReadFile.m

[cpp] view plaincopy

  1. #import "ReadFile.h"
  2. #import "NoteDb.h"
  3. #import "NoteList.h"
  4. #import "WriteFile.h"
  5. @implementation ReadFile
  6. @synthesize aNoteDb,resultData;
  7. -(id)init{
  8. self=[super init];
  9. //aNoteDb=[[NoteDb alloc]init];
  10. resultData=[[NSMutableData alloc]init];
  11. return self;
  12. }
  13. -(void)read{
  14. //沙盒路径
  15. NSArray *paths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  16. NSString *documentsDirectory = [paths objectAtIndex:0];
  17. //文件名
  18. NSString *path = [documentsDirectory stringByAppendingPathComponent:@"note.txt"];
  19. /*
  20. if(![[NSFileManager defaultManager]fileExistsAtPath:path]){
  21. //如果不存在,就新建
  22. WriteFile *file=[[WriteFile alloc]init];
  23. [file write];
  24. [file release];
  25. }else{
  26. NSLog(@"有note.txt文件");
  27. }
  28. */
  29. [asyncInputStream release];
  30. parentDirectoryPath = path;
  31. //异步输入流初始化,并把赋于地址
  32. asyncInputStream =
  33. [[NSInputStream alloc] initWithFileAtPath: parentDirectoryPath];
  34. //设置代理(回调方法、委托)
  35. [asyncInputStream setDelegate: self];
  36. //设置线程,添加线程,创建线程:Runloop顾名思义就是一个不停的循环,不断的去check输入
  37. [asyncInputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
  38. forMode:NSDefaultRunLoopMode];
  39. //打开线程
  40. [asyncInputStream open];
  41. }
  42. //追加数据
  43. - (void)appendData:(NSData*)_data{
  44. [resultData appendData:_data];
  45. }
  46. //回调方法,不停的执行
  47. -(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent{
  48. BOOL shouldClose = NO;
  49. NSInputStream *inputStream = (NSInputStream*) theStream;
  50. //NSLog(@"as");
  51. switch (streamEvent)
  52. {
  53. case NSStreamEventHasBytesAvailable:
  54. {
  55. //读数据
  56. //读取的字节长度
  57. NSInteger maxLength = 128;
  58. //缓冲区
  59. uint8_t readBuffer [maxLength];
  60. //从输出流中读取数据,读到缓冲区中
  61. NSInteger bytesRead = [inputStream read: readBuffer
  62. maxLength:maxLength];
  63. //如果长度大于0就追加数据
  64. if (bytesRead > 0)
  65. {
  66. //把缓冲区中的数据读成data数据
  67. NSData *bufferData = [[NSData alloc]
  68. initWithBytesNoCopy:readBuffer
  69. length:bytesRead
  70. freeWhenDone:NO];
  71. //追加数据
  72. [self appendData:bufferData];
  73. //release掉data
  74. [bufferData release];
  75. }
  76. break;
  77. }
  78. case NSStreamEventErrorOccurred:
  79. {
  80. //读的时候出错了
  81. NSError *error = [theStream streamError];
  82. if (error != NULL)
  83. {
  84. UIAlertView *errorAlert = [[UIAlertView alloc]
  85. initWithTitle: [error localizedDescription]
  86. message: [error localizedFailureReason]
  87. delegate:nil
  88. cancelButtonTitle:@"OK"
  89. otherButtonTitles:nil];
  90. [errorAlert show];
  91. [errorAlert release];
  92. }
  93. shouldClose = YES;
  94. break;
  95. }
  96. case NSStreamEventEndEncountered:
  97. {
  98. shouldClose = YES;
  99. //数据读完就返回数据
  100. [self dataAtNoteDB];
  101. [theStream close];
  102. }break;
  103. }
  104. if (shouldClose)
  105. {
  106. //当文件读完或者是读到出错时,把线程移除
  107. [inputStream removeFromRunLoop: [NSRunLoop currentRunLoop]
  108. forMode:NSDefaultRunLoopMode];
  109. //并关闭流
  110. [theStream close];
  111. }
  112. }
  113. -(void) dataAtNoteDB{
  114. aNoteDb=nil;
  115. aNoteDb=[[NoteDb alloc]init];
  116. aNoteDb.noteList = [NSKeyedUnarchiver unarchiveObjectWithData:resultData];
  117. //NSLog(@"%@",aNoteDb);
  118. /*
  119. for (id tmp in  aNoteDb.noteList.noteArray)
  120. {
  121. NSLog(@"tmp = %@",tmp);
  122. }
  123. */
  124. }
  125. - (NoteDb*)getNoteDb{
  126. return self.aNoteDb;
  127. }
  128. -(void)dealloc{
  129. [aNoteDb release];
  130. [resultData release];
  131. [super dealloc];
  132. }
  133. @end
时间: 2024-09-29 16:45:00

【转】iphone 输入/输出流异步读写数据的相关文章

JAVA中文件的读写 I/O 输入输出流

主要内容 1.编码问题 2.File类的使用 3.RandomAccessFile的使用 4.I/O 输入输出流 编码问题: 1 import java.io.UnsupportedEncodingException; 2 3 public class 编码问题 { 4 public static void main(String[] args) { 5 // 我们项目的默认编码是GBK 6 String s = "测试 ABC"; 7 byte[] byte1 = s.getByte

字节流之数据输入输出流

数据输入输出流:让我们对基本数据类型操作更方便

JAVA文件读写输入输出流关闭问题、JAVA垃圾回收

切记: 读写文件一定要及时关闭输入输出流 项目中,用到将rtf文档上传后修改一个更新标记为0未更新,另外一个程序将文档上传到LED屏上面,LED程序检测到更新标记为未更新时将状态投到LED上面,并将状态更新为1已更新. 现象:上传文件时使用输入输出流,上传成功后LED屏不显示更新文档,为空. 部分代码: public void save(){ upload(); save(XXXXX); } public void upload() throws Exception{ //以服务器的文件保存地址

4、BufferedIn(out)putStream---&gt;字节输入/输出流的缓冲区类(高效类:高效率读写)

前言 字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区效果,java本身在设计的时候,也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流字节缓冲输出流(写数据):BufferedOutputStream字节缓冲输入流(读数据):BufferedInputStream 用法 BufferedOutputStream

DataInputStream 数据类型数据输入输出流

package IOliu; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class DataInputStreamDemo { publ

一般的输入输出流保存数据进文件

1.视图 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 an

输入输出流

1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读写数据的标准方法.任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法. Java.io是大多数面向数据流的输入/输出类的主要软件包.此外,Java也对块传输提供支持,在核心库 java.nio中采用的便是块IO. 流IO的好处是简单易用,缺点是效率较低.块IO效率很高,但编程比较

Java输入输出流

1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读写数据的标准方法.任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法. Java.io是大多数面向数据流的输入/输出类的主要软件包.此外,Java也对块传输提供支持,在核心库 java.nio中采用的便是块IO. 流IO的好处是简单易用,缺点是效率较低.块IO效率很高,但编程比较

java I/O系统(输入输出流)

java I/O系统(输入输出流) 流的特性1.含有流质(数据)2.它有方向(读或写) 流的分类: 输入流和输出流 输入流:io包中的输入流继承自抽象类InputStream或Reader 输出流:io包中的输入流继承自抽象类OutputStream或Writer 字节流和字符流 注:1字节代表1个英文单词存储的数据大小,一个汉字占两字节 1.字节流:以byte为最小单位传送,继承自抽象类InputStream或OutputStream,用于处理二进制文件,InputStream为读取字节流的父