iOS NSStream 使用

  简介

  NSStream是一个基类,在Cocoa中它有两个子类NSInputStream和INOutputStream。分别对应输入和输出流。流提供了一种简单的方式在不同和介质中交换数据,这种交换方式是与设备无关的。你可以创建一个流通过NSData,File,SocketData,在处理大数据的时候,使用流就可以边读边处理。Cocoa中的流对象与Core Foundation中的流对象是对应的。我们可以通过toll-free桥接方法来进行相互转换。NSStream、NSInputStream和NSOutputStream分别对应CFStream、CFReadStream和CFWriteStream。但这两者间不是完全一样的。Core Foundation一般使用回调函数来处理数据。另外我们可以子类化NSStream、NSInputStream和NSOutputStream,来自定义一些属性和行为,而Core Foundation中的流对象则无法进行扩展。

  类和方法介绍

  • NSStream 基类
// 打开和关闭流
- (void)open;
- (void)close;
//添加和移除RunLoop
- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
- (void)removeFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
  • NSInputStream

  

//读取len长度的内容到buffer中
//返回值为读取的实际长度,所以最大为len
- (NSInteger)read:(uint8_t *)buffer maxLength:(NSUInteger)len;
//读取当前流数据以及大小,注意buffer只在下一个流之前有效
- (BOOL)getBuffer:(uint8_t * __nullable * __nonnull)buffer length:(NSUInteger *)len;
  • NSOutputStream
//把buffer中的数据写入流
//返回值实际写入的大小
- (NSInteger)write:(const uint8_t *)buffer maxLength:(NSUInteger)len;

  例子

  大文件处理,TP

//初始化inputStream
- (void)readStream:(NSString *)filePath
{
    NSInputStream *inputStream = [[NSInputStream alloc] initWithFileAtPath:filePath];
    inputStream.delegate = self;
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
}
//初始化outputStream
- (void)writeStream:(NSString *)filePath
{
    NSOutputStream *writeStream = [[NSOutputStream alloc] initToFileAtPath:filePath append:YES];
    [writeStream setDelegate:self];

    [writeStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
    [writeStream open];
}
//代理方法处理
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
    switch (eventCode)
    {
        case NSStreamEventHasBytesAvailable:
        {
            //读取
            uint8_t buf[2048];
            NSInteger len = 0;
            len = [(NSInputStream *)aStream read:buf maxLength:2048];  // 读取数据
            if (len) {
                [data appendBytes:buf length:len];
            }
        }
        break;
        case NSStreamEventEndEncountered:
        {
            [aStream close];
        }
        break;
        case NSStreamEventHasSpaceAvailable:
        {
            //写入
            NSInteger bufSize = 2048;
            uint8_t buf[bufSize];
            [data getBytes:buf length:bufSize];
            NSOutputStream *writeStream = (NSOutputStream *)aStream;
            NSInteger len = [writeStream write:buf maxLength:sizeof(buf)];
            [data setLength:0];
            self.location += len;
            if (self.location>self.fileSize) {
                [aStream close];
            }
        }
        break;
        default:
        break;
    }
}

  mac快速生成大文件Python脚本。

import os

for i in range(0,200):
    print i
    os.system("cat /usr/share/dict/words >>~/mkfile.test.txt")
print "make file over !"
时间: 2024-10-15 10:16:22

iOS NSStream 使用的相关文章

iOS网络编程实践--NSStream实现TCP Socket iPhone客户端

客户端我们使用iPhone应用程序,画面比较简单.点击发送按钮,给服务器发送一些字符串过去.点击接收按钮就会从服务器读取一些字符串,并且显示在画面上. 有关客户端应用的UI部分不再介绍了,我们直接看代码部分,Socket客户端可以采用CFStream或NSStream实现,CFStream 实现方式与服务器端基本一样.为了给读者介绍更多的知识,本例我们采用NSStream实现.NSStream实现采用Objective-C语言,一些 面向对象的类. 下面我们看看客户端视图控制器ViewContr

iOS -- 原生NSStream实现socket

- (void)startSocket:(NSString *)address andPort:(int)port { CFReadStreamRef readRef; CFWriteStreamRef writeRef; CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)address, port, &readRef, &writeRef); _inputStream = (__bridge NSInputStr

【转】iOS中流(Stream)的使用

转自:http://southpeak.github.io/blog/2014/07/17/ioszhong-liu-stream-de-shi-yong/ 流提供了一种简单的方式在不同和介质中交换数据,这种交换方式是与设备无关的.流是在通信路径中串行传输的连续的比特位序列.从编码的角度来看,流是单向的,因此流可以是输入流或输出流.除了基于文件的流外,其它形式的流都是不可查找的,这些流的数据一旦消耗完后,就无法从流对象中再次获取. 在Cocoa中包含三个与流相关的类:NSStream.NSInp

iOS网络编程模型

http://www.cnblogs.com/ydhliphonedev/p/3240772.html Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServices OS层:基于 C 的 BSD socket Cocoa层:是最上层的基于 Objective-C 的 API,比如 URL访问,NSStream,Bonjour,GameKit等,这是大多数情况下我们常用的 API.Coc

分享一下自己ios开发笔记

// ********************** 判断数组元素是否为空 ********************** NSString *element = [array objectAtIndex:2]; if ((NSNull *)element == [NSNull null]) { } 今天做项目的时候就遇到,要判断数组元素是否为空,我的以下写法,都无效 if(!element) if([element length]>0) if(element== NULL) if(element

iOS网络编程笔记——Socket编程

一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是TCP/IP协议的一个十分流行的编程接口.一个socket由一个IP地址和一个端口号唯一确定.TCP/IP协议的传输层又有两种协议:TCP(传输控制协议)和UDP(用户数据报协议).TCP是基于连接的,而UDP是无连接的:TCP对系统资源的要求较多,而UDP少:TCP保证数据的正确性而UDP可能丢包:

iOS Foundation 框架 224 篇相关文档分类整理

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 截至 2014-05-02 ,苹果官网 Foundation 框架相关文档共计 224 篇,分类如下: Foundation 框架概述文档:常量.

iOS后台运行机制简解

1.iOS其实是伪后台 为什么说iOS是伪后台?首先需要了解一下iOS中的后台进程到底是怎么回事.iOS中所谓的“后台驻留”并不是指执行中的程序,而是指最近使用过的程序.当我们是一个进程进入到后台的时候,可以想象成是Command+Tab键盘. 一般来说,当把一个app退到后台的时候都会有5s的时间执行缓冲,有些程序可以要求达到10分钟(这个是需要开发人员来决定的),因此在按下Home键之后,本来的程序就会退到后台中去,最多10分钟之后还是会被终止的,这当然和苹果的后台管理机制有关.   2.i

iOS socket Stream 服务器端 及 客户端 演示

iOS socket Stream 测试环境,mac osx 10.8 一:建立服务器端 由于mac osx10.8 已经集成 python2和 Twisted,我们可以直接利用此,构建一个简单的socket 服务器 如下测试一个简单的聊天 socket 并,定义,加入聊天时发送:iam:用户名 发送信息时:msg:信息 终端:vim server.py  回车,copy入如下代码 from twisted.internet.protocol import Factory, Protocol f