当我查看NSFileHandle API文档时,我看到有很多网络方法在讨论套接字和类似的东西......
在顶部,他们说:
NSFileHandle对象提供了一个面向对象的包装器,用于访问打开的文件或通信通道.
什么是"沟通渠道"?是否有一些实际的例子可以解释为那些不是网络忍者的人?
我有一种情况,我通过Web服务请求收到字节数据,并希望将其写入我的iOS设备上的文件.我曾经将所有数据(直到数据结尾)附加到内存变量中,最后NSStream使用以下方法将数据写入iOS设备中的文件:
stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
Run Code Online (Sandbox Code Playgroud)
它适用于小型数据,但问题是,如果我通过Web服务接收数据,它可能是一个很大的块(几个MB),我不想收集所有内存写入文件,到让它高效我想我必须多次切换到NSFileHandle将一小块大小的数据写入同一个文件.现在我的问题是这样做的最佳方法是什么?我的意思是如何在BACKGROUND中写入文件NSFileHandle?我使用这样的代码:
- (void) setUpAsynchronousContentSave:(NSData *) data {
NSString *newFilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"/Documents/MyFile.xml"];
if(![[NSFileManager defaultManager] fileExistsAtPath:newFilePath ]) {
[[NSFileManager defaultManager] createFileAtPath:newFilePath contents:nil attributes:nil];
}
if(!fileHandle_writer) {
fileHandle_writer = [NSFileHandle fileHandleForWritingAtPath:newFilePath];
}
[fileHandle_writer seekToEndOfFile];
[fileHandle_writer writeData:data];
Run Code Online (Sandbox Code Playgroud)
}
但是通过将1-2 Mb的数据大小传递给上面的方法,我是否需要让它在后台运行?仅供参考我在主线上写作.
在您的设备上以编程方式创建file.txt的最简单方法是什么,然后在您的应用程序中写下一些数据然后将这些数据发送到您的计算机?
我想最后一部分可以通过编程方式完成,就像使用计算机上的某些程序从设备获取数据一样.
直到现在我正在做这样的事情
NSFileHandle *infile;
NSFileManager *fm;
fm=[NSFileManager defaultManager];
NSString *strings=[@"/Downloads/file.txt" stringByExpandingTildeInPath];
if (![fm fileExistsAtPath:strings]) {
[fm createFileAtPath:strings contents:nil attributes:nil];
infile=[NSFileHandle fileHandleForWritingAtPath:strings];
[infile writeData:[[NSString stringWithFormat:@"lalala japierdole\n", [NSDate date]] dataUsingEncoding:NSUTF8StringEncoding]];
}else {
infile=[NSFileHandle fileHandleForWritingAtPath:strings];
[infile seekToEndOfFile];
}
[infile writeData:[[NSString stringWithFormat:@"lulukukuioio.\n", [NSDate date]] dataUsingEncoding:NSUTF8StringEncoding]];
Run Code Online (Sandbox Code Playgroud)
这只是创建文件,如果它不存在并写下一些数据,但我有路径问题.当我在我的设备上尝试使用我的模拟器时,此代码工作正常然后我真的不知道我是否甚至创建文件以及如何从以后接收它.
我正在尝试使用Pipe's fileHandleForReading' readabilityHandler来读取a standardOutput和standardErrora Process.然而,terminationHandler被调用的那一刻实际上是在我readabilityHandler第一次被召唤的那一刻之前.
我不确定为什么这个过程会这样做,但这意味着我没有获得所有数据,因为我假设进程终止意味着所有输出都被刷新到管道.既然不是这样,有没有办法告诉我什么时候没有更多的输出要读?我假设涉及检查a FileHandle是否仍处于打开状态,但我没有看到API.
以下是我的代码的基本概念示例:
let stdOutPipe = Pipe()
let stdErrPipe = Pipe()
stdOutPipe.fileHandleForReading.readabilityHandler = { stdOutFileHandle in
let stdOutPartialData = stdOutFileHandle.readDataToEndOfFile()
guard !stdOutPartialData.isEmpty else {
print("Time to read, but nothing to be read?") // happens a lot
return
}
self.tempStdOutStorage.append(stdOutPartialData)
}
stdErrPipe.fileHandleForReading.readabilityHandler = { stdErrFileHandle in
let stdErrPartialData = stdErrFileHandle.readDataToEndOfFile()
guard !stdErrPartialData.isEmpty else {
print("Time to read, …Run Code Online (Sandbox Code Playgroud) 我正在研究Apple 的低级文件管理编程主题.在NSFileHandle部分,他们说:
NSFileHandle的范围不仅限于文件.它提供了唯一可以读取和写入通信通道的Foundation对象,例如由套接字,管道和设备实现的通信通道.
这听起来很不错!所以我可以通过NSFileManager与一个套接字进行通信,然后套接字将这些数据传输到一个网络服务器,我直接在一个文件中通过远程传输?
有人可以给出一些易于理解的例子,我可以用它来做什么,
注意:我对套接字,管道,设备一无所知.我相信它们并不代表iPhone本身.我不熟悉网络事物.但我想学习那些东西!! 也许你也可以简单解释这些东西是什么?
对我来说,这听起来像是同一件事。更新文件意味着写入文件。写入文件对我来说也是一种更新。但我想有一个微妙的区别;-)
有人知道吗?
我想在iOS中阅读资产库文件的内容
NSFileHandle fileHandleForReadingFromUrl使用资产defaultRepresentation网址似乎总是返回0x0...
我会一直在寻找解决方案.
编辑:
看起来Anomie的答案 可能就是我想要的:
NSUInteger length = [representation getBytes:bytes fromOffset:0 length:[representation size] error:&error];
我正在尝试阅读包含数十亿字符的文本文件.使用该功能
contentOfFile不起作用,因为我的应用程序因此而崩溃.
所以任何人都可以给我发送示例代码,以便根据我的要求获得大块.无论我需要什么,我只想获得那个.请尽可能尽快回复.
我正在通过Cocoa中的NSFileHandle从控制台应用程序读取管道输出.如何刷新与该文件句柄关联的流.如果我可以从NSFileHandle获取FILE*对象,我可以调用fflush().有没有解决的办法?
使用URLConnection我从URL下载文件并将该数据存储到文档目录中的文件.当我收到响应时,当调用didReceiveResponse:方法时,我创建文件并以这种方式移动到该文件的末尾:
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:self.fileName];
NSLog(@"filepath is %@",filePath);
[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
file = [[NSFileHandle fileHandleForUpdatingAtPath:filePath] retain];
[file seekToEndOfFile];
Run Code Online (Sandbox Code Playgroud)
其中File是NSFileHandle类的对象.稍后在接收数据时,每当调用didReceiveData:(NSData*)数据方法时,我都会以这种方式将接收到的数据存储到文件中:
[file seekToEndOfFile];
[file writeData:data];
Run Code Online (Sandbox Code Playgroud)
最后,我以这种方式关闭connectionDidFinishLoading:方法中的文件:
[file closeFile];
Run Code Online (Sandbox Code Playgroud)
当我在我的系统中构建和运行时,它正在工作.但是当我复制到另一个系统并尝试构建时,我收到此错误:
Terminating app due to uncaught exception `'NSFileHandleOperationException'`, reason: '*** `-[NSConcreteFileHandle seekToEndOfFile]: No such file or directory'`
Run Code Online (Sandbox Code Playgroud)
我指的是http://www.techotopia.com/index.php/Working_with_Directories_on_iPhone_OS和 什么是NSSearchPathForDirectoriesInDomains?了解NSSearchPathForDirectoriesInDomain函数,但我仍然不清楚.
将UserDomainMask根据项目所在的系统和用户返回正确的路径.如果是这样,为什么我会收到这样的错
他们说返回的路径(存储在filepath中)将是路径/ Users // Library/Application Support/iPhone Simulator/User/Application // Documents where
是当前登录到运行模拟器的Mac OS X系统的用户的名称,是该应用程序的唯一ID
任何人都可以帮助我,理解为什么我会收到这样的错误.