【问题标题】:Objective C - InputStream to NSStringObjective C - InputStream 到 NSString
【发布时间】:2013-02-13 03:52:56
【问题描述】:

我是 Objective C 的新手,所以我正在尝试做一些我通常在 Java 中做的事情,比如将 InputStream 转换为 String。 基本上,我想在Objective C中做这个Java代码......

InputStream in = … //An inputStream i got from http request

BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;

while ((line = reader.readLine()) != null) {
    str.append(line);
}

String myString = str.toString();
in.close();

我希望我的问题描述得足够清楚! :)

谢谢!

【问题讨论】:

  • NSString * myString = [ NSString stringWithContentsOfURL:theURL ]
  • 谢谢!这很有帮助,但该方法已被弃用!但实际上,还有另一种与此完全相同的方法,它涉及另外两个参数。但再次感谢,这真的很有帮助!
  • 是的,对不起...然后使用其他不推荐使用的方法之一。当然,这是一个同步调用,所以如果你想要 UI 性能,你将不得不做一些更复杂的事情......就像其他人建议的那样使用 NSURLConnection

标签: ios objective-c ios5 ios6


【解决方案1】:

好吧,Caleb 是对的,但要回答这个问题:

NSInputStream *inputStream = [[NSInputStream alloc] init];
uint8_t buffer[1024];
int len;
NSMutableString *total = [[NSMutableString alloc] init];
while ([inputStream hasBytesAvailable]) {
    len = [inputStream read:buffer maxLength:sizeof(buffer)];
    if (len > 0) {
        [total appendString: [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]];
    }
}

您的 encoding 参数可能不同。

【讨论】:

  • +1 好答案。出于某种原因,我被 HTTP 位分心了。但是,您可能希望将output 附加到累积数据的NSMutableString 上——现在您正在泄漏output,并且无法使用流中的数据。
  • 这正是我需要知道的,非常感谢!真的很有帮助! :)
  • 嗯,顺便说一句,我不明白为什么这段代码会泄漏输出。你能给我解释一下吗@Caleb ...再次感谢!
  • @JoseLion 现在写的没有泄漏。最初,一个名为 output 的 NSString* 是使用来自 buffer 的字节创建的,但 output 立即超出范围,没有其他任何东西引用该变量。如果您使用 ARC(一旦不再使用该对象,它将插入 -release 调用),这并不是真正的泄漏,但如果您不使用 ARC。无论哪种方式,都无法访问if 正文之外的字符串。不过,正如现在所写的那样,这很好——新字符串附加到total
  • 啊,我明白了! :) 谢谢!
【解决方案2】:

我是 Objective C 的新手,所以我正在尝试做我通常做的事情 在 Java 中,例如将 InputStream 转换为 String。基本上,我 想在 Objective C 中做这个 Java 代码...

可以理解,但是尝试像在 Java 中那样做这些事情通常是行不通的。在 Objective-C 中做的事情并不总是像在 Java 中做的那样,所以你不能只是交换新的类名并稍微修正一下语法。有一个 NSInputStream 类,但它通常不用于从 Web 服务器下载数据。简而言之,您不会从 http 请求中获得输入流。相反,请查看NSURLConnection 类和NSURLConnectionDelegate 协议。实际上,您应该阅读完整的文档URL Loading System Programming Guide。您将创建一个NSURLConnection 实例,给它一个委托,然后让它做这件事。代理的-connection:didReceiveData: 方法将在数据进入时被调用,并且代理可以对数据做任何它想做的事情,例如将其添加到字符串中。

【讨论】:

  • 很高兴知道方法不同,顺便说一下非常有用的答案!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
相关资源
最近更新 更多